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的三大贡献:
- 循环矩阵加速:利用循环矩阵在傅里叶域可对角化的性质,把矩阵求逆变成逐元素运算
- 核技巧扩展:支持多种核函数(高斯核、多项式核等)
- 多通道特征:支持HOG、颜色直方图等特征,不再局限于灰度
KCF的求解公式(以线性核为例):
α̂ = ŷ / (k̂ˣˣ + λ)
其中α̂是滤波器系数的傅里叶变换,ŷ是期望输出的傅里叶变换,k̂ˣˣ是核相关矩阵的傅里叶变换。
检测时,对新的一帧图像z,响应图计算为:
f̂(z) = k̂ˣᶻ ⊙ α̂
然后做逆傅里叶变换,找到最大值位置就是目标的新位置。
我个人习惯:在实际项目中,我通常用HOG特征配合高斯核。HOG对光照变化不敏感,高斯核能处理非线性关系。但要注意,特征维度太高时,核矩阵计算会变慢。我一般把HOG的cell size设为4×4,bin数设为9,效果和速度比较平衡。
4.4 核心知识体系
下面这张图展示了相关滤波跟踪的知识脉络,我建议你仔细看看:
4.5 算法对比总结
| 特性 | MOSSE | CSK | KCF |
|---|---|---|---|
| 提出年份 | 2010 | 2012 | 2014 |
| 特征类型 | 灰度 | 灰度 | 多通道(HOG等) |
| 核方法 | 无 | 线性/高斯核 | 多种核函数 |
| 样本利用 | 单样本 | 循环矩阵密集采样 | 循环矩阵+多通道 |
| 速度(FPS) | ~600 | ~300 | ~150 |
| 鲁棒性 | 低 | 中 | 高 |
避坑指南:我曾经在项目中直接用KCF的默认参数,结果在无人机视角下跟踪效果很差。后来发现是尺度变化问题——KCF的框是固定的。解决办法?要么加尺度估计(比如SAMF或DSST的思路),要么用多尺度搜索。我个人倾向于后者,实现简单,效果也还行。
4.6 实践建议
如果你刚开始学相关滤波跟踪,我建议你按这个顺序来:
- 先跑通MOSSE:代码最简单,能帮你理解频域滤波的基本流程
- 再看CSK:理解循环矩阵和核技巧是怎么引入的
- 最后啃KCF:重点看多通道特征怎么跟循环矩阵结合
嗯,这里要注意一点:KCF虽然叫“核化相关滤波”,但实际实现中线性核的效果往往比高斯核差不了太多,速度却快很多。我一般先用线性核跑通,再换高斯核看有没有提升。
好了,相关滤波跟踪的核心内容就这些。下一节我们会聊另一个经典方法——基于深度学习的跟踪算法,到时候再对比一下两者的优劣。
可可精品资料库