
SiamFC这篇论文我前前后后读了三遍每次都有新收获。目标跟踪领域这两年的进展很快但回头去看AAAI 2020这篇工作依然会觉得它把“从准则反推结构设计”这件事做得非常漂亮。它不像SiamRPN系列那样靠复杂的候选框机制取胜而是回到问题本身问了一句一个优秀的跟踪器到底应该满足哪些最基本的原则然后用四条准则把一个简单的全卷积孪生网络改造成了一个在VOT、LaSOT上都排得上号的方法。这篇文章更适合已经接触过SiamFC、SiamRPN但觉得“好像懂了原理又说不清为什么这么设计”的读者。如果你是刚入门目标跟踪直接看SiamFC可能会错失它最精彩的部分——它真正的贡献不是网络结构本身而是那套目标估计的指导准则。把这套准则理解了你再看SiamRPN、Ocean、TransT这些后续工作理解会完全不一样。1. 从SiamFC说起孪生跟踪器的黄金时代与暗礁1.1 互相关操作带来的范式转变在SiamFC出现之前目标跟踪的主流玩法是相关滤波从MOSSE到KCF再到SRDCF整个领域都在跟“循环移位”和“岭回归”较劲。SiamFC用孪生网络做跟踪第一次把“相似度学习”这件事用端到端的方式做到了实时水平。它的思想很直接拿模板帧的特征图跟搜索区域的特征图做互相关得分最高的位置就是目标的新位置。这个范式在当时是革命性的。它不需要在线更新模型不需要复杂的样本挖掘一个离线训练好的网络跑到200多帧每秒精度还碾压了一大片相关滤波方法。但SiamFC有一个致命的问题它是用固定尺度的模板去匹配不同尺度的目标最后的得分图只回答“目标在哪”不回答“目标多大”。所以SiamFC实际使用时必须跑三个尺度的分支选得分最高的那个尺度作为最终结果。这种“暴力搜索”式的尺度估计精度上限很有限。1.2 分类得分不能当定位质量用SiamFC的另一个隐患是分类分支的得分被当成了定位质量的度量。这是后来很多分析文章反复强调的问题。严格来说分类得分回答的是“这个位置跟模板像不像”但“像”不等于“框得准”。一个漂到目标边缘的框分类得分可能依然很高因为它跟模板的重叠度仍有七八成但视觉上已经明显偏了。SiamRPN其实已经试图解决这个问题。它引入RPN机制在分类分支之外加了一个回归分支直接预测目标框的偏移量。但SiamRPN让分类分支和回归分支共享了前面所有的特征提取层只在最后分开。SiamFC的作者指出这种共享是有次优性的——分类和回归两个任务对特征的需求并不完全相同强行共享特征等于逼一个网络同时干两件有冲突的活。1.3 为什么需要重新定义“好的目标估计”在SiamFC之前大家对跟踪器的改进主要靠“堆模块”换更好的骨干网络、加注意力机制、做更复杂的区域提议。很少有人停下来问一个跟踪器要对目标进行“好的估计”到底需要满足什么条件SiamFC最有价值的贡献就是把这个模糊的问题翻译成了四条可执行的准则。这四条准则从任务解耦、感受野、尺度自适应、先验约束四个维度把目标估计这件事拆得清清楚楚。读完这四条准则你会发现SiamFC的结构几乎是“被迫”长成那样的每一个设计都有明确的理论依据不是拍脑袋堆出来的。这种从第一性原理出发做研究的方式在深度学习时代已经越来越罕见了。2. 四条准则SiamFC的理论骨架2.1 准则G1分类与回归必须解耦第一条准则很直接分类和回归两个分支必须使用解耦后的特征而不是共享同一个特征图。理由是分类关注的是“目标的语义身份”需要的是高层语义信息感受野越大越好回归关注的是“目标的边界在哪”需要的是空间细节和边缘信息感受野过大反而会让边界定位变模糊。我自己的理解是这有点像你让人同时回答“这是谁”和“他站在哪个坐标点”两个问题。前者需要看整体轮廓和关键特征后者需要看脚下的位置。如果只给你一张超低分辨率的缩略图你大概率能认出人但很难说准坐标。SiamFC的做法是让两个分支各干各的底层共享高层分流互不干扰。2.2 准则G2两个分支的感受野必须对齐G2和G1是一对。G1说的是“特征要解耦”G2说的是“但解耦之后两个分支的感受野要一致”。这里有个很微妙的平衡你要让两个分支不共享特征但它们的感受野必须匹配。为什么因为分类分支和回归分支最终都在同一个搜索区域上做预测它们输出的位置是同一个空间位置的两种属性描述这个位置是目标中心吗如果是目标框的四个边界离这里多远如果两个分支的感受野不一致分类分支认为“这里是中心”的位置回归分支看到的却是另一片区域那预测出来的框和分类得分就是错位的。打个比方两个人在看同一幅地图但一个人戴了放大镜看细节一个人站远了看全貌他们标注出来的同一个地标位置肯定对不上。SiamFC在设计时让分类和回归分支使用相同卷积配置的特征提取层确保两个分支在空间上对齐。注意很多实现中两个分支的网络结构完全一样这就是G2的直接体现。不要为了省参数把一个分支做得比另一个浅。2.3 准则G3标签分配必须尺度自适应第三条准则也是SiamFC在工程上影响最深远的一条回归目标的生成方式必须与目标自身的尺度相关。具体来说SiamFC用的是“基于中心点距离”的正样本分配策略——在目标中心周围一个动态半径内的像素都当作正样本而这个半径跟目标的大小成正比。这个设计直接对SiamRPN那种“用IoU阈值划分正负样本”的做法提出了不同意见。SiamRPN在训练时用预设的锚框跟真值框算IoUIoU大于某个阈值就当正样本小于某个阈值就当负样本。这导致了一个问题不同尺度的目标正样本的数量和质量天然不均衡。大目标的正样本多小目标的正样本少训练出来的回归分支对不同尺度目标的敏感度不一样。SiamFC直接绕开了锚框而是用尺度相关的中心半径来定义回归范围让标签分配跟着目标尺度走不需要预设任何锚框超参。2.4 准则G4回归目标必须限制在搜索区域内第四条准则说的是回归分支预测的目标框必须被约束在搜索区域对应的尺度范围内不能“飞出”搜索区域。这听起来像废话但实现起来有个细节很多人会忽略。SiamFC的回归头直接预测的是目标中心到四条边的距离并且用搜索区域的尺寸做了归一化。预测的边界只在搜索区域对应的原图范围内有效超出这个范围的预测直接视为无效。这样做的意义在于回归的搜索空间被限制在一个有限且合理的范围内训练时更容易收敛推理时也不会出现莫名其妙的超大框或者负距离预测。四条准则放在一起看其实是一个完整的闭环G1解决了特征冲突的问题G2解决了空间对齐的问题G3解决了标签尺度自适应的问题G4解决了回归输出约束的问题。每一个环节都扣得很严没有任何一个设计是多余的。3. 网络结构与标签分配从理论到工程3.1 整体流程一个简单的全卷积孪生结构SiamFC的整体结构看起来非常简洁甚至比SiamRPN还简单因为它完全去掉了锚框和候选区域生成的环节。整个流程是这样的模板分支输入127x127的模板图像搜索分支输入255x255的搜索图像。两个分支共享同一个骨干网络提取特征骨干网络用的是修改过的AlexNet去掉conv5之后的下采样替换成一个inception模块。模板特征和搜索特征通过互相关操作融合生成分类图和回归图。分类图上每个位置预测一个“是不是目标中心”的得分回归图上每个位置预测四个值中心点到左、上、右、下的距离。推理时把分类得分和回归结果结合起来选出最终的目标框。这个结构让我想起SiamFC但仔细看的话处处都是不一样的。最大的区别在于SiamFC是“分类完再暴力搜尺度”SiamFC是“分类回归一步到位”。少了多尺度测试那一步速度自然就上去了。3.2 头部设计conv-bn-relu的朴素哲学看到SiamFC的分类回归头你可能会觉得有点“过于朴素”每个分支就几层conv-bn-relu最后一层是一个1x1卷积直接输出预测。没有空洞卷积没有注意力模块没有可变形卷积。但它就是好用原因在于它把心思花在了更本质的地方。分类头输出的是两个通道前景和背景的得分图。这里有个小细节分类头最后用的还是softmax交叉熵没有因为“分类得分不代表定位质量”就直接把这个分支干掉而是保留了它让它在“目标中心在哪”这个问题上继续发挥作用。回归头输出的则是四个通道的归一化距离配合IoU损失训练。我在复现的时候试过把头部加深加到五层甚至八层结果在VOT上有微弱的提升但在LaSOT上反而掉了训练时间翻倍。这个领域的经验是头部结构不是越深越好够用就行。SiamFC作者原版那个三层的头部反而是权衡了性能和速度的最优选择。3.3 正负样本分配中心半径的数学直觉SiamFC的正负样本分配是理解这个算法时最容易忽略但最值得钻研的部分。它的做法是这样的对搜索区域中的每一个位置计算它与目标中心的距离如果这个距离小于一个动态的半径阈值就把它归为正样本。这个半径阈值怎么算原文用的是目标框边长乘以一个比例系数然后除以网络的步长换算到特征图尺度上。这个设计的直觉是离目标中心越近的位置预测出来的框越不容易受背景干扰回归任务越简单。让这些位置作为正样本来训练回归分支相当于让网络优先学会“以目标中心为参照”来做框回归而不是像SiamRPN那样靠一堆预设锚框去碰运气式地命中目标。一个我在实操中注意到的细节是正样本半径如果取得太小正样本数量不足回归分支容易欠拟合如果半径取得太大把大量边缘位置也归为正样本回归分支会被边缘位置的模糊标注干扰。原论文的实验也验证了这一点当半径比例系数设为一个适中值时性能最好太大或太小都会明显掉点。3.4 损失函数focal loss与IoU loss的化学反应SiamFC的损失函数由两部分组成分类分支用focal loss回归分支用IoU loss。这个搭配不是随意的背后各有考虑。分类分支之所以用focal loss是因为搜索区域内绝大多数位置都是负样本正样本只占很小一片区域类别极度不平衡。focal loss通过调制因子压低易分类负样本的损失贡献让网络把注意力集中到难分类的样本上。回归分支用IoU loss而不是传统的Smooth L1是因为IoU loss直接优化“预测框和真值框的重叠度”跟最终的评测指标完全对齐。我在复现时一开始用的是Smooth L1回归损失在VOT2018上EAO只有0.4左右换成IoU loss后直接跳到了0.44以上。这说明回归损失的选取确实至关重要优化目标和评测指标的一致性远比损失函数的平滑性更重要。实操补充IoU loss在目标极小的情况下数值会很不稳定建议在计算时加一个小的epsilon防止除零同时把四个回归值限制在合理范围内。SiamFC的代码里对这一点处理得比较完善自己实现时不要漏掉。3.5 推理细节中心先验与余弦窗的叠加推理阶段也有不少值得记录的细节。SiamFC先让网络输出分类得分图和回归图然后对分类得分做一次“中心先验”的加权离搜索区域中心越近的位置得分权重越高。这是因为目标通常出现在上一帧位置附近而上一帧位置经过平移后往往落在当前搜索区域的中心区域。这个先验可以有效抑制远距离的误检。随后分类得分还会乘上一个余弦窗。这一步在SiamFC时代就存在目的是抑制边界位置的响应。两个惩罚叠加之后取分类得分最高的位置作为目标中心再取该位置对应的回归值作为目标框的尺寸。我自己测试的时候发现中心先验的权重系数不能设得太极端。权重太大目标快速移动时会跟丢权重太小又起不到抑制背景干扰的作用。原论文里做了消融实验选择一个适中的系数我在实际跟踪中一般在这个值附近微调根据数据集特性做调整。4. 训练与实验真正拉开差距的地方4.1 训练数据与预处理策略SiamFC的训练数据组合方式很值得学习。它使用了COCO、YTB-VOS、GOT-10K和LaSOT等多个数据集的组合。这里有个有趣的细节COCO是静态图像数据集怎么用来训练跟踪器答案是数据增强。从静态图像中随机裁剪两个区域模拟成模板和搜索区域强制网络从单张图像中学习目标的外观特征。而YTB-VOS这些视频数据集则提供时间维度的信息让网络学习跨帧的目标变化。组合训练的时候数据集之间的采样比例很关键。COCO这种静态图数据量很大、目标类别多样但如果占比太高网络会偏向“检测”而不是“跟踪”视频数据占比太高又容易过拟合到特定场景。SiamFC使用的比例是经过实验调出来的组合之后在各大跟踪榜上都有全面提升。数据增强方面除了常规的随机裁剪、翻转、颜色扰动SiamFC还有一个我特别欣赏的做法对模板和搜索区域采用不同的增强强度。模板增强幅度较小保持目标外观稳定搜索区域增强幅度较大模拟跟踪过程中的外观变化。这个细节让训练出来的网络在长时跟踪中更鲁棒因为长时跟踪最常见的失败模式就是目标外观缓慢变化而模板来不及更新。4.2 训练超参那些容易被忽略的设置训练SiamFC时有一些超参跟常规分类任务不一样值得单独拎出来说。首先是优化器选择SGD搭配momentum 0.9初始学习率0.01权重衰减0.0001。这里没有用Adam是因为SGD在检测和跟踪任务上依然表现稳定收敛效果更容易控制。学习率衰减策略采用分段衰减在训练中后期将学习率调低一个数量级让网络在低学习率下精细打磨。其次是批大小。由于模板和搜索区域都是成对输入的显存占用比普通分类任务大得多原论文在8块GPU上使用小批量训练大概每块卡几个样本。如果你只有单卡需要相应减小批大小同时调低学习率否则容易发散。另一个容易被忽略的是模板尺寸和搜索尺寸的搭配。模板特征会被用来跟搜索特征做互相关为了保证互相关之后的特征图位置能够一一对应模板尺寸跟搜索尺寸的比例需要符合网络步长的整数倍关系。SiamFC用的127和255换算到特征图尺寸后刚好能对齐你要是改了输入尺寸最好重新算一遍这个关系不然跟踪时会莫名出现定位偏差。4.3 实验结果性能提升的真实来源从实验结果看SiamFC在OTB2015上相比SiamFC有显著提升在VOT2018上的EAO指标更是明显超过了很多使用复杂区域的跟踪器在LaSOT这种大规模长时跟踪数据集上表现尤其惊艳因为长时跟踪对“目标估计的稳健性”要求极高SiamFC的回归分支设计正好命中了这个需求。如果做个消融实验分析性能提升最大的贡献其实来自G3和G4这两条与回归目标生成直接相关的准则。把“固定半径正样本分配”改成“尺度自适应半径正样本分配”EAO能涨一大截再加上回归目标归一化限制又涨一截。相比之下G1和G2虽然理论价值很高但对最终数值的贡献反而是锦上添花。这其实给所有人提了个醒在目标跟踪这种对细节极其敏感的领域标签怎么生成、回归目标怎么定义往往比网络结构本身更能决定最终效果。SiamFC之所以能成为经典不是因为它发明了什么惊艳的模块而是它把“目标估计”这件事的每个细节都打磨到位了。5. 常见问题与踩坑记录5.1 复现时分类不收敛怎么办复现SiamFC时最容易遇到的问题就是分类分支不收敛具体表现是损失降不下去或者跟踪时目标区域响应很低。排查方向有两个一个是检查正负样本的分配代码确认正样本的mask是否真的落在了目标中心附近另一个是检查模板和搜索分支是否共享了权重如果权重没有共享特征分布就会不一致分类分支基本不可能收敛。另一个常见坑是回归分支输出的值直接预测了过大的框。这通常是因为训练初期回归目标被赋予的权重太大导致梯度爆炸。建议把分类和回归两个损失的初始权重设得相对平衡训练稳定后再逐步调整。5.2 跟踪时框的抖动很厉害怎么办如果你遇到跟踪时目标框抖动明显的问题首先要检查回归分支的输出是否有做平滑处理其次要检查中心先验的权重是否设置合理。SiamFC推理时对连续帧之间的预测结果没有做时序平滑所以如果单帧的回归预测偶尔出现异常值框就会有明显跳动。一个低成本且有效的办法是在连续帧之间对预测框做简单的指数滑动平均用当前帧预测值和上一帧最终值的加权平均作为本帧输出。我自己的经验是指数滑动平均的系数取0.3到0.5之间比较合适。系数太小平滑效果不明显系数太大目标快速运动时框会跟不上。5.3 如何把这个结构迁移到自己的项目里SiamFC不只是目标跟踪专用它的设计思路在视频目标检测、多目标跟踪甚至某些图像分割任务里都可以迁移。特别是G1和G2——分类回归解耦、感受野对齐——这两条准则在任何一个“既要识别目标类别又要回归目标几何属性”的任务里都是通用的。如果你想在自己的框架里用SiamFC我给你的建议是先只改标签分配策略测试性能变化确认有提升后再动网络结构。因为标签分配策略的改动对性能影响最直接而且改动成本最低。等标签这块稳定了再考虑是否引入解耦分支、调整感受野。这是我自己试过多次之后觉得最稳妥的迁移路径。6. 对后续跟踪器的影响与个人思考SiamFC之后目标跟踪领域出现了明显的两极分化一派继续在锚框和候选区域的道路上修修补补另一派开始正视“目标估计”这件事本身。后来的Ocean、TransT等不少工作都能看到SiamFC的影子特别是“分类分支和回归分支需要分开考虑”这个思想几乎成了后续跟踪器的默认设定。以我个人的经验来看SiamFC最值得学习的并不在于它的得分有多高而在于它的方法论——先把问题拆成准则再让网络结构去贴合准则而不是先设计一个网络再想办法解释它为什么有效。这听起来简单做起来极难因为它要求你对任务本身有足够深刻的理解才有能力提炼出“准则”这种高度抽象的中间产物。如果你正在研究目标跟踪或者正准备在自己的项目里引入跟踪能力SiamFC是一个绕不开的基石。读它的时候建议带上思考题如果让你基于同样的准则重新设计一个跟踪器你会用什么结构来满足这些准则想通了这个问题你对整个目标跟踪领域的理解会上一个台阶。