3. 经典相关滤波跟踪器 (下)
各位同学,咱们接着聊相关滤波。上一节我们把MOSSE、CSK、KCF这些基础框架讲透了。这一节,我重点说说它们在实际落地时遇到的三个硬骨头——尺度变化、边界效应、背景干扰。这三个问题不解决,你的跟踪器在真实场景里基本就是“三秒丢”。
我自己在工业项目里吃过不少亏。有一次做无人机视觉跟踪,目标从近处飞到远处,KCF的框子死活不变,直接跟丢。后来换了DSST,才把问题搞定。所以这一节的内容,全是实战中必须掌握的。
3.1 DSST:让跟踪框学会“呼吸”
先说说尺度问题。你想想看,一个目标从远处走近,尺寸可能变大两三倍。KCF的框子是固定的,一旦目标变大,框子只框住局部,特征就乱了。目标变小呢?框子里全是背景噪声。
DSST(Discriminative Scale Space Tracker) 的解决思路很直接——单独训练一个尺度滤波器。它把位置估计和尺度估计拆成两个独立的滤波器:
- 位置滤波器:跟KCF一样,负责找目标中心
- 尺度滤波器:在目标中心周围,构建一个尺度金字塔,找出最佳尺度
具体怎么做?我简单说一下流程:
- 先用位置滤波器找到当前帧的目标中心
- 以该中心为中心,提取不同尺度的图像块(比如0.8倍、1.0倍、1.2倍)
- 把这些图像块缩放到统一大小,提取HOG特征
- 用这些特征训练一个一维的相关滤波器,响应最大的那个尺度就是最佳尺度
核心公式:尺度滤波器更新公式
# 尺度滤波器训练
A_l = (1 - η) * A_l_prev + η * G_l * conj(F_l)
B_l = (1 - η) * B_l_prev + η * F_l * conj(F_l)
# 其中F_l是尺度金字塔特征,G_l是高斯标签
# η是学习率,我一般设0.025
我的经验:尺度金字塔的步长很关键。步长太大(比如1.1倍),尺度变化太粗糙,容易跳过头。步长太小(1.01倍),计算量暴增。我一般用1.02倍,尺度层数设为33层(从0.8到1.2倍),效果比较稳。
DSST的缺点也很明显——它假设位置和尺度是独立的。如果目标快速缩放同时剧烈运动,位置滤波器和尺度滤波器会互相干扰。嗯,这时候就需要更鲁棒的方法了。
3.2 SRDCF:给滤波器戴上“镣铐”
接下来聊边界效应。这是相关滤波器的老毛病了。
为什么会有边界效应?因为我们在训练滤波器时,用的图像块是循环移位的。说白了,就是把图像卷成一个环,左边移出去的部分从右边补进来。这会导致滤波器学到一些“假特征”——比如目标在左边,循环移位后右边出现了目标的假副本。
SRDCF(Spatially Regularized Discriminative Correlation Filters) 的解决方案很优雅——给滤波器系数加一个空间权重。离目标中心越远的系数,惩罚越大。这样滤波器就只关注中心区域,不会去学那些循环移位带来的假特征。
它的目标函数长这样:
# SRDCF的优化目标
min_f || Σ f * x - y ||² + || w ⊙ f ||²
# 其中w是空间正则化权重矩阵
# 中心区域权重小(允许学习),边缘区域权重大(抑制学习)
这个w怎么设计?我见过两种做法:
- 高斯型:中心为1,边缘逐渐衰减到0.1左右
- 反高斯型:中心为0,边缘为1(更激进,直接禁止边缘学习)
避坑指南:我曾经在SRDCF的正则化强度上栽过跟头。正则化系数设太大,滤波器只关注中心几个像素,目标稍微动一下就丢了。设太小,边界效应又压不住。我建议从λ=0.1开始调,根据你的场景慢慢试。
SRDCF的代价是计算量上去了。因为它没法直接用FFT快速求解,得用高斯-赛德尔迭代。不过现在硬件好了,这点计算量其实可以接受。
3.3 BACF:让背景“现原形”
最后说BACF(Background-Aware Correlation Filters)。这个方法的思路更直接——你不是有边界效应吗?我干脆把背景区域也拿来训练。
BACF的做法是:在训练时,从图像中裁剪一个更大的区域(比如目标大小的4倍),然后只让滤波器关注目标区域,背景区域强制置零。这样滤波器就学会了“目标长什么样”,而不是“目标+背景长什么样”。
它的核心思想用一个公式就能说清楚:
# BACF的优化目标
min_f || Σ (P * f) * x - y ||² + λ || f ||²
# 其中P是一个裁剪矩阵,只保留目标区域的滤波器系数
# 背景区域的系数被强制为0
说白了,BACF就是在训练时告诉滤波器:“你只准看目标,别管背景”。这比SRDCF更暴力,但也更有效。
| 方法 | 解决的问题 | 核心思路 | 代价 |
|---|---|---|---|
| DSST | 尺度变化 | 独立尺度滤波器 | 计算量翻倍 |
| SRDCF | 边界效应 | 空间正则化 | 无法FFT加速 |
| BACF | 背景干扰 | 背景区域强制置零 | 需要更大搜索区域 |
我的建议:这三个方法不是互斥的。实际项目中,我经常把DSST和BACF组合使用——先用BACF抑制背景干扰,再用DSST处理尺度变化。效果比单独用任何一个都好。
3.4 知识体系总览
为了让你更直观地理解这三个方法的关系,我画了一张图:
从这张图你可以看到,这三个方法分别解决了相关滤波器的三个核心痛点。它们不是替代关系,而是互补关系。在实际项目中,我建议你先用BACF把背景干扰压住,再用DSST处理尺度变化,最后用SRDCF微调边界。当然,如果计算资源有限,优先上DSST和BACF的组合。
好了,这一节的内容就到这里。下一节我们会讲深度学习时代的跟踪器,那又是另一个世界了。
可可精品资料库