Tracking算法:Discriminative Correlation Filter (DCF)
基本框架

Minimum Output Sum of Squared Error Filter (MOSSE)
t个目标区域样本分别为f_1,f_2,\cdots,f_t,通过滤波器h_t,期望输出g_i(通常为二维高斯函数,峰值位于目标区域中心),最小化均方误差:

对H_t求导,令导数为0,得:

对于t+1帧,假设其在第t帧的目标区域内提取得到特征图z,那么计算与z的相关值

y的最大值的位置即被认为是t+1帧中目标区域的中心点.
我们保持目标区域尺寸不变,将其中心点进行移动相应位置,就得到了在新帧中的目标区域。对该区域进行特征提取,然后加入到训练集中对模型进行更新得到h_{t+1}后,即可进行下一帧
中的目标检测了。
在实际的tracking过程中,一般使用如下方法来更新模型:

其中\eta为学习率。
缺点
- 只使用了灰度作为特征,模型所使用的特征维数太低,难以很好地反映目标的特性。
- 只估算了目标区域中心点在帧间的平移运动,而没有考虑目标在运动过程中反映在画面上的尺度变化,在目标尺度发生改变时难以适应。
Discriminative Scale Space Tracking Filter (DSST)
对MOSSE的改进:
- 使用fHoG替代灰度(通常fHoG为31dims,而DSST实际使用28dims)
- 考虑目标尺度变化
不考虑尺度变化
设特征维数为d,则特征图可记作f^l, l=1,2,\cdots,d。滤波器应和特征图匹配,误差函数:

引入\lambda项是为了控制滤波器频域参数求解过程中的除0,另一方面也可以控制滤波器参数变化范围,越小,滤波器参数变化范围越大。
对上式做傅里叶变换,求导,令导数为0,得:

在实际操作中,可以用下式更新模型:

新帧预测:

考虑尺度变化
滤波器和特征图由d\times M\times N改为d\times M\times N\times S,S = num of scales,即构造金字塔。这导致复杂度增大为O(dMNS\times \log MNS)。
改进思路,两组滤波器模板:
- d个大小为M\times N的二维位置滤波器
- 个大小为S的一维尺度滤波器
位置滤波器的训练方法同前,而尺度滤波器则是在确定了目标区域中心后,对于尺度因子s,提取出其对应区域的d个的二维矩阵后,将其拉成一条向量,作为尺度因子s下的维特征,构成尺度滤波器。
完整算法
-
估算位置
- 在帧I_t中根据前一帧的位置p_{t-1} 和尺度因子s_{t-1}划定区域提取特征z^{loca}_t
- 在与位置滤波器A^{loca}_{t-1}, B^{loca}_{t-1}做相关得到y^{loca}_{t}
- 将最大值点设为当前帧的目标中心p_t
-
估算尺度
- 在帧中根据位置和前一帧的尺度因子划定区域,缩放后得到S个区域,提取特征z^{scale}_t
- 将征与尺度滤波器A^{scale}_{t-1}, B^{scale}_{t-1}做相关得到y^{scale}_{t}
- 将最大值点设为当前帧的目标尺度s_t
-
更新模型
- 在帧中根据估算出的位置和尺度划定区域提取特征,得到f^{loca}_t和f^{scale}_t
- 更新位置滤波器得到A^{loca}_{t}, B^{loca}_{t}
- 更新尺度滤波器得到A^{scale}_{t}, B^{scale}_{t}
复杂度O(dMN\times\log MN + dMNS \times \log S)
缺点
- 难以适应大幅度形变、遮挡等
- 循环卷积边缘效应

SRDCF对此做出了改进。
Spatially Regularized Discriminative Correlation Filter (SRDCF)
将滤波器模板参数主要集中在一个搜索区域中的目标区域(即中心附近),在目标区域以外的背景区域处滤波器模板参数应尽可能地小或者为0(示意图如下)。

定义新的误差函数形式:

其中w是我们指定的权重函数,由于我们希望h^l_t在目标区域尽可能大,在其他搜索区域尽可能小,因此的取值应该在目标区域尽可能小,而在其他搜索区域尽可能大,如下图:

一般可取:

对误差函数做傅里叶变换(对于某个变量a,\hat a表示的傅里叶变换):

经过一系列变换:

其中,对于某个变量,\vec a表示向量化的结果。向量化的步骤是:
-
设原本为的二维矩阵,经过傅里叶变换得到
-
的每一列被依次连接起来,形成一个MN\times 1维的列向量
-
特别地:
- \hat f向量化后,填充在一个MN\times MN矩阵的对角线上,构成对角阵D(\hat f)
- \hat w向量化后,转置填充在矩阵C(\hat w)的第一行,接下来的每一行是前一行向右循环移动1位的结果
-
(To be continued…)
