2. 目标跟踪算法分类:生成式 vs 判别式,从相关滤波到深度学习

做目标跟踪这些年,我最大的感受就是:算法分类搞不清楚,后面落地全是坑。今天咱们就把这个分类体系彻底捋一遍。我会结合自己踩过的坑,帮你建立起一个清晰的认知框架。

核心观点:目标跟踪算法的发展,本质上是从「描述目标长什么样」到「区分目标和背景」的转变。这个转变,决定了算法的性能和落地可行性。

2.1 生成式方法 vs 判别式方法:两条路线的对决

先问一个问题:跟踪的本质是什么?

生成式方法说:我先把目标的样子记住,然后在下一帧里找最像它的区域。说白了就是「模板匹配」的升级版。经典的代表有均值漂移(MeanShift)、粒子滤波(Particle Filter)。

判别式方法说:我不光要看目标长什么样,还要看背景长什么样。我训练一个分类器,专门区分「这是目标」和「这不是目标」。这就是现在主流的方法。

我记得刚入行时,在一个安防项目中用了生成式方法。目标是个行人,背景是树荫。结果呢?目标稍微转个身,或者光照变一下,直接就丢了。后来换成判别式方法,效果立竿见影。

对比维度 生成式方法 判别式方法
核心思想 建模目标外观,找最匹配区域 训练分类器,区分目标与背景
代表算法 MeanShift、粒子滤波 相关滤波、深度学习类
对背景利用 基本忽略背景 充分利用背景信息
鲁棒性 较差,易受光照、形变影响 较强,能适应复杂场景
计算效率 通常较快 差异大,相关滤波快,深度学习慢

避坑指南:我曾经在一个无人机跟踪项目里,试图用生成式方法做快速跟踪。结果目标稍微被遮挡一下就彻底跟丢。后来我总结:只要场景稍微复杂一点,就别用生成式方法。判别式方法虽然计算量大一些,但鲁棒性完全不是一个量级。

2.2 相关滤波类算法:从 MOSSE 到 KCF 的进化

相关滤波(Correlation Filter)是判别式方法里的一支奇兵。它把跟踪问题转化成了频域里的卷积运算,速度极快。

2.2.1 MOSSE:开山之作

MOSSE(Minimum Output Sum of Squared Error)是2010年提出的。它的思路很简单:在频域里学习一个滤波器,让目标区域的响应最大,背景区域的响应最小。

为什么快?因为它在频域里做计算,用FFT把卷积变成了点乘。我当年第一次跑MOSSE时,被它的速度惊到了——几百帧每秒,这在当时简直是黑科技。

// MOSSE的核心思想(伪代码)
// 1. 初始化:根据第一帧的目标位置,生成理想响应图(高斯形状)
// 2. 训练:在频域里求解滤波器 H = G / F
//    - F: 输入图像的FFT
//    - G: 理想响应图的FFT
//    - H: 要学习的滤波器
// 3. 跟踪:新帧图像与滤波器做相关运算,响应最大的位置就是目标

但MOSSE有个致命问题:它只用灰度特征。说白了就是只看亮度,不看纹理、颜色、边缘。这在简单场景还行,一旦目标跟背景颜色相近,立马歇菜。

2.2.2 KCF:引入核技巧和多通道特征

KCF(Kernelized Correlation Filter)在MOSSE基础上做了两个关键改进:

  • 多通道特征:用HOG特征代替灰度,能描述梯度、纹理信息
  • 核技巧:把线性分类器扩展到非线性空间,提升判别能力

KCF还有一个巧妙的设计:循环矩阵。它通过循环移位生成大量训练样本,而且这些样本在频域里有闭式解,计算效率极高。

个人经验:我在一个交通监控项目里用过KCF。车辆跟踪效果还不错,尤其是对刚性物体的跟踪。但遇到行人这种非刚性目标,或者目标快速运动时,KCF就容易漂移。原因在于循环矩阵假设了周期性边界,目标一旦移出边界,响应就会出错。

KCF的数学表达可以简化为:

// KCF核心公式
// 滤波器更新:α = F^{-1}( ŷ / (k^{xx} + λ) )
// 其中:
//   α: 对偶空间的滤波器系数
//   ŷ: 理想响应的FFT
//   k^{xx}: 核相关矩阵
//   λ: 正则化参数

KCF的优点是速度快(通常几百FPS),实现简单。缺点是对尺度变化不敏感,而且遇到遮挡、快速运动时容易跟丢。

2.3 深度学习类算法:从 SiamFC 到 SiamRPN

深度学习进入目标跟踪领域后,性能有了质的飞跃。但代价是计算量暴增。我见过不少团队,模型精度很高,但部署到嵌入式设备上跑不起来。

