MOSSE
文章:
MOSSE: David S. Bolme, J. Ross Beveridge, Bruce A. Draper, Yui Man Lui. “Visual Object Tracking using Adaptive Correlation Filters.”
https://github.com/xingqing45678/Mosse_CF(代码和文章都在里面)
**核心:**两个信号越相似,器相关值越高,在跟踪中,就是找到与跟踪目标响应最大的项。
一、对2D相关的理解
注意:相关是相关,卷积是卷积,不要混为一谈
1.1 相关操作
图像的相关公式: g = f ⊗ h g=f\otimes h g=f⊗h,其中 h h h称之为相关核(Kernel)具体到每一个像素表示为:
g
(
i
,
j
)
=
∑
k
,
l
f
(
i
+
k
,
j
+
l
)
h
(
k
,
l
)
g(i,j)=\underset{k,l}{\sum}f(i+k,j+l)h(k,l)
g(i,j)=k,l∑f(i+k,j+l)h(k,l)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zxcWsHBD-1608946582277)(MOSSE.assets/image-20201220144105838.png)]
步骤:
(1)滑动核,使其中心位于输入图像的像素上
(2)利用上式求和,得到输出图像的像素值
(3) 充分上面操纵,直到求出输出图像的所有像素值
例:计算输出图像
g
(
3
,
3
)
g(3,3)
g(3,3)像素值为
g
(
3
,
3
)
=
(
−
1
)
×
7
+
(
−
2
)
×
3
+
(
−
1
)
×
2
+
0
×
3
+
0
×
5
+
0
×
1
+
1
×
4
+
2
×
3
+
1
×
7
=
2
g(3,3)=(-1)\times7+(-2)\times3+(-1)\times2+0\times3+0\times5+0\times1+1\times4+2\times3+1\times7=2
g(3,3)=(−1)×7+(−2)×3+(−1)×2+0×3+0×5+0×1+1×4+2×3+1×7=2
1.2 卷积操作
图像的卷积公式:
g
=
f
∗
h
g=f*h
g=f∗h,其中
h
h
h成为卷积核(Kernel),具体到每一个像素为:
KaTeX parse error: Got function '\sum' with no arguments as argument to '\underset' at position 23: …=\underset{k,l}\̲s̲u̲m̲{f(i-k,j-l)h(k,…
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tqKSDOL9-1608946582279)(MOSSE.assets/image-20201220151804997.png)]
步骤:
(1)将卷积核围绕中心旋转180度
(2)滑动核,使其中心位于输入图像的像素上
(3)利用上式求和,得到输出图像的像素值
(4)充分上面操纵,直到求出输出图像的所有像素值
例:计算输出图像
g
(
3
,
3
)
g(3,3)
g(3,3)像素值为
g
(
3
,
3
)
=
1
×
7
+
2
×
3
+
1
×
2
+
0
×
3
+
0
×
5
+
0
×
1
+
(
−
1
)
×
4
+
(
−
2
)
×
3
+
(
−
1
)
×
7
=
−
2
g(3,3)=1\times7+2\times3+1\times2+0\times3+0\times5+0\times1+(-1)\times4+(-2)\times3+(-1)\times7=-2
g(3,3)=1×7+2×3+1×2+0×3+0×5+0×1+(−1)×4+(−2)×3+(−1)×7=−2
3、差异:
(1)引用专业术语就是:Two-dimensional correlation is equivalent to two-dimensional convolution with the filter matrix rotated 180 degrees.
白话:卷积将核旋转了180度。
(2)物理意义:相关可以反应两个信号相似程度,卷积不可以。
(3)卷积满足交换律, f ∗ h = h ∗ f f*h=h*f f∗h=h∗f,相关不可以。
(4)卷积可以直接通过卷积定理(时域上的卷积等于频域上的乘积)来加速运算,相关不可以
二、对相关滤波器的理解
相关滤波跟踪器就是通过互相关(cross-correlation)来定位目标当前帧所在位置的。响应图 g g g的最大值对应的位置即为当前时刻预测的目标位置,具体流程如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lePaCVH4-1608946582281)(MOSSE.assets/image-20201220212359232)]
如果我们在时域内求解响应图,运算量巨大,那么如何利用卷积定理将其转换到频域???
用卷积来表示相关就是:
f
(
n
)
⊗
h
(
n
)
=
f
(
n
)
∗
h
(
−
n
)
f(n)\otimes h(n)=f(n)*h(-n)
f(n)⊗h(n)=f(n)∗h(−n)
利用卷积定理转换到频域为:
F
(
g
)
=
F
(
f
⊗
g
)
=
F
(
f
)
⊙
F
(
h
)
∗
F(g)=F(f\otimes g)=F(f)\odot F(h)^*
F(g)=F(f⊗g)=F(f)⊙F(h)∗
简写为:
G
=
F
⊙
H
∗
G=F\odot H^*
G=F⊙H∗
其中,
F
(
h
(
−
n
)
)
=
H
∗
F(h(-n))=H^*
F(h(−n))=H∗,
⊙
\odot
⊙表示点乘。所以将我们的输入图像和滤波器通过算法变换到频域后,直接将他们相乘,然后再变换回时域(也就是图像的空域)就可以得到响应图。
几点重要的解释:
- 输入的图像是指目标检测区域(MOSSE的检测区域就是目标所在区域),可能是像素值也可能是提取的特征(eg.Hog,CN,DeepFeatures等)
- 滤波器(或者叫目标模板)的大小和检测区域的大小一样,因为相同大小的矩阵在频率域才可以点乘计算。
- 当滤波器稍微偏移就会超出输入图像的范围,则需要填充数据(这就是卷积的边界效应)。然而在实际的相关滤波跟踪算法中,因为代码中直接就写频域的计算公式,所以我们不知道是怎样填充边界的。(常用的三种填充方式:补零、补边界像素和循环图像,matlab中FFT默认的是第三种)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4vObyOSm-1608946582282)(MOSSE.assets/image-20201220204231419.png)]
三、对MOSSE的理解
经过上面的解释,理解相关滤波的检测原理,相应图峰值的位置即为当前帧目标的预测位置。
为了得到相应图,那么我们求出滤波器模板频域的表示值即可:
H
∗
=
G
F
H^*=\frac{G}{F}
H∗=FG
3.1 预处理(不重要,一般都会进行这些操作)
- FFT卷积算法需要将图像和滤波器映射到拓扑结构上,边界采用循环图像的方式填充,即将图像的左边缘链接到右侧边缘,将底部连接到底部。
- 周期卷积会对输入数据进行周期填补,引入一些artifacts。作者通过如下论文中的方法减弱对输出响应的影响。
- 采用点乘余弦窗处理,使图像边缘慢慢变为零。
3.2 MOSSE滤波
提高算法的鲁棒性,作者对视频第一帧的跟踪窗口施加随机的仿射扰动,产生多组图像对滤波器进行初始化:
H
i
∗
=
G
i
F
i
H^*_i=\frac{G_i}{F_i}
Hi∗=FiGi
注意上式是元素点除,作者通过最小二乘法来求解:
m
i
n
H
∗
∑
i
∣
F
i
⊙
H
∗
−
G
i
∣
2
\underset{H^*}{min}\underset{i}{\sum}|F_i\odot H^*-G_i|^2
H∗mini∑∣Fi⊙H∗−Gi∣2
求解,可得MOSSE滤波器的一个封闭解:
H
∗
=
∑
i
G
i
⊙
F
i
∗
∑
i
F
i
⊙
F
i
∗
H^*=\frac{\sum_i G_i\odot F^*_i}{\sum_iF_i\odot F^*_i}
H∗=∑iFi⊙Fi∗∑iGi⊙Fi∗
最后更新MOSSE滤波器如下:
H
i
∗
=
A
i
B
i
H^*_i=\frac{A_i}{B_i}
Hi∗=BiAi
A i = η G i ⊙ F i ∗ + ( 1 − η ) A i − 1 A_i=\eta G_i\odot F^*_i+(1-\eta)A_{i-1} Ai=ηGi⊙Fi∗+(1−η)Ai−1
B i = η F i ⊙ F i ∗ + B i − 1 B_i=\eta F_i\odot F^*_i+B_{i-1} Bi=ηFi⊙Fi∗+Bi−1
四、MOSSE推导
4.1 概念
相关:
f
∗
g
f*g
f∗g
(
f
⊗
g
)
(
τ
)
=
∫
∞
−
∞
f
∗
(
t
)
g
(
t
+
τ
)
d
t
(f\otimes g)(\tau)=\int ^{- \infty}_{\infty}f^*(t)g(t+\tau)dt
(f⊗g)(τ)=∫∞−∞f∗(t)g(t+τ)dt
其中
f
∗
f^*
f∗表示
f
f
f的复共轭,correlation的直观解释就是衡量两个函数在某个时刻
τ
\tau
τ的相似程度,如下图所示。考虑一个最简单的例子,假设
f
f
f和
g
g
g的形状一样,但是相差了若干个时刻,那么
f
∗
g
f*g
f∗g取得最大值的时候一定是
f
f
f和
g
g
g对齐的时候(没谁比自己和自己更像了吧…),但因为两者有时间差,所以要取得最大值,就要把其中一个在时间轴上进行平移,所以
g
(
t
+
τ
)
g(t+\tau)
g(t+τ)就代表把
g
g
g平移
τ
τ
τ个时刻。其实Convolution和Cross-correlation在图像处理的书里一般都会提到,这里就不多叙述了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s2T2D99D-1608946582283)(MOSSE.assets/image-20201220212339382.png)]
而Correlation Filter应用于tracking方面最朴素的想法就是:相关是衡量两个信号相似值的度量,如果两个信号越相似,那么其相关值就越高,而在tracking的应用里,就是需要设计一个滤波模板,使得当它作用在跟踪目标上时,得到的响应最大,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jvp00luQ-1608946582284)(MOSSE.assets/image-20201220212359232.png)]
4.2 推导过程
g
=
h
∗
f
g=h*f
g=h∗f
其中
g
g
g表示相应输出,
f
f
f表示输入图像,
h
h
h表示我们的滤波的滤波模板。
g g g可以为任意形状的响应输出,在上面的示意图中我们假设它为Gaussian形状。
函数互相关的傅里叶变换=函数傅里叶变换的乘积
F
h
∗
f
=
(
F
h
)
∗
⊙
F
f
Fh*f=(Fh)^*\odot Ff
Fh∗f=(Fh)∗⊙Ff
其中
F
F
F表示傅里叶变换,
⊙
\odot
⊙表示点乘。那么假设
f
f
f所含的像素个数为
n
n
n,而已知FFT的时间开销为
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn),因此式(3)的计算开销也为
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)!远比其他跟踪算法要快!明白这一点后,本篇论文的精华你已经掌握了。剩下的就是如何计算
h
h
h了,为了表达的方便起见,我们设
F
f
=
F
Ff=F
Ff=F,
(
F
h
)
∗
=
H
∗
(Fh)^∗=H^∗
(Fh)∗=H∗,
F
g
=
G
Fg=G
Fg=G,那么我们就有
H
∗
=
G
F
H^*=\frac{G}{F}
H∗=FG
但是在实际应用中,因为目标的外观变换等因素影响,我们需要同时考虑目标的
m
m
m个图像作为参考,以提高模型的鲁棒性,那么就有下式的目标函数了:
m
i
n
H
∗
∑
i
=
1
m
∣
H
∗
F
i
−
G
i
∣
2
min_{H^*}\sum_{i=1}^{m}{|H^*F_i-G_i|^2}
minH∗i=1∑m∣H∗Fi−Gi∣2
求解式(19)并不困难,而且根据卷积定理,在频率域的操作都是元素级别的,因此我们可以分别求解
H
∗
H^∗
H∗中的每一个元素
H
w
,
v
∗
H_{w,v}^∗
Hw,v∗,那么(19)就可以变为:
m
i
n
H
w
,
v
∗
∑
i
=
1
m
∣
H
w
,
v
∗
F
w
,
v
,
i
−
G
w
,
v
,
i
∣
2
min_{H_{w,v}^∗}\sum_{i=1}^{m}{|H_{w,v}^∗ F_{w,v,i}-G_{w,v,i}|^2}
minHw,v∗i=1∑m∣Hw,v∗Fw,v,i−Gw,v,i∣2
然后对式(20)求导并使其为0求解,但要注意的是,论文中特别指出在复数域的求导与在实数域的有一点区别:
⇒
∂
∂
H
w
,
v
∗
∑
i
=
1
m
(
H
w
,
v
∗
F
w
,
v
,
i
−
G
w
,
v
,
i
)
(
H
w
,
v
∗
F
w
,
v
,
i
−
G
w
,
v
,
i
)
∗
=
0
\Rightarrow \frac{\partial}{\partial H_{w,v}^∗}\sum^m_{i=1}(H_{w,v}^∗ F_{w,v,i}-G_{w,v,i})(H_{w,v}^∗ F_{w,v,i}-G_{w,v,i})^*=0
⇒∂Hw,v∗∂i=1∑m(Hw,v∗Fw,v,i−Gw,v,i)(Hw,v∗Fw,v,i−Gw,v,i)∗=0
⇒ ∂ ∂ H w , v ∗ ∑ i = 1 m ( H w , v ∗ F w , v , i H w , v F w , v , i ∗ − H w , v ∗ F w , v , i G w , v , i ∗ − H w , v F w , v , i ∗ G w , v , i + G w , v , i G w , v , i ∗ ) = 0 \Rightarrow \frac{\partial}{\partial H_{w,v}^∗}\sum^m_{i=1}(H_{w,v}^∗ F_{w,v,i}H_{w,v} F_{w,v,i}^∗-H_{w,v}^∗ F_{w,v,i}G_{w,v,i}^∗-H_{w,v}F_{w,v,i}^∗G_{w,v,i}+G_{w,v,i}G_{w,v,i}^∗)=0 ⇒∂Hw,v∗∂i=1∑m(Hw,v∗Fw,v,iHw,vFw,v,i∗−Hw,v∗Fw,v,iGw,v,i∗−Hw,vFw,v,i∗Gw,v,i+Gw,v,iGw,v,i∗)=0
⇒ ∑ i = 1 m F w , v , i H w , v F w , v , i ∗ − F w , v , i G w , v , i ∗ = 0 \Rightarrow \sum^m_{i=1}F_{w,v,i}H_{w,v}F_{w,v,i}^∗-F_{w,v,i}G_{w,v,i}^∗ =0 ⇒i=1∑mFw,v,iHw,vFw,v,i∗−Fw,v,iGw,v,i∗=0
⇒ H w , v = ∑ i = 1 m F w , v , i G w , v , i ∗ ∑ i = 1 m F w , v , i F w , v , i ∗ \Rightarrow {H_{w,v}}{\rm{ = }}\frac{{\sum\limits_{i = 1}^m {{F_{w,v,i}}G_{w,v,i}^{\rm{*}}} }}{{\sum\limits_{i = 1}^m {{F_{w,v,i}}F_{w,v,i}^{\rm{*}}} }} \qquad ⇒Hw,v=i=1∑mFw,v,iFw,v,i∗i=1∑mFw,v,iGw,v,i∗
按以上方式处理所有
H
H
H中的所有元素,得到
H
=
∑
i
=
1
m
F
i
⊙
G
i
∗
∑
i
=
1
m
F
i
⊙
F
i
∗
H=\frac{\sum_{i=1}^m F_i \odot G_i^*}{\sum_{i=1}^m F_i \odot F_i^*}
H=∑i=1mFi⊙Fi∗∑i=1mFi⊙Gi∗
就可以开始跟踪了。在跟踪的过程中,我们只需要把以上模板与当前帧的图像作相关操作,将得到的响应结果中最大的那点对应坐标作为目标在当前帧位置就可以了(相当于在2维上平移我们的模板)。然后,模板的更新方式可以按照如下的方式进行:
H
t
=
(
1
−
η
)
H
t
−
1
+
η
H
(
t
)
H_t=(1-\eta)H_{t-1}+\eta H(t)
Ht=(1−η)Ht−1+ηH(t)
H
(
t
)
H(t)
H(t)表示在第
t
t
t帧求得的滤波模板,
η
\eta
η为一经验常数。
本文的内容大体就这样了,剩下的就是在(25)上面进行一些修改,比如在分母里引进一个 ϵ \epsilon ϵ作为正则化的参数,或者分别求 H i H_i Hi然后作平均等,都是一些小的技巧。总得来说,MOSSE方法开创了CF在tracking方面的先河。
五、代码分析
%产生高斯形状的理想响应
F_response=templateGauss(target_sz,im);
%目标框区域和滤波器卷积得到响应值
newPoint=real(ifft2(F_Template.*fft2(target_box)));
%其中响应值最大值对应的坐标即为新目标的位置
[row, col,~] = find(newPoint ==max(newPoint(:)), 1);
%以新目标为中心选择目标框
F_im=fft2(getsubbox(pos,target_sz,im));
%求解滤波器模板
F_Template=conj(F_im.*conj(F_response)./(F_im.*conj(F_im)+eps));
im.*conj(F_im)+eps));