4. 相关滤波跟踪:从MOSSE到KCF

说到目标跟踪,相关滤波这块儿是绕不开的。我刚开始接触这个方向时,也被一堆名字搞晕过——MOSSE、CSK、KCF,到底有什么区别?说白了,它们是一条技术演进路线上的三个里程碑。今天我就带你把这几个算法理清楚。

核心思想一句话:在图像中找目标,本质上就是在找“相关性最高的位置”。相关滤波就是把这个过程搬到频域去做,速度能快上几个数量级。

4.1 MOSSE算法:开山之作

MOSSE(Minimum Output Sum of Squared Error)是2010年提出的。说实话,它的思路非常朴素,但效果在当时让人眼前一亮。

基本原理:

  • 我们想要一个滤波器,让它跟目标区域卷积后,在目标中心输出一个峰值(理想是高斯形状)
  • 在其他位置输出接近0
  • 这个滤波器怎么求?最小化实际输出和理想输出之间的平方误差

数学上,MOSSE的优化目标是这样写的:

min ∑ |H ⊙ F_i - G_i|²

其中H是滤波器,F_i是输入图像的傅里叶变换,G_i是期望输出。⊙表示逐元素相乘。

解这个优化问题,得到闭式解:

H = (∑ G_i ⊙ F_i*) / (∑ F_i ⊙ F_i*)

这里F_i*是F_i的复共轭。嗯,注意分母要加一个很小的ε防止除零。

我的经验:MOSSE虽然简单,但有个致命问题——它只用单通道灰度特征。我在项目中试过,光照稍微一变,跟踪就丢了。后来我加了个预处理步骤,把图像先做直方图均衡化,能稍微改善一点,但治标不治本。

4.2 CSK算法:引入核方法

CSK(Circulant Structure of Tracking-by-detection with Kernels)是MOSSE的升级版。它解决了一个关键问题:怎么利用循环移位产生的样本?

核心改进:

  • 利用循环矩阵的性质,把密集采样变成隐式操作
  • 引入核技巧,把线性空间映射到非线性空间
  • 训练和检测都在频域完成,速度依然很快

CSK的优化目标变成了:

min ∑ (f(x_i) - y_i)² + λ||f||²

其中f是分类器,x_i是循环移位产生的样本,y_i是标签(高斯形状)。λ是正则化参数。

利用核技巧,分类器可以写成:

f(z) = ∑ α_i κ(z, x_i)

其中κ是核函数。CSK用的是线性核或高斯核。

我曾经踩过的坑:CSK的循环矩阵假设看起来很美好,但实际中如果目标快速移动,边界效应会非常严重。我做过一个实验,目标移动超过目标尺寸的1/3时,跟踪框就开始漂了。解决办法?加余弦窗,强制边缘像素接近0。

4.3 KCF算法:集大成者

KCF(Kernelized Correlation Filters)是目前最常用的相关滤波跟踪算法之一。它把CSK的思路推广到了多通道特征。

KCF的三大贡献:

  1. 循环矩阵加速:利用循环矩阵在傅里叶域可对角化的性质,把矩阵求逆变成逐元素运算
  2. 核技巧扩展:支持多种核函数(高斯核、多项式核等)
  3. 多通道特征:支持HOG、颜色直方图等特征,不再局限于灰度

KCF的求解公式(以线性核为例):

α̂ = ŷ / (k̂ˣˣ + λ)

其中α̂是滤波器系数的傅里叶变换,ŷ是期望输出的傅里叶变换,k̂ˣˣ是核相关矩阵的傅里叶变换。

检测时,对新的一帧图像z,响应图计算为:

f̂(z) = k̂ˣᶻ ⊙ α̂

然后做逆傅里叶变换,找到最大值位置就是目标的新位置。

我个人习惯:在实际项目中,我通常用HOG特征配合高斯核。HOG对光照变化不敏感,高斯核能处理非线性关系。但要注意,特征维度太高时,核矩阵计算会变慢。我一般把HOG的cell size设为4×4,bin数设为9,效果和速度比较平衡。

4.4 核心知识体系

下面这张图展示了相关滤波跟踪的知识脉络,我建议你仔细看看:

相关滤波跟踪知识体系 相关滤波跟踪 MOSSE (2010) CSK (2012) KCF (2014) 核心特性 • 最小平方误差滤波 • 单通道灰度特征 • 频域计算,速度极快 核心特性 • 循环矩阵密集采样 • 核技巧(线性/高斯核) • 岭回归闭式解 核心特性 • 多通道特征(HOG等) • 循环矩阵对角化加速 • 核相关快速计算 演进方向:灰度 → 核方法 → 多通道特征 关键公式对比 MOSSE: H = (∑Gᵢ⊙Fᵢ*) / (∑Fᵢ⊙Fᵢ*) KCF: α̂ = ŷ / (k̂ˣˣ + λ)

4.5 算法对比总结

特性 MOSSE CSK KCF
提出年份 2010 2012 2014
特征类型 灰度 灰度 多通道(HOG等)
核方法 无 线性/高斯核 多种核函数
样本利用 单样本 循环矩阵密集采样 循环矩阵+多通道
速度(FPS) ~600 ~300 ~150
鲁棒性 低 中 高

避坑指南:我曾经在项目中直接用KCF的默认参数,结果在无人机视角下跟踪效果很差。后来发现是尺度变化问题——KCF的框是固定的。解决办法?要么加尺度估计(比如SAMF或DSST的思路),要么用多尺度搜索。我个人倾向于后者,实现简单,效果也还行。

4.6 实践建议

如果你刚开始学相关滤波跟踪,我建议你按这个顺序来:

  1. 先跑通MOSSE:代码最简单,能帮你理解频域滤波的基本流程
  2. 再看CSK:理解循环矩阵和核技巧是怎么引入的
  3. 最后啃KCF:重点看多通道特征怎么跟循环矩阵结合

嗯,这里要注意一点:KCF虽然叫“核化相关滤波”,但实际实现中线性核的效果往往比高斯核差不了太多,速度却快很多。我一般先用线性核跑通,再换高斯核看有没有提升。

好了,相关滤波跟踪的核心内容就这些。下一节我们会聊另一个经典方法——基于深度学习的跟踪算法,到时候再对比一下两者的优劣。


可可精品资料库