2016-02-15 68 views
1

我試圖複製本文:Global motion estimation from coarsely sampled motion vector field and the applications如何使用scipy查找優化函數的參數?

我需要找到給定一個圖像x1_1和x1_2參數m0, m1, m2....., m7 以及其中方程

Example data.

enter image description here

在哪裏x'{x1_2 [1,:,]}和y'{x1_2 [0,:,:]}是x1_2和 x的值,y x1_1是x1_1的相同樣式。

我已經參照this post中的示例進行此實現。

任何人都可以幫助我如何找到這些參數?

根據評論和example of leastsq function進行編輯。

更改的程序在下面給出以下

import os 
import sys 
import numpy as np 
import scipy 
from scipy.optimize import leastsq 


def peval (inp_mat,p): 
    m0,m1,m2,m3,m4,m5,m6,m7 = p 
    out_mat = np.zeros(inp_mat.shape,dtype=np.float32) 
    mid = inp_mat.shape[0]/2 
    for xy in range(0,inp_mat.shape[0]): 
     if (xy<(inp_mat.shape[0]/2)): 
      out_mat[xy] = (( (inp_mat[xy+mid]*m0)+(inp_mat[xy]*m1)+ m2) /((inp_mat[xy+mid]*m6)+(inp_mat[xy]*m7)+1)) 
     else: 
      out_mat[xy] = (( (inp_mat[xy]*m3)+(inp_mat[xy-mid]*m4)+ m5) /((inp_mat[xy]*m6)+(inp_mat[xy-mid]*m7)+1)) 
    return out_mat 

def residuals(p, out_mat, inp_mat): 
    m0,m1,m2,m3,m4,m5,m6,m7 = p 
    err=np.zeros(inp_mat.shape,dtype=np.float32) 
    if (out_mat.shape == inp_mat.shape): 
     for xy in range(0,inp_mat.shape[0]): 
      err[xy] = err[xy]+ (out_mat[xy] -inp_mat[xy]) 
     return err 




f = open('/media/anilil/Data/Datasets/repo/txt_op/vid.txt','r') 
x = np.loadtxt(f,dtype=np.int16,comments='#',delimiter='\t') 
nof = x.shape[0]/72 # Find the number of frames 
x1 = x.reshape(-1,60,40) 
x1_1= x1[0,:,:].flatten() 
x1_2= x1[1,:,:].flatten() 

x= [] 
y= [] 

for xy in range(1,50,1): 
    y.append(x1[xy,:,:].flatten()) 
    x.append(x1[xy-1,:,:].flatten()) 

x=np.array(x,dtype=np.float32) 
y=np.array(y,dtype=np.float32) 
length = x1_1.shape#initail guess 
p0 = np.array([1,1,1,1,1,1,1,1],dtype=np.float32) 

abc=leastsq(residuals, p0,args=(y,x)) 
print ('Size of first matrix is '+str(x1_1.shape)) 
print ('Size of first matrix is '+str(x1_2.shape)) 

print ("Done with program") 

輸出
ValueError: object too deep for desired array 
Traceback (most recent call last): 
    File "/media/anilil/Data/charm/mv_clean/.idea/nose_reduction_mpeg.py", line 49, in <module> 
    abc=leastsq(residuals, p0,args=(y,x)) 
    File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 378, in leastsq 
    gtol, maxfev, epsfcn, factor, diag) 
minpack.error: Result from function call is not a proper array of floats. 
+0

你能分享你使用的數據嗎? – Cleb

+1

'opt.leastsq'接受一個函數句柄,但是在傳遞給'leastsq'之前調用'function()'。刪除'()'爲了傳遞函數本身,而不先調用它:'opt.leastsq(function,args =(),Dfun = ...'這應該會讓錯誤信息消失,但我不會'不知道其他東西是否正確 – kazemakase

+0

共享示例數據並嘗試使用'function'而不是'function()' @kazemakase –

回答

0

檢查出documentation of leastsqthe example輸出中給出。

你需要這樣,它需要所有的參數作爲第一個參數,其次是其他投入來定義目標函數:

def function (M, inp_mat): 
    m0, m1, m2, m3, m4, m5, m6, m7 = M 
    out_mat = np.zeros(inp_mat.shape) 
    ... 

其他參數,你的情況inp_mat,爲args傳遞給優化功能:

result = opt.leastsq(function, x0, args=(inp_mat), Dfun=None, full_output=0, col_deriv=0, ftol=1.49012e-08, xtol=1.49012e-08, gtol=0.0, maxfev=0, epsfcn=None, factor=100, diag=None) 

我不知道inp_mat應該是什麼。很可能它與數據有關,所以args=(x1)可能就是你想要的。

最後,您想從優化中檢索結果並對它們進行處理。

+0

我根據示例做了一些更改,但似乎仍然存在錯誤。 –

相關問題