1. 为什么增量小样本目标检测值得单独写一篇笔记目标检测这个方向常规套路已经相当成熟了。你拿一个 backbone接上检测头准备一批标注数据训上几十上百个 epoch基本都能拿到一个能用的模型。但现实场景很少这么理想化。我接触过的几个实际需求里几乎都绕不开两个问题第一新类别的数据永远只有那么几张标注成本高得离谱第二模型不能每次来了新类别就从头训一遍旧类别的数据可能因为隐私、存储或者授权问题根本拿不到。这两个问题叠在一起就是增量小样本目标检测Incremental Few-Shot Object Detection简称 iFSOD要解决的核心矛盾。它要求模型在只见过少量新类别样本、且无法访问旧类别训练数据的前提下持续地把新类别学进来同时不能把旧类别忘掉。这个设定比单纯的小样本检测更难因为小样本检测通常还允许你保留一个大的基类数据集做联合训练而增量设定直接把这条路堵死了。我读的这篇《Incremental Few-Shot Object Detection》就是冲着这个设定去的。它要回答的问题很具体在基类训练完成之后如何用极少量样本把新类挂到已有检测器上而不破坏原有的特征空间和分类边界。适合读这篇笔记的人我大致分三类一是正在做检测落地、被新类别迭代折磨的工程同学二是刚入门小样本学习、想找一个具体任务切入的研究新手三是需要快速判断这篇方法能不能迁移到自己业务里的技术负责人。下面我按自己的理解把整篇论文拆开讲重点放在设计动机、关键模块和实操时容易踩的坑上。2. 问题设定与整体设计思路拆解2.1 增量小样本检测到底难在哪先把问题定义说清楚。整个训练分两个阶段。第一阶段叫基类训练你有一个数据量充足的基类数据集类别集合记为 C_base正常训一个检测器出来。第二阶段叫增量小样本阶段给你一批新类别 C_novel每个类别只有 K 个标注样本K 通常是 1、5、10 这种量级而且基类的训练数据这时候拿不到了。目标是让模型在 C_base ∪ C_novel 上都能检测。难点的本质是灾难性遗忘和数据稀缺的叠加。如果第二阶段直接拿新类样本去微调整个网络参数量那么大几个样本根本约束不住网络会迅速过拟合到新类旧类的检测性能断崖式下跌。反过来如果你冻结大部分参数只调分类头新类的特征又没被充分学习检测框回归也会受影响。更麻烦的是检测任务不像分类它同时要输出类别和位置新类的定位能力也需要从少量样本里学出来。论文里我印象最深的一个观察是基类训练出来的特征空间其实已经相当通用新类样本在这个空间里并不是完全不可分问题主要出在分类器的决策边界和特征分布的偏移上。这个观察直接决定了后面方法的设计方向——不是去重新学特征而是想办法在已有特征空间里做校准和适配。2.2 整体框架的两阶段设计论文的整体框架可以概括为基类预训练 增量适配两段式。基类阶段用标准检测流程训一个完整的检测器包括 backbone、neck、RPN、ROI head 这些常规组件。增量阶段则冻结绝大部分参数只对少数几个关键模块做调整。为什么这么设计我的理解是检测器的 backbone 学到的是通用的视觉特征边缘、纹理、部件这些底层信息对新类同样有效没必要动。真正需要适配的是高层语义相关的部分也就是分类分支和与类别强相关的特征变换。冻结底层、只调高层既降低了参数量、缓解了小样本过拟合又保留了基类的通用能力一举两得。具体到模块划分论文把增量阶段的可学习部分集中在两个地方一个是特征重加权或校准模块用来缓解新旧类特征分布不一致另一个是分类器的增量扩展用来给新类腾出决策空间。这个划分不是拍脑袋定的而是基于前面那个特征空间已足够通用的观察。我在复现类似思路时也验证过如果连 backbone 一起微调5-shot 设定下旧类 mAP 掉个十几二十个点是常事冻结之后就稳很多。2.3 与联合训练、微调两种朴素方案的对比为了说明这个设计的必要性论文对比了几种朴素方案。我把它们的核心差异整理成表方便对照理解。方案旧类数据新类数据主要问题联合训练需要需要旧类数据往往拿不到不现实全量微调不需要需要严重遗忘旧类新类过拟合仅调分类头不需要需要新类特征学习不足定位差论文方法不需要需要需要精心设计适配模块从表里能看出来论文方法在数据可用性上是最贴近真实场景的代价是设计复杂度上去了。这个取舍我认为是合理的因为工程上拿不到旧数据是硬约束不是可以商量的选项。你不可能要求业务方为了模型迭代把历史数据一直留着尤其是涉及第三方数据的时候。3. 核心模块的细节解析与实操要点3.1 特征校准让新类样本落到该落的位置增量阶段最直接的问题是新类样本的特征分布和基类不一致。基类训练时网络见到的都是基类样本特征空间的某些区域被基类占满了。新类样本进来可能落在一些边缘或者空白区域直接拿去做分类决策边界会非常混乱。论文用的思路是做特征校准通俗讲就是给新类特征做一个变换把它们拉到和基类特征可比的分布上。具体实现上常见做法是学习一个轻量的变换模块输入是 ROI 特征输出是校准后的特征。这个模块参数量很小几个样本就能训起来不会过拟合。这里有个实操要点校准模块的输入特征从哪一层取很关键。取太浅特征语义性不够校准了也没用取太深特征已经高度类别相关校准空间太小。我的经验是取 ROI head 里分类分支之前的那个特征比较合适既有足够语义又还没被分类器污染。论文里也是类似的位置这一点在复现时要特别注意对齐。注意校准模块一定要加正则或者约束否则几个样本训下来它可能学出一个把所有特征都映射到同一个点的退化解表面上 loss 很低实际完全失效。常见做法是加一个恒等映射的约束让校准后的特征不要偏离原始特征太远。3.2 分类器的增量扩展与权重生成分类器这块是 iFSOD 的另一个核心。基类分类器的权重是固定的新类需要新的权重。最朴素的做法是给新类随机初始化几个权重向量然后拿新类样本去训。但几个样本训一个随机初始化的向量效果通常很差。论文采用的是基于基类权重的生成式思路。核心假设是新类的分类权重不应该凭空产生而应该和基类权重有某种关联。比如新类斑马和基类马在特征空间里接近那斑马的分类权重就可以从马的权重出发做调整得到。实现上可以学一个映射函数输入是基类权重或者基类特征的统计量输出是新类权重。这个思路的好处是新类权重从一开始就落在一个合理的区域不需要从零学起几个样本就能微调到位。我在类似任务上试过用基类权重做初始化比随机初始化5-shot 下新类 AP 能高出好几个点而且训练更稳定。具体到权重生成的形式论文里给的是一种带注意力的聚合方式让新类权重自适应地从多个基类权重里借信息。这个设计比简单的平均或者最近邻要灵活因为它不要求新类和某个基类一一对应而是可以组合多个基类的信息。3.3 损失函数的设计与平衡增量阶段的损失函数需要同时照顾新类学习和旧类保持。论文的损失大致分三块新类的分类损失、新类的回归损失以及一个用来约束旧类性能不下降的正则项。新类分类损失和常规检测一样用交叉熵或者 focal loss。回归损失用 smooth L1 或者 IoU 系列。关键是那个正则项它的作用是防止模型在学新类的时候把旧类的决策边界推得太远。常见做法是约束新旧类权重之间的某种距离或者约束特征校准模块的输出不要偏离恒等映射太多。这里有个参数平衡的问题。正则太强新类学不进去正则太弱旧类掉点。论文里给了一个权重系数但实际用的时候这个系数和你的基类数量、新类数量、shot 数都有关不能照搬。我的建议是先在验证集上扫一遍找到旧类掉点可接受、新类又能涨上去的平衡点。通常这个系数在 0.1 到 1 之间具体看数据。3.4 训练策略冻结哪些、训练哪些训练策略直接决定成败。论文的设定是冻结 backbone 和 RPN只训练 ROI head 里的校准模块和分类权重生成模块。这个划分我基本认同但有几个细节值得说。第一BN 层要不要冻结。如果基类训练时 BN 的统计量已经稳定增量阶段最好冻结否则几个样本会把统计量带偏。如果框架支持用 eval 模式跑 BN 更稳。第二ROI head 里的共享卷积要不要动。我的经验是前几层共享卷积冻结只动最后和分类、回归直接相连的部分。第三学习率要设得比基类训练小一个量级左右因为现在是在一个已经很好的解附近做微调步子大了容易崩。提示增量阶段建议用较小的 batch size因为新类样本本来就少。但 batch 太小梯度噪声大可以配合梯度累积。另外每个 batch 里最好保证新旧类样本都有哪怕旧类样本是从基类里留出来的少量样本也比纯新类 batch 稳。4. 完整实操流程与关键环节实现4.1 基类训练阶段的准备基类训练是整个流程的地基这一步没做好后面增量怎么调都白搭。基类数据集要尽量覆盖多样的类别和场景类别数越多、类间差异越大学到的特征空间越通用后面新类挂上去越容易。训练配置上用标准的检测训练流程就行backbone 用预训练权重初始化训到收敛。这里有个容易被忽略的点基类训练时最好留出一部分类别不参与训练专门用来模拟增量阶段的新类。这样你才能在没有真实新类数据的时候先验证整套增量流程是否 work。论文里的实验也是这么做的把数据集按类别划分成基类和新类两组。基类训练完成后建议把 backbone 和 RPN 的参数冻住存一份增量阶段直接用。同时把基类分类器的权重也存下来后面生成新类权重要用。这些中间产物管理好复现的时候能省很多事。4.2 增量阶段的数据组织增量阶段的数据组织有几个讲究。每个新类 K 个样本这 K 个样本怎么选很关键。如果随机选可能选到一些质量差的样本影响很大。实际操作中如果条件允许尽量选那些目标清晰、遮挡少、尺度适中的样本。如果只能随机那就多跑几次取平均减少方差。数据增强在增量阶段要慎用。常规检测里常用的 mosaic、mixup 这些强增强在小样本设定下可能引入噪声因为样本本来就少增强后的分布可能偏离真实分布。我的建议是只用一些温和的增强比如随机翻转、小幅度缩放和颜色抖动。论文里也是偏保守的增强策略。另外新旧类的样本比例要控制。如果新类样本太少一个 batch 里全是新类旧类的正则就形同虚设。可以在每个 batch 里混入少量基类样本如果允许保留的话或者用基类特征的统计量做正则间接约束旧类性能。4.3 关键参数的计算与选择增量阶段有几个参数需要仔细调。第一个是学习率。基类训练可能用 0.01 或者 0.02增量阶段我一般从 0.001 开始试最多到 0.005。因为现在只训少量参数而且是在好解附近微调学习率大了容易震荡。第二个是训练轮数。小样本设定下训太多轮必然过拟合。5-shot 的话我通常训 50 到 100 个 iteration 就停看验证集上新类 AP 不再涨、旧类 AP 开始掉的时候就该停了。早停在这个任务里特别重要。第三个是前面提到的正则权重。这个没有固定值得扫。我一般设几个候选值比如 0.1、0.3、0.5、1.0跑一遍看新旧类的 trade-off 曲线选一个旧类掉点不超过 2 个点、新类尽量高的点。第四个是特征校准模块的维度。这个模块通常是个小的 MLP 或者线性层隐层维度不用太大256 或者 512 就够。太大了参数多小样本训不动太小了表达能力不够校准效果差。4.4 评估方式与指标解读评估的时候要同时看新类和旧类的性能。常用的指标是新类 mAP、旧类 mAP以及两者的调和平均。调和平均这个指标很关键因为它惩罚偏科。如果你只顾新类旧类掉得厉害调和平均会很难看。论文里还报告了不同 shot 下的结果1-shot、5-shot、10-shot 都有。看结果的时候要注意shot 数增加新类性能提升是正常的但旧类性能可能反而下降因为新类样本多了模型更容易偏向新类。这个 trade-off 在解读结果时要心里有数。还有一个容易被忽略的点评估时用的旧类测试集和新类测试集要分开不能混在一起算一个总 mAP否则看不出新旧类的分别表现。论文里是分开报的复现时也要对齐。5. 常见问题与排查技巧实录5.1 新类 AP 上不去怎么办这是最常见的问题。排查思路按顺序来先看新类样本的特征有没有被正确校准可以把校准前后的特征可视化一下如果校准后新类样本还是散得很开说明校准模块没学好可能是学习率太大或者正则太强。再看分类权重生成是否合理把生成的新类权重和基类权重做个相似度分析如果新类权重和所有基类权重都正交那说明生成模块没起作用退化成随机初始化了。如果这两个都正常那可能是 shot 数太少信息量不够。可以试试用更强的数据增强或者引入一些无标注的新类数据做半监督。论文里没展开半监督但实际场景里这是个可行的补充方向。5.2 旧类性能掉得厉害怎么办旧类掉点说明正则不够或者学习率太大。先把正则权重调大试试如果调大后新类也学不进去那就是平衡点没找对需要更细地扫。另一个可能是校准模块把旧类特征也带偏了这时候可以给校准模块加一个只对新类生效的 mask让旧类特征走恒等映射。还有一个隐蔽的原因BN 统计量被新类样本带偏了。如果增量阶段 BN 没冻结几个新类样本就能把统计量拉到一个奇怪的位置旧类特征经过 BN 后分布全变了。解决办法就是冻结 BN用基类训练时的统计量。5.3 训练不稳定的排查小样本训练不稳定是常态梯度噪声大。除了前面说的梯度累积还可以用 EMA指数移动平均来平滑参数更新。EMA 在增量阶段特别有用因为它相当于对多个 iteration 的参数做平均能显著降低方差。另外初始化也很关键。新类权重生成模块的初始化如果不好前几个 iteration 可能就崩了。建议用较小的初始化方差或者干脆从恒等映射开始让模型先学会不改变再慢慢学改变。5.4 常见问题速查表现象可能原因排查方向新类 AP 低校准失效/权重生成退化可视化特征、分析权重相似度旧类 AP 掉正则不足/BN 偏移调正则、冻结 BN训练震荡学习率大/初始化差降学习率、EMA、调初始化过拟合新类训练轮数多/增强弱早停、加温和增强新旧类都不行基类训练不充分回退检查基类模型6. 这套方法能迁移到什么场景增量小样本检测的落地场景其实比想象中多。电商商品检测新品类不断上架每个品类初期只有几张图工业质检新缺陷类型出现时样本极少遥感目标检测新目标类型标注成本极高。这些场景的共同点都是类别动态增长 标注稀缺正好是 iFSOD 的靶心。迁移的时候要注意论文的设定是类别增量不是域增量。如果你的新数据不仅类别新域也变了比如从白天变到夜晚那单纯的特征校准可能不够还需要考虑域适配。这是两个不同的问题别混在一起。另外实际部署时还要考虑推理效率。增量阶段加的模块如果太重推理时会拖慢速度。论文里的校准模块和权重生成模块都比较轻量这是它适合落地的一个原因。如果你自己设计也要把参数量和计算量控制住别为了涨点把模型搞得跑不动。我个人在复现这类方法时的体会是基类训练的质量决定了上限增量阶段的设计决定了下限。基类训得好增量随便调调都不会太差基类训得烂增量阶段再怎么设计也救不回来。所以如果你要上手这个方向先把基类训练这一环做扎实别急着上增量模块。