本文将会从 相关滤波器 的相关理论进行展开,讲述如何将信号处理领域的 相关滤波器 融入到目前比较热门的 目标追踪 领域,以及对 MOSSE 算法进行了介绍。

若有错误,还请批评指出。

相关滤波器

没错,这个滤波器的名字就叫做 相关滤波器(Correlation filters),也叫 判别相关滤波器(Discriminative correlation filters,DCF)。它是将信号处理领域中的 信号相关性理论 引入到 目标追踪 领域中的一种方法。

具体思想是:通过使用信号的相关性来描述两个因素之间的联系,将 目标区域待检测的区域 比作信号,并计算这两个区域之间的相关性,相关性越大,则滤波器得到的响应也就越大,最后得到相关性最大的区域就是目标区域,即跟踪区域。

实现步骤可分为如下三步:

  • 首先,对已经跟踪出的多个目标区域进行特征提取,通过训练这些特征得到一个滤波器模板;
  • 然后,用训练好的滤波器与下一帧中的待检测的区域进行相关性的计算,将相关性最大的区域(最大响应点所在的区域)设置为下一帧中目标预测的位置;
  • 最后,提取以目标位置为中心的特征,用新位置区域再次训练并更新相关滤波器,通过不断循环以上步骤进行预测,可达到实时跟踪的效果。

这里有一个 相关性 的概念,可分为如下两种:

  • 互相关cross-correlation),在信号处理领域中,互相关是用来表示 两个信号之间相似性的一个度量,通过与已知信号的比较,以此用于寻找未知信号中的特性。
  • 自相关auto-correlation),也叫序列相关,是一个信号于其自身在不同时间点(频域)的互相关,也就是两次观察之间的相似度对它们之间的时间差的函数。

对于 $ f $ 和 $ g $ 这两个信号量,它们之间的相关性如下所示:

$$ (f \star g)(\tau) = \int_ {\infty} ^ {-\infty}{f ^ *}(t)g(t + {\tau})dt \qquad(1) $$

$$ (f \star g)(n) = \sum_{-\infty} ^ {\infty} {f ^ *} [m]g(m + n) \qquad(2) $$

互相关 实质上类似于两个函数的卷积。

式中,$ f ^ * $ 表示 $ f $ 的共轭复数,这种相关性表示的就是两个函数在某个时刻 $ \tau $ 的相似程度。由于存在时间差,所以要想得到最大值,就需要将其中一个变量进行平移。而 $ g(t + {\tau}) $ 就表示将 $ g $ 平移 $ {\tau} $ 个时刻。

相关滤波目标跟踪 方面主要是通过设计一个滤波器模板,使得当该模板作用在目标上时,得到最大的响应。

目前针对视频的目标追踪方法有三大方向:深度学习方向相关滤波方向 以及 其它传统方法。如下图所示:

image.png

基于 深度学习 的方法在训练神经网络的时候会产生较多的参数,从而导致训练时间较长,难以达到实时追踪的目的。

基于 相关滤波 的方法速度快,并且追踪的效果好,逐步成为视频跟踪算法发展的主要方向。从图中可以看到,作为首次将 Correlation Filters 引入到 目标追踪MOSSE 方法被称为该领域的 开山鼻祖

MOSSE 算法

该算法是在 2010 年由 《Visual object tracking using adaptive correlation filters》 论文提出的,其使用 MISSE(Minimum Output Sum of Squared Error filter,误差最小平方和滤波器) 来训练一个最优的滤波器模板,使其在目标上的响应最大,如下所示:

$$ g = f \star h \qquad(3) $$

其中,$ g $ 表示响应输出,即相关输出,$ f $ 表示输入图像,$ h $ 表示滤波模板,$ \star $ 为卷积操作。式 $ (3) $ 可以进一步展开,如下所示:

$$ (f \star h)(\tau) = \int_ {\infty} ^ {-\infty}{f ^ *}(t)h(t + {\tau})dt \qquad(4) $$

