MOOSE
论文标题 “Visual Object Tracking using Adaptive Correlation Filters”
原文地址
用滤波器对目标外观进行建模,并通过卷积操作来执行跟踪。
参考阅读:
目标跟踪经典算法——MOSSE(Minimum Output Sum Square Error)
目标跟踪整理(1)之MOSSE
相关滤波跟踪原理
基于以初始帧中给定的bounding box来选择目标,并基于示例图像上(基于初始帧得到)训练滤波器来建模目标的外观。在接下来的每一帧中,通过训练好的关联滤波器来跟踪目标,相关输出中最大值对应的位置表示目标的新位置,然后根据该新位置执行在线更新。
- 目标初始化:在视频的第一帧中,选择一个以物体为中心的小窗口,基于该区域初始化滤波器。
- 跟踪与滤波器训练:在接下来的每一帧中,在搜索窗口内基于训练好的滤波器进行相关操作,以跟踪目标。这个搜索窗口通常比跟踪窗口大,以便于捕捉目标的移动。
- 确定新位置:在相关操作的输出中,寻找最大值对应的位置。这个位置表示目标在当前帧中的新位置。
- 在线更新:根据目标的这个新位置,更新滤波器,使其能更好地适应目标可能的外观变化。
MOSSE算法的基本思想:首先根据第一帧图像框选的目标构建一个响应,该响应在所绘制的目标框的中心处的响应值最大,向四周缓慢衰减(二维高斯分布)。然后我们希望找到一个滤波器使得图像和这个滤波器进行相关运算之后刚好得到的就是这个响应,那么就可以根据响应值最大处得到目标的位置了。当新的一帧图像进来时,用之前得到的滤波器与新的图像进行相关运算,就可以得到新的目标位置了。
频域转换
f f f:搜索窗口,即全局图像的局部区域
h h h:滤波器
相关操作: g = f ∗ h g=f*h g=f∗h
为了让跟踪过程更快,应用相关过滤器的过程在频域内,即使用傅里叶变换(FFT),其使卷积运算变成元素乘法运算(切记)。
F F F:输入图像的2D傅里叶变换,即 F = F ( f ) F=\mathcal{F}(f) F=F(f)。
H H H:滤波器的2D傅里叶变换,即 H = F ( h ) H=\mathcal{F}(h) H=F(h)。
则上式可写为:
G = F ⊙ H ∗ G=F \odot H^* G=F⊙H∗
其中, ⊙ \odot ⊙表示逐元素相乘操作,而 H ∗ H^* H∗表示 H H H的复共轭。
为什么是复共轭呢?
因为相关和卷积在某些地方(深度学习领域,如图像卷积操作)可能当成相同的运算,但实际上两者是有差别的(数学意义上的卷积,比如信号处理/传统图像处理)。
f f f与 h h h做相关实际上是 f f f和旋转了180度的 h h h做卷积。关于这点,也有疑问,相关为什么是翻转了180度的卷积操作呢?
GPT4的回答如下:
为什么卷积的定义和深度学习中的卷积不一样呢?这篇回答中提到了,本质原因是:数学中的卷积和卷积神经网络中的卷积严格意义上是两种不同的运算。具体来说:
- 卷积神经网络图像处理卷积时,没有旋转180度。
- 数学上的卷积,比如信号处理/传统图像处理,处理卷积时,才旋转180度。
OK,重新捋一下思路,整个过程可以总结为:
- 时域中的相关操作:在时域中,相关操作通常表示为 g = f ∗ h g=f*h g=f∗h,其中 f f f是搜索窗口, h h h 是滤波器(例如模板或掩模),而 g g g是输出结果。相关操作本质上是滤波器 h h h在搜索窗口 f f f上滑动,计算它们之间的局部相似度。
- 频域的傅里叶变换:为了加速计算,可以将相关操作转换到频域执行。根据傅里叶变换的性质,时域内的相关操作对应于频域内的逐元素乘积。所以,定义 F = F ( f ) F=\mathcal{F}(f) F=F(f)为输入图像 f f f的2D傅里叶变换, H = F ( h ) H=\mathcal{F}(h) H=F(h)为滤波器 h h h的2D傅里叶变换。
- 频域内的卷积和相关操作:在频域内,卷积运算变为 F F F和 H H H的逐元素相乘。但由于在时域中, f f f 和 h h h原本要进行的是相关操作(不是卷积),这等价于 f f f和旋转180度的 h h h进行卷积。因此,在频域内,这个相关操作表示为 G = F ⊙ H ∗ G=F \odot H^* G=F⊙H∗,其中 H ∗ H^* H∗是 H H H的复共轭。
预处理
预处理操作如下:
- 用log函数处理图像,使其具有低对比度照明情况;
- 像素值将正则化到零均值、一方差;
- 应用余弦窗到图片上,这会让图像边缘元素值趋于零。
MOSSE 滤波器
MOSSE是一种从较少的训练图像中生成滤波器的算法。因此,其需要一组训练图像 f i f_i fi和训练输出 g i g_i gi。
参照原文, g i g_i gi是基于ground truth生成的,其为训练图像中以目标中心为中心的紧凑2D高斯形状峰值( σ = 2 \sigma=2 σ=2)。
为了找到将训练输入映射到所需训练输出的滤波器,MOSSE找到了一个滤波器 H H H,该滤波器 H H H可以最小化实际输出与真实输出之间的平方误差之和,即:
min H ∗ ∑ i ∣ F i ⊙ H ∗ − G i ∣ 2 \mathop{\min}_{H^*} \sum_{i}{|F_i\odot H^*-G_i|}^2 minH∗i∑∣Fi⊙H∗−Gi∣2
所以可以明白为什么叫MOSSE(Minimum Output Sum of Squared Error)了吧?
对 H ∗ H^* H∗求导,令其为0,可得到闭式解:
H ∗ = ∑ i G i ⊙ F i ∗ ∑ i F i ⊙ F i ∗ H^*=\frac{\sum_{i}G_i \odot F_i^*}{\sum_{i}F_i \odot F_i^*} H∗=∑iFi⊙Fi∗∑iGi⊙Fi∗
初始化
为了训练滤波器,需要一组训练图像,但是能够得到的只有初始帧图像。因此使用随机仿射变换构建训练图像,以及对应的训练输出 g i g_i gi,其峰值对应于目标中心。
在线更新
在跟踪过程中,通常会面临由旋转、尺度缩放、光照变化,甚至进行非刚性变形等因素引起的外观变化。因此,滤波器需要在线更新才能适应跟踪目标的变化,如下所示:
H i ∗ = A i B i A i = η G i ⊙ F i ∗ + ( 1 − η ) A i − 1 B i = η F i ⊙ F i ∗ + ( 1 − η ) B i − 1 H^*_i=\frac{A_i}{B_i} \\ A_i= \eta G_i \odot F_i^* + (1-\eta)A_{i-1}\\ B_i= \eta F_i \odot F_i^* + (1-\eta)B_{i-1} Hi∗=BiAiAi=ηGi⊙Fi∗+(1−η)Ai−1Bi=ηFi⊙Fi∗+(1−η)Bi−1
其中, η \eta η表示学习率,其值越大,则对当前帧保留的信息越多,对历史信息保留的越少。文中给出 η \eta η的最佳值为0.125。
峰旁比
衡量峰值强度的一个简单方法为peak to sidelobe ratio(PSR),即峰值旁瓣比。
The Peak-to-Sidelobe Ratio (PSR), which measures the strength of a correlation peak, can be used to detect occlusions or tracking failure, to stop the online update, and to reacquire the track if the object reappears with a similar appearance.
这篇大概讲了一下,但还是不是很明白到底什么是Peak-to-Sidelobe Ratio。
还是看原文,PSR的定义为:
P S R = g m a x − μ s σ s PSR=\frac{g_{max}-\mu_s}{\sigma_s} PSR=σsgmax−μs
其中,旁瓣是窗口中除了峰值之外的周围11 × 11区域的像素, g m a x g_{max} gmax为滤波结果的峰值, μ s \mu_s μs和 σ s \sigma_s σs分别为旁瓣区域的平均值和标准差。
对于MOSSE来说,PSR值在20-60时代表峰值较稳定,当其值在7左右时代表跟踪失败或者发生遮挡。