我試圖複製本文:Global motion estimation from coarsely sampled motion vector field and the applications如何使用scipy查找優化函數的參數?
我需要找到給定一個圖像x1_1和x1_2參數m0, m1, m2....., m7
以及其中方程
在哪裏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.
你能分享你使用的數據嗎? – Cleb
'opt.leastsq'接受一個函數句柄,但是在傳遞給'leastsq'之前調用'function()'。刪除'()'爲了傳遞函數本身,而不先調用它:'opt.leastsq(function,args =(),Dfun = ...'這應該會讓錯誤信息消失,但我不會'不知道其他東西是否正確 – kazemakase
共享示例數據並嘗試使用'function'而不是'function()' @kazemakase –