由于输入图像 $ f $ 是固定的,这里只需要确定的是滤波器模板 $ h $。由于上式的卷积运算计算量很大,因此 MOSSE 方法利用 快速傅里叶变换(FFT) 的方式,将 $ f $ 和 $ h $ 在频域内进行表示,函数互相关的傅里叶变换等于函数傅里叶变换的乘积(根据卷积定理可知:时域上的卷积等于频域上的乘积),将 卷积 操作转换为 点乘 操作,这样可以极大的减少计算量。也就是说,在这里将输入图像和滤波器通过算法变换到频域后,直接进行相乘,然后再变回时域(即图像的空域)就可以得到响应结果了。如下所示:

$$ \mathcal{F}(g) = \mathcal{F}(f \star h) = \mathcal{F}(f) \odot {\mathcal{F}(h) ^ *} \qquad(5) $$

$ \mathcal{F} $ 表示傅里叶变换,$ \odot $ 表示点乘运算(也就是点积运算)。可将 $ (5) $ 简写成如下所示:

$$ G = F \odot {H^*} \qquad(6) $$

也即:

$$ {H^*} = \frac {G}{F} \qquad(7) $$

好了,现在就只需要求 $ {H^*} $ 就可以了。

在计算之前,对于实际的目标追踪技术,还需要考虑到 目标的外观变换 等因素的影响。所以需要考虑到以目标的 $ m $ 个图像作为参考,从而提高滤波器模板的鲁棒性,如下所示:

$$ min_ {H^*}= \sum_ {i=1}^{m} {\mid} H^ * {\odot} F_{i} - G_{i} {\mid}^{2} \qquad(8) $$

其中,$ F_{i} $ 表示输入图像,$ G_{i} $ 表示在傅里叶域中期望的输出图像,目标是找到使输出误差平方和最小的滤波器 $ H^* $。

通常为了得到函数的最优值,可以通过对该函数求导数然后置为零即可。然而该函数表示的都是 实数值,即表示的是 复变量的实数值函数

由于傅里叶域中的 相关 是逐个元素相乘的,所以这里可以独立地优化滤波器 $ H^* $ 中的每个元素。因此,优化问题可以从多元优化问题转换为独立地优化 $ H^* $ 中每个元素的问题。

对于每个元素来说,要想找到最小的 $ min $,只需要将其中的每个元素的 MOSSE 都最小即可,如下所示:

$$ min_ {H_ {w,v}^*}= \sum_ {i=1}^{m} {\mid} H_ {w,v}^*F_{w,v,i} - G_{w,v,i} {\mid}^{2} \qquad(9) $$

$ w $ 和 $ v $ 是 $ H^* $ 中每个元素的索引。

要想得到最小的 $ {H_ {wv}^{*}} $,只需要将上式求偏导,并使偏导等于 $ 0 $ 即可,如下所示:

这里要注意的是,在 复数域 的求导和在 实数域 求导是不同的。

$$ 0 = \frac {\partial}{\partial H_ {w,v}^{*}} \sum_{i=1}^{m} {\mid} H_{w,v}^*F_{w,v,i} - G_{w,v,i} {\mid}^{2} \qquad(10) $$

$$ \Rightarrow 0 = \frac {\partial}{\partial H_ {w,v}^{*}} \sum_{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}) ^ * $$

$$ \Rightarrow 0 = \frac {\partial}{\partial H_ {w,v}^{*}} \sum_{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} ^ *) $$

$$ \Rightarrow 0 = \frac {\partial}{\partial H_ {w,v}^{*}} \sum_{i=1}^{m} (H_{w,v}^*F_{w,v,i} {\cdot} H_{w,v}F_{w,v,i} ^ *- H_{w,v}^*F_{w,v,i} {\cdot} G_{w,v,i} ^ * - H_{w,v}F_{w,v,i} ^ * {\cdot} G_{w,v,i} + G_{w,v,i} {\cdot} G_{w,v,i} ^ *) $$

