MOSSE算法(Minimum Output Sum of Squared Error)是相关滤波用于目标跟踪的鼻祖,可以说是目标跟踪入门学习的第一步。由于作者没有给出C代码,所以网上的C代码五花八门,本文参考博客,对其写的C代码进行编译,并推导MOSSE跟踪的相关公式,及对MOSSE跟踪流程进行介绍。
操作平台:Ubuntu14.04
推荐C++源码:https://github.com/mint-deeplearning/mosse_tracker
论文及推荐Matlab源码(本文不做介绍):https://github.com/xingqing45678/Mosse_CF
一、代码运行
代码相当简洁,令人舒适,在Linux底下,直接输入sudo cmake .
进行编译,再输入sudo make
进行编译生成可执行文件mosse,输入./mosse save.avi
(注意将需要跟踪的视频save.avi放在可执行文件的同一级目录下),在第一帧使用鼠标右键画出目标跟踪框,即可实现跟踪。
二、原理简介
2.1相关概念
相关是用来衡量两个信号相似程度的概念,两个信号越相似,相关值越大。因此,在目标跟踪的过程中,以当前帧训练一个模板(滤波器),并与下一帧进行相关运算,相关值最大的位置即下一帧目标的位置。
相关公式:
卷积公式
两者关系如下
可以发现卷积和相关在公式上相差一个负号,由于卷积定理(空域卷积在傅里叶变换下可以变成频域点乘),为简化计算量,在相关滤波中,我们常借用卷积公式来实现相关计算,但切记,两者物理意义相差巨大,只是公式相似可以相互表示。
如何简化计算?----将卷积变换到频域
简写为
其中
F
(
h
(
−
n
)
)
=
H
∗
F(h(-n))=H^{*}
F(h(−n))=H∗,
⨀
\bigodot
⨀表示点乘,*表示复共轭;由此可见,空域中复杂的相关运算变成频域中的点乘,通过反傅里叶变换便可以得到响应分布,极大提高了计算速度,降低了计算量(降为
O
(
P
l
o
g
P
)
O(PlogP)
O(PlogP),P为跟踪窗内的像素数量)。
2.2MOSSE算法跟踪流程
2.2.1预处理
预处理主要包括:
1. 引入log函数,解决低照度照明的情况;
由于自然条件复杂,光照亮暗对图像像素值有极大的影响,引入log主要是提高对比度
2. 引入余弦窗,抑制边缘效应。
由于我们产生的滤波器的大小与我们检测图像的大小一致,只要稍微偏移就会超出,因此我们进行周期卷积时会对输入数据边界进行周期填补(如下图,该图来自博客CVPR2010跟踪算法MOSSE原理及代码解析),但同时也引入一些artifacts,而加余弦窗有利于突出中心,减少边缘效应(边缘效应主要是人为对边界填充的时候带来的)
注:
FFT卷积算法的一个问题是图像和滤波器被映射到圆环的拓扑结构上。换句话说,它将图像的左边缘连接到右边缘,将顶部连接到底部。在卷积过程中,图像在环形空间中旋转,而不是像在空间域中那样平移。人为地连接图像的边界会引入一个影响相关输出的伪影。
2.2.2滤波器模板训练
首先,滤波器模板
H
∗
H^{*}
H∗与目标区域
F
F
F进行相关运算,将在目标位置处得到最大响应值,如何表示这个响应值?作者引入高斯响应
G
G
G,即理想情况下,相关运算将以目标位置为中心,形成一个高斯响应图
G
G
G。
滤波器模板
H
∗
H^{*}
H∗计算公式为:
但是滤波器模板的训练只用一张图片肯定是不够的(通俗点可以理解为不可能从一个点来求出一条曲线,需要多次采样,得到许多张训练样本,及使用多个点来确定曲线----滤波器模板),实际应用中常常在目标位置附近进行大量的随机采样,通过最小二乘法来最小化误差的平方(Minimum Output Sum of Squared Error名字的由来)来得到滤波器模板
H
∗
H^{*}
H∗。下面公式中,i对应第i张训练样本图像,每个训练样本都有对应的理想高斯输出
通过最小化滤波器与训练样本相关输出与理想高斯输出的差,得到最佳的滤波器模板
H
∗
H^{*}
H∗
推导过程
⨀
\bigodot
⨀表示点乘,在此处省略,另外
H
∗
、
F
H^{*}、F
H∗、F尺寸一样,
H
∗
F
=
F
H
∗
H^{*}F=FH^{*}
H∗F=FH∗
m
i
n
H
∗
=
∑
i
=
1
m
∣
H
∗
F
−
G
i
∣
2
min_{H^{*}}=\sum_{i=1}^{m}{|H^{*}F-G_{i}|^{2}}
minH∗=i=1∑m∣H∗F−Gi∣2
将公式写为每个像素点格式
m
i
n
H
w
v
∗
=
∑
i
=
1
m
∣
H
w
v
∗
F
w
v
i
−
G
w
v
i
∣
2
min_{{H_{wv}}^{*}}=\sum_{i=1}^{m}{|H_{wv}^{*}F_{wvi}-G_{wvi}|^{2}}
minHwv∗=i=1∑m∣Hwv∗Fwvi−Gwvi∣2
欲使求出最佳的
H
∗
H^{*}
H∗使上式子取得最小值,可以将整个式子对
H
∗
H^{*}
H∗进行求导,使偏导等于零的
H
∗
H^{*}
H∗即最佳模板。
0
=
δ
δ
H
w
v
∗
∑
i
∣
H
w
v
∗
F
w
v
i
−
G
w
v
i
∣
2
0=\frac{\delta }{\delta H_{wv}^{*}}\sum_{i}^{}{|H_{wv}^{*}F_{wvi}-G_{wvi}|^{2}}
0=δHwv∗δi∑∣Hwv∗Fwvi−Gwvi∣2
0
=
δ
δ
H
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
)
∗
0=\frac{\delta }{\delta H_{wv}^{*}}\sum_{i}^{}{(H_{wv}^{*}F_{wvi}-G_{wvi})(H_{wv}^{*}F_{wvi}-G_{wvi})^{*}}
0=δHwv∗δi∑(Hwv∗Fwvi−Gwvi)(Hwv∗Fwvi−Gwvi)∗
0
=
δ
δ
H
w
v
∗
∑
i
(
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
∗
−
G
w
v
i
(
H
w
v
∗
F
w
v
i
)
∗
+
G
w
v
i
G
w
v
i
∗
0=\frac{\delta }{\delta H_{wv}^{*}}\sum_{i}^{}{(H_{wv}^{*}F_{wvi})(H_{wv}^{*}F_{wvi})^{*}-(H_{wv}^{*}F_{wvi})G_{wvi}^{*}-G_{wvi}(H_{wv}^{*}F_{wvi})^{*}+G_{wvi}G_{wvi}^{*}}
0=δHwv∗δi∑(Hwv∗Fwvi)(Hwv∗Fwvi)∗−(Hwv∗Fwvi)Gwvi∗−Gwvi(Hwv∗Fwvi)∗+GwviGwvi∗
0
=
δ
δ
H
w
v
∗
∑
i
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
∗
−
G
w
v
i
H
w
v
F
w
v
i
∗
+
G
w
v
i
G
w
v
i
∗
0=\frac{\delta }{\delta H_{wv}^{*}}\sum_{i}^{}{H_{wv}^{*}F_{wvi}H_{wv}F_{wvi}^{*}-H_{wv}^{*}F_{wvi}G_{wvi}^{*}-G_{wvi}H_{wv}F_{wvi}^{*}+G_{wvi}G_{wvi}^{*}}
0=δHwv∗δi∑Hwv∗FwviHwvFwvi∗−Hwv∗FwviGwvi∗−GwviHwvFwvi∗+GwviGwvi∗
由于第3、4项不包含
H
w
v
∗
H_{wv}^{*}
Hwv∗,对其求导为0,故求导后:
0
=
∑
i
[
F
w
v
i
H
w
v
F
w
v
i
∗
−
F
w
v
i
G
w
v
i
∗
]
0=\sum_{i}^{}{[F_{wvi}H_{wv}F_{wvi}^{*}-F_{wvi}G_{wvi}^{*}]}
0=i∑[FwviHwvFwvi∗−FwviGwvi∗]
H
w
v
=
∑
i
=
1
F
w
v
i
G
w
v
i
∗
∑
i
F
w
v
i
F
w
v
i
∗
H_{wv}=\frac{\sum_{i=1}^{}F_{wvi}G_{wvi}^{*}}{\sum_{i}^{}{F_{wvi}F_{wvi}^{*}}}
Hwv=∑iFwviFwvi∗∑i=1FwviGwvi∗
简写为:
H
w
v
=
∑
i
F
i
G
i
∗
∑
i
F
i
F
i
∗
H_{wv}=\frac{\sum_{i}^{}F_{i}G_{i}^{*}}{\sum_{i}^{}{F_{i}F_{i}^{*}}}
Hwv=∑iFiFi∗∑iFiGi∗
2.2.3跟踪过程中滤波器模板的更新
由于目标运动过程中存在遮挡,如果每帧都以上一帧目标所在位置进行更新有可能会将模板玷污,作者引入了学习率,使之前帧对模板的影响随着时间逐渐衰减,能在一定程度上抑制遮挡带来的问题。
更新公式如下:
- η \eta η 表示学习率,学习率越大,表示之前的目标外观对滤波器模板影响越小。
- A i A_{i} Ai表示当前帧滤波器模板分子, A i − 1 A_{i-1} Ai−1表示上一帧分子,B同理。
跟踪完成!
参考博客
CVPR2010跟踪算法MOSSE原理及代码解析
相关滤波跟踪(MOSSE)
mosse跟踪算法c++实现
相关滤波跟踪·MOSSE算法的梳理