【目标跟踪】相关滤波算法之MOSSE

时间:2021-07-07 13:38:41

简要

2010年David S. Bolme等人在CVPR上发表了《Visual Object Tracking using Adaptive Correlation Filters》一文,首次将相关滤波器引入到目标跟踪当中。该算法大幅提高了目标跟踪的性能,论文实验结果可达到669FPS的速度。这相比同期间的跟踪算法可以算是一个极大的飞跃。本文将以该论文作为分析一类基于相关滤波的目标检测算法的引子。

基于相关滤波的跟踪

MOSSE算法的创新的在于,它是第一篇将相关滤波引入到目标跟踪的领域的论文。其思想是构造一个滤波模板 \(h\),使用该模板与图像序列帧 \(f\) (此处解释下,f指的是输入图像中框定的目标区域,也称为目标窗口,并非整个图像帧)做卷积运算,根据得到的响应输出\(g\)来确定目标在新的一帧图像中的位置
\[g=f \ast h\]
上式的符号\(\ast\)表示卷积运算。对于输入图像的2维快速傅里叶变换有\(F=\mathcal{F}(f)\),而对模板\(h\)的变换为\(H=\mathcal{F}(h)\)
根据傅里叶变换的性质,时空域\(f\)和\(h\)的卷积运算可以转换为傅里叶频域的点乘运算,有如下式子:
\[G=F\bigodot H^\ast\]
上式 \(H^\ast\) 表示为\(H\)的共轭复,\(\bigodot\)表示为点乘运算。
由此时空域的卷积运算转化为频域的点乘运算,将有助于提高运算速度,事实上后来的大部分改进算法也是基于这个性质进行的。

MOSSE滤波器

前面可知,基于相关滤波的目标跟踪算法核心是用滤波模板与图像序列做卷积运算来确定目标的位置,那么对与滤波模板的求解是算法的核心。
MOSSE全称是Minimum Output Sum of Squared Error ,算法开始需要有一组训练图像\(f{_i}\)和期望的训练输出\(g{_i}\)。\(g{_i}\)通常是以目标为中心,\(\sigma\)为方差生成的一个高斯矩阵。由此滤波模板\(H\)的计算如下:
\[H{_i^\ast} = \frac{G{_i}}{F{_i}}\]
上式是对单独一帧图像计算滤波模板的,但是在实际情况下滤波模板需要能够适应整个图像序列。MOSSE的滤波其要求对于视频序列的所有实际输出和期望输出的平方误差最小,即:
\[\underset{H^\ast}{min} \underset{i} {\sum} \begin{vmatrix} F_i \bigodot H^\ast - G_i \end{vmatrix}^{2}\]
该式的求解非本文重点,有兴趣的读者可以翻阅原论文的附录。该式子的求解结果如下:
\[H^\ast = \frac{\sum_i G_i \bigodot F^\ast_i}{\sum_i F_i \bigodot F^\ast_i}\]
分子是输入图像与期望的输入图像的卷积,而分母则是输入图像的能量谱图。

UMACE和ASEF滤波器

该论文虽然叫做MOSSE算法,不仅使用了Minimum Output Sum of Squared Error滤波器,其算法框架可以简单的将MOSSE滤波其替换为UMACE和ASEF等滤波器。
文中给出了UMACE和ASEF滤波其的求解形式。
UMACE滤波器形式如下:
\[H^\ast = \frac{\sum_i F^\ast_i}{\sum_i F_i \bigodot F^\ast_i}\]
可以看出其与MOSSE区别在于分子部分。

ASEF滤波器如下:
\[H^\ast = \frac{1}{N} \sum_i \frac{ G_i \bigodot F^\ast_i}{F_i \bigodot F^\ast_i}\]

对于ASEF滤波器因为输入图像的能量谱图\({F_i \bigodot F^\ast_i}\)在某些情况下可能接近与零,于是使用\({F_i \bigodot F^\ast_i + \varepsilon }\)替代。

滤波器初始化与更新

初始化

上诉的三个滤波其公式可以看到下标i,其表示的是多帧图像帧。MOSSE算法在初始化的时候需要一组训练图像和期望输出。那么这些训练数据是如何获得的?
作者给出的方案是,对第一个目标窗口\(f_i\)进行八个仿射变换得到一组训练图像,而\(g_i\)则以目标中心生成高斯矩阵。

更新

因为一个视频序列会有关照、旋转、尺度等变换,所以需要滤波器进行更新以便滤波器适应环境的变化。该论文使用了滑动平均值作为更新策略,这是很常用的更新方式。
对于ASEF和MOSSE的更新方式有稍许不同。ASEF滤波其的更新方式如下:
\[H_i^\ast = \eta \frac{G_i \bigodot F_i^\ast}{F_i \bigodot F_i^\ast} + (1-\eta)H_{i-1}^\ast\]
其中\(\eta\)为学习因子。而MOSSE更新方式如下。
\[H_i^\ast = \frac{A_i}{B_i}\]
\[A_i=\eta G_i \bigodot F_i^\ast+(1-\eta)A_{i-1}\]
\[B_i=\eta F_i \bigodot F_i^\ast+(1-\eta)B_{i-1}\]
从ASEF和MOSSE滤波其的形式不难看何其更新方式的不同。

其他

到这里,MOSSE算法的主要思想其实已经解释完了,但是还存在几个要点需要提及

检测

前文说目标的位置通过响应输出\(g\)来确定,其实就是通过频域计算出\(G=F\bigodot H^\ast\),再进行逆傅里叶变换求出\(g\),\(g\)矩阵的最大值就是目标的位置

\(G_i\)究竟指的是啥?

原文论文中对与\(g_i\)和\(G_i\)的阐述不够清晰,可能大部分读者会疑惑,哪个是响应输出?哪个是期望的响应输出?

  • 期望的响应输出指的是,期望经过滤波模板卷积后得到的输出,该输出是符合高斯分布的。MOSSE的平方误差中,\(F_i \bigodot H^\ast\)指的是目标窗口和滤波模板卷积后的响应输出的傅里叶变换,而\(G_i\)指的是期望得到的输出的傅里叶变换,这个输出要符合高斯分布。
  • 初始化过程中生成了一组期望的响应输出\(g_i\),这组训练数据通过更新滤波器的公式,初始化了滤波器。而在随后的检测更新过程中,\(g_i\)是以\[g=f_{i} \ast h_{i-1}\]响应输出的最大值坐标作为目标中心点而生成的高斯矩阵。
    听着很绕口,其实简单的说,在检测过程中,更新滤波器公式使用的\(G_i\)是以当前目标位置作为中心的。

预处理

对图像和滤波器进行卷积操作会将其映射到拓扑空间中,形成圆环性,即左边与右边相连,上边与下边相连。这样可能会影响到检测的正确性。其原因是因为当左边和右边连接,在傅里叶域中计算时候,可能在边界上会产生高的响应值,而使目标位置定位到边界上。故预先对图像乘上一个\(\cos\)窗口,以减小影响。这个方法在随后改进的算法中经常使用到。