2.3.1 SiamFC:全卷积孪生网络

SiamFC(Fully-Convolutional Siamese Networks)是2016年提出的。它的核心思想是:用两个共享权重的CNN分别提取模板和搜索区域的特征,然后做互相关运算。

为什么叫「孪生」?因为两个网络长得一模一样,共享权重。模板分支处理第一帧的目标,搜索分支处理当前帧。互相关的结果就是响应图,响应最大的位置就是目标。

// SiamFC的前向过程(简化)
// 1. 模板分支:输入127x127的目标图像 → CNN → 6x6x128特征图
// 2. 搜索分支:输入255x255的搜索区域 → CNN → 22x22x128特征图
// 3. 互相关:6x6x128 与 22x22x128 做卷积 → 17x17响应图
// 4. 定位:响应图最大值位置 → 映射回原图坐标

SiamFC的优势是端到端训练,不需要在线更新。但问题也很明显:它不处理尺度变化。目标变大变小,它还是用固定大小的搜索框。我在一个无人机航拍项目里就吃过这个亏——目标从远处飞到近处,尺寸变化了好几倍,SiamFC直接跟丢。

关键洞察:SiamFC的互相关操作,本质上是在做模板匹配。只不过模板和搜索区域都经过了CNN的特征提取。这比传统方法鲁棒,但依然没有解决「目标尺度变化」和「背景干扰」这两个核心问题。

2.3.2 SiamRPN:引入区域提议网络

SiamRPN(Siamese Region Proposal Network)在SiamFC的基础上,加入了区域提议网络(RPN)。这个改进非常关键:

  • 分类分支:判断每个锚框是前景还是背景
  • 回归分支:预测锚框到目标框的偏移量

这样一来,SiamRPN不仅能定位目标,还能回归出目标的精确边界框,包括尺度和长宽比的变化。

// SiamRPN的核心改进
// 1. 模板分支输出两路:分类核(4x4x(2k)) 和 回归核(4x4x(4k))
//    k是锚框数量,2是前景/背景,4是边界框回归参数
// 2. 搜索分支也输出两路:分类特征 和 回归特征
// 3. 分别做互相关:
//    - 分类分支:得到每个锚框的前景/背景得分
//    - 回归分支:得到每个锚框的边界框偏移
// 4. 后处理:NMS去除重叠框,选择得分最高的作为最终结果

我记得在一个行人跟踪项目里,用SiamRPN替换SiamFC后,跟踪精度提升了将近15%。尤其是在目标转身、弯腰这些形变场景下,SiamRPN的鲁棒性明显更好。

算法 核心机制 速度(FPS) 精度(OTB-100) 落地难点
MOSSE 频域滤波,灰度特征 600+ ~40% 特征单一,易漂移
KCF 核技巧,HOG特征 300+ ~55% 尺度不变,边界效应
SiamFC 孪生网络,互相关 50-80 ~65% 尺度不变,计算量大
SiamRPN 孪生网络 + RPN 40-60 ~75% 模型大,部署难

2.4 本章知识体系总览

下面这张图,是我自己总结的目标跟踪算法分类体系。你可以把它当作一个「导航图」,以后遇到具体问题,先定位到对应的分支,再选择具体算法。

目标跟踪算法 生成式方法 判别式方法 均值漂移 (MeanShift) 粒子滤波 (Particle Filter) 相关滤波类 MOSSE KCF 深度学习类 SiamFC SiamRPN 核心演进:模板匹配 → 频域滤波 → 孪生网络 + 区域提议 落地权衡:速度 vs 精度 vs 鲁棒性 生成式 相关滤波 深度学习

我的建议:如果你是刚入门,先从KCF开始。它实现简单,速度快,能帮你理解跟踪的基本流程。等你把KCF吃透了,再去看SiamRPN。直接上手深度学习,很容易被各种细节淹没——数据怎么准备?模型怎么训练?推理怎么加速?这些坑我当年都踩过。

曾经踩过的坑:我在一个边缘设备项目里,试图把SiamRPN部署到ARM上。结果模型太大,推理速度只有5FPS。后来我做了三件事才搞定:模型剪枝、INT8量化、用NCNN框架重新实现。所以,选算法之前,先想清楚你的硬件平台能承受多大的计算量。

好了,这一章的内容就到这里。目标跟踪的算法分类,说白了就是一条从「简单粗暴」到「精细复杂」的演进路线。每种方法都有它的适用场景,没有银弹。关键是你得清楚:你的项目需要什么?是速度优先?还是精度优先?还是两者都要?想清楚这个,算法选择就不难了。

可可精品资料库