$$ \Rightarrow 0 = \sum_{i=1}^{m} (F_{w,v,i} {\cdot} H_{w,v}F_{w,v,i} ^ * - F_{w,v,i} {\cdot} G_{w,v,i} ^ *) $$

$$ \Rightarrow \sum_{i=1}^{m} F_{w,v,i} {\cdot} H_{w,v}F_{w,v,i} ^ * = \sum_{i=1}^{m}F_{w,v,i} {\cdot} G_{w,v,i} ^ * $$

$$ \Rightarrow H_{w,v} = \frac {\sum_{i=1}^{m}F_{w,v,i} G_{w,v,i} ^ *}{\sum_{i=1}^{m} F_{w,v,i} F_{w,v,i} ^ *} \qquad(11) $$

其中,$ (11) $ 表示的是每个元素的值,按以上方式处理所有 $ H $ 中的元素,可以得到 滤波器模型的公式

$$ H = \frac {\sum_{i=1}^{m}F_{i} {\odot} G_{i} ^ *}{\sum_{i=1}^{m} F_{i} {\odot} F_{i} ^ *} \qquad(12) $$

在原文中,作者对跟踪框(GroundTruth)进行随机变换,获取一系列的训练样本 $ f_ {i} $,而 $ g_ {i} $ 是由高斯函数产生的,其峰值的位置就是在 $ f_ {i} $ 的中心位置。获得了一系列的训练样本和结果之后,就可以计算滤波器模板 $ h $ 的值了。

然而,在目标跟踪过程中,只需要将 $ (12) $ 这一滤波器模板与当前帧的图像做 相关操作 即可,将得到的响应结果中最大的点所对应的坐标作为当前帧的位置(相当于在二维平面上移动模板)。考虑到想要让滤波器对形变、光照等外界因素的影响具有更好的鲁棒性,采取了以下模板更新策略:

$$ H_ {t} = \frac {A_ t}{B_ t} \qquad(13) $$

$$ A_ {t} = \eta F_ {t} \odot G_ {t} ^ * + (1 - \eta) {A_ {t-1}} \qquad(14) $$

$$ B_ {t} = \eta F_ {t} \odot F_ {t} ^ * + (1 - \eta) {B_ {t-1}} \qquad(15) $$

$ H_ {t} $ 表示在第 $ t $ 帧求得的滤波模板,$ \eta $ 为经验常数。这里将滤波器模板被拆分为 分子分母 两部分,分别对这两部分进行更新。其中 $ A_ {t} $ 和 $ A_ {t-1} $ 分别表示当前帧和上一帧。

对于其他的部分,比如可以向 $ (12) $ 中引入正则化参数,或者分别求 $ H_ {i} $ 然后再取平均值等。

2D-FFT

来看一下,在 Matlab 中 二维傅里叶变换(fft2) 是怎么进行的。

$$ Y_{p+1,q+1} = \sum_{j=0}^{m-1} \sum_{k=0}^{n-1} {w_{m}^{jp} w_{n}^{kq} X_{j+1,k+1} } $$

其中, $ w_m $ 和 $ w_n $ 是复单位根,即:

$$ w_m = e^{\frac{-2πi}{m}} $$

$$ w_n = e^{\frac{-2πi}{n}} $$

$ i $ 是虚数单位,$ p $ 和 $ j $ 表示从 $ 0 $ 到 $ m-1 $ 范围的索引,$ q $ 和 $ k $ 表示从 $ 0 $ 到 $ n-1 $ 范围的索引,$ +1 $ 表示将 $ X $ 和 $ Y $ 的索引平移 1 位。

参考

  1. http://www4.comp.polyu.edu.hk/~cslzhang/STC/STC.htm
  2. https://blog.csdn.net/sgfmby1994/article/details/68490903
  3. https://www.cnblogs.com/hanhuili/p/4266990.html