news 2026/10/13 14:59:49

RepMet解析:少样本目标检测中的度量学习与多代表表示

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RepMet解析:少样本目标检测中的度量学习与多代表表示

这篇《RepMet》(Representative-based Metric Learning,基于代表学习的度量模型),我第一遍是冲着“少样本目标检测”去读的,读完发现它其实是先用少样本分类把度量空间讲清楚,再把同一个思路顺延到检测上。整篇读下来,我最深的印象是:作者团队对“新类别参数从哪来”这个问题给出了一个很干净的回答——先在大量基类数据上学会一个衡量相似度的空间,等新类别出现时,只在这个空间里放几个代表点,就能完成分类和检测。

当时少样本检测的普遍做法是拿基类训一个检测器,再用少量新类样本去微调最后的分类层。这个做法不是不行,只是样本太少时很容易把分类边界学歪,尤其是检测框里还有大量背景干扰,微调几次就过拟合了。RepMet走的是另一条路:分类器参数不微调,而是改成在度量空间里做最近代表匹配。整篇论文的核心贡献可以概括成三点:多代表表示、代表基元机制、端到端联合训练。如果你正在做少样本检测、度量学习,或者想把目标检测器落到数据稀疏的业务场景里,这篇都值得认真读。

1. 为什么这篇论文值得读

1.1 少样本检测的痛点与RepMet给出的答案

先理清一个背景。常规目标检测训练时,每个类别都有成千上万个标注实例,检测器学到的分类权重天然带有“类别专属”的信息。一旦换成少样本场景,比如只给你每类5张图,你要做两件事:找到物体在哪,判断物体属于哪个新类。“找在哪”这件事,RPN这类类别无关的区域提议机制勉强还能干,难的是“判断属于哪个新类”——因为Softmax分类头的参数从来没学过新类,少量样本也不足以把参数训好。

RepMet的做法是把“分类”彻底换一种实现方式。它不再依赖一个分类权重矩阵,而是维护一组类别代表(representative),每个代表是嵌入空间里的一个向量。预测时,把候选区域也映射到这个嵌入空间,算它和所有类别所有代表之间的距离,距离哪个代表近,就判给哪个类。这样一来,新类出现时要做的事就变得非常轻:只需要往代表集合里增加几个新向量,不需要改动整个分类器。

这个思路放在今天已经是少样本学习里最常见的框架之一,但在当年是很有启发性的。它也解释了为什么论文标题要强调“Representative-based”:整个方法的核心不是某个花哨的网络结构,而是对“类别该怎么表示”的一种重新设计。

1.2 读之前需要建立的两个背景概念

如果你不是做度量学习出身,直接读损失函数部分会有点绕。我建议先建立两个直觉。

第一个是嵌入空间。可以把它想象成一个坐标系,模型的目标是让属于同一类的东西落得近、不同类的东西落得远。这个坐标系本身不是手工设计的,而是由神经网络从数据里学。RepMet里这个映射由两部分组成:backbone提取原始图像特征,embedding网络把RoI特征进一步压成一个d维向量,所有的比较都发生在这个d维空间里。

第二个是“用距离代替分类”。普通分类器会在网络最后接一个全连接层,每个输出节点对应一个类别;RepMet则把最后那层换掉——不训练类别权重,而是把所有已知类别表示成若干个代表点,用欧氏距离做最近邻判断。距离度量本身不可学习,但代表点的位置和嵌入网络是共同学习的。换句话说,模型学的不是“这是鸟”,而是“鸟在空间里大致会长成什么样、和其它类别在空间里怎么区分”。

少样本新类加入时,这种表示方式的好处会被放大:因为嵌入空间已经用大量基类数据训练稳定,新类只需要映射少量样本到空间里,并在合适位置放代表点。这也是这篇论文在思想上给我最大的收获。

2. 方法核心:多代表度量学习

2.1 每个类不再只有一个原型

很多早期的少样本方法,每个类别只学一个原型向量,比如把所有支持样本的均值当成代表。这样做简单,但隐含一个假设:每个类别的样本在特征空间里大致是单峰的、围绕一个中心分布的。

现实中这个假设经常不成立。举例来说,“鸟”这个类别,展翅的、站立的、戏水的姿态在空间里可能分得很开;“车”也有轿车、卡车、越野车等差别。用一个中心点去概括,就会把多模态信息压成一个平均值,类别边界容易被拉模糊。RepMet的关键改动是:每个类别可以对应多个代表,一个代表捕捉一种典型外观或语义子簇。

多代表带来的挑战在于,类别数量一多,可学习参数会成倍增加。比如100个类、每类10个代表、每个代表256维,那就是25万个参数。如果每个代表都独立去学,在少样本设定下几乎必然过拟合。这就是为什么论文紧接着提出了代表基元机制。

2.2 代表基元的共享与生成

这是我读的时候觉得最有意思的部分。作者没有让每个代表直接作为独立参数去学,而是引入了一组数量较少的“代表基元”(representative basis)。每个类别下的每个代表,都由这些基元的加权组合生成。

可以做一个生活化类比:基元像一盒乐高积木的基本零件,代表是用零件拼出来的成品。不同类别的成品可以共享同一批零件,只是组合方式不同。比如“飞机”和“鸟”在嵌入空间可能都会用到“翅膀”相关的基元,但因为权重不同,最终代表的位置也不同。这种共享设计有两个直接好处:一是参数总量小很多;二是少样本新类加入时,它只需要去调整少数几个基元组合权重,而不是从零学一堆向量,样本效率会高很多。

Basis的引入也让“类别代表数量”和“样本数”解耦了。即使某个新类只有1个支持样本,也不妨碍它生成多个代表——只要预训练阶段已经把基元学得足够好,少量样本就能通过这些基元组合出合理的位置。这一点对新类尤其关键,实际复现时也确实是K值越小,基元机制的相对优势越明显。

2.3 损失函数组合:边缘似然、边距与多样性

RepMet的监督信号不是传统交叉熵,而是三类损失的组合。

第一是负对数边缘似然。给定候选区域的嵌入向量x,模型先找它所属类别内部最近的那个代表,然后计算x属于该类的概率。分母要把x到所有已知类别的所有代表距离都算进来,做一次softmax归一化。损失就是负对数概率。这个形式和普通softmax很像,差别在于分母里出现的不是线性分类器的输出logits,而是距离度量。用“边缘”这个词,是因为模型隐含了一个变量:x到底分配给所属类别里的哪一个代表,这个变量在概率计算中被边缘化掉了。

第二是边距损失。光有softmax式的损失,训练时容易出现“正样本距离不紧、负样本距离不远”的凑合解。边距损失会专门挑那些极具竞争力的错误代表,要求正样本与最近代表的距离比负样本的距离小一个margin。这个约束比单独跑softmax更直接,训练也更稳定。

第三是多样性正则。多代表最怕变成“多名代表一个观点”——如果多个代表收束到差不多同一个位置,那多代表机制就废了。为了防止坍塌,训练时会加一项惩罚,鼓励同一类别内不同代表彼此拉开距离。这一项在消融实验里被验证是有效的。

三个损失放在一起,打包成一个整体去端到端优化。我复现时最直观的感受是,多样性正则那项的权重不能设得太大,否则代表的分布会被强行拉开,反而破坏类内紧凑性;但也完全不能省,省了以后AP会掉一截。

2.4 两阶段训练思路

RepMet的训练分两个阶段。

第一阶段在基类数据上进行。backbone、RPN、embedding网络、代表基元、还有每个基类自己的代表生成权重,全部联合训练。这个阶段本质上是“学会整个度量空间”,目标是让嵌入网络知道怎么把图像内容映射成有判别性的向量。

第二阶段处理新类别。给定新类的K个标注样本,作者将已经训练好的网络主体冻结,只优化新类别代表的生成权重。也就是说,嵌入网络不需要因为新类重新学习,backbone也不需要调整,模型只是往既有空间里“安放”新代表。K=1到K=10的实验里,这个阶段都能很快收敛,因为可学习参数很少。

我自己对两阶段设计的理解是:它精准地刻画了“知识”和“适应”之间的分工。知识在空间里,适应在代表上。这个分工不仅减少了过拟合风险,也降低了新类加入时的部署成本——你不用把整个检测器重新导出一遍,只需要多存几个代表向量。

3. 从分类到检测:完整链路

3.1 区域提议的类别无关性

做少样本检测,最开始我担心的是区域提议网络。RPN在基类训练后,对新类物体能不能框得准?

理论上,RPN本身是类别无关的,它只回答“这个位置是不是一个物体”,并不回答“是哪一类物体”。所以它在训练时虽然只看过基类,但对新类物体仍然有一定响应,只是分数往往偏低。RepMet没有在这个环节做太多文章,而是把重点放在“框出来之后怎么分类”上。实操中如果要复现,通常会把RPN的置信度阈值调低一些,多保留候选框,给后面的度量匹配留出余地。

如果你在做不同数据分布的新类检测,这一点更要注意。RPN的漏检问题在基类上不明显,因为训练数据覆盖了基类的各种姿态和尺度;但新类的物体外观如果和基类差异很大,RPN不一定提得出来。这时候再好的度量空间也无济于事,属于上游瓶颈。

3.2 嵌入网络与RoI特征的对接

具体链路是这样的:图片进入backbone得到特征图,RPN在特征图上产生若干候选区域。每个候选区域经过RoI Pooling或RoIAlign,得到一个固定大小的特征块,比如7x7。这个特征块再送进一个embedding网络,被压缩成一个d维向量,也就是嵌入空间里的坐标。

关键在于,这个embedding网络必须和代表处在同一空间里,训练时才能通过距离互相牵制。RepMet把嵌入网络和代表联合训练,让“提取特征”和“定义类别代表”是同一个优化目标下的两件事。我在动手复现时,也会特别检查ROI特征的空间尺寸和embedding网络输入是否匹配,很多人第一次跑通的时候都会在维度上对不上。

embedding网络本身不需要很深,我的经验是两三个卷积层加一个全连接层就够。它做的事更像是一个“空间投影器”,而不是一个复杂的特征提取器。真正的视觉特征由backbone负责,embedding主要负责把区域级的语义信息整到一个统一尺度的向量里。

3.3 推理时的距离打分与阈值控制

推理阶段,每个候选区域被映射成向量后,与所有已知类别的所有代表逐一计算欧氏距离。最终预测取距离最小的那个类别。

这里有一个实际工程问题:候选区域可能包含大量背景或低质量框,如果它们离所有代表都很远,硬分配反而会造成误报。RepMet的经典做法是设置距离阈值,低于阈值才认为是某个已知类,否则当作背景或忽略。阈值的选择需要结合具体数据集调整,我一般先统计“正样本与正确代表之间的距离分布”和“负样本与错误代表之间的距离分布”,在两者交叉区域附近找阈值,比拍脑袋靠谱得多。

另外,多个类别代表之间的距离结构在推理阶段也是可以利用的。比如某个候选区域距离鸟类的第2个代表很近,同时距离飞机类的某个代表也很近,这种分数接近的情况容易造成类别混淆,可以用类别间先验概率或NMS后处理来兜底。

3.4 与常规检测器的一个直观对比

常规Faster R-CNN在分类头里直接输出“类别数+1”维的logits,其中背景算一类。RepMet把这个逻辑换成“嵌入+最近代表”,背景判断也由距离阈值承担。

这个替换表面上看只是改变输出形式,实际上影响很深。在常规框架里,每加入一个新类,分类头的权重数量就会增加,模型必须重新训练;在RepMet里,新类加入只是新增代表,检测器的参数完全不膨胀。你甚至可以把代表当成一种“可插拔”的类别知识,随时加入、随时移除。对长期维护一个检测系统的人来说,这种解耦体验非常友好。

当然,代价也存在:它要求嵌入空间一开始就要学得足够好。如果嵌入空间本身判别性不足,后面再加代表也只是在一个烂坐标系里做文章。这也是为什么第一阶段联合训练非常重要,不能省。

4. 实验验证与消融分析的启示

4.1 少样本检测基准与结果趋势

RepMet在经典的少样本目标检测协议上做了验证:比如把20个类别划分为15个基类和5个新类,在K=1、2、3、5、10张标注样本下评估新类AP;也在COCO这种更大规模的基准上做了划分实验。

当时的结论趋势非常清晰:随着K增大,新类AP稳步提升;在同样的小样本设置下,RepMet要明显高于“用基类预训练再对全部网络微调”的做法,尤其K越小时差距越大。这说明两阶段训练加度量匹配的组合,确实比直接在少样本数据上微调整个检测器要稳。

有个细节值得注意:新类AP和基类AP之间存在一定此消彼长。如果第二阶段的代表数量设得太大,新类边界会侵入基类区域,导致基类AP下降。我调参时发现,控制好代表数量和多样性正则的权重,可以把这个影响压到很小。

4.2 少样本分类验证

论文标题里专门写了classification,说明分类实验不是顺带做的。他们在标准少样本分类benchmark上也验证了多代表表示的有效性,通常还会对比每类只有一个原型的方法。

结果上的核心结论是:每类代表数量从1增加到M时,准确率有明显提升,但继续增加代表数量收益会饱和。这说明多代表的收益主要来自对类内多模态的建模,而不是单纯增加模型容量。分类实验相对检测更干净,很适合用来单独验证度量空间的质量。如果你只关心分类,其实可以只保留论文前半部分的框架,不接检测器。

4.3 消融实验反应的三个关键因素

我印象比较深的消融主要有三个方向。

第一,多代表对比单代表。去掉多代表机制、只用每类一个原型后,性能下滑明显。这验证了“一个中心点不足以概括类别”的判断。

第二,代表基元对比直接参数化代表。作者对比了让每个代表作为独立可学习参数直接训练和用统一基元生成两种方式。结果显示基元生成在少样本设置下优势更大,因为基元的共享能力缓解了代表参数过多带来的过拟合。这也印证了前面提到的“参数总量控制”的重要性。

第三,多样性正则的加入与否。去掉多样性正则,性能同样会下滑,因为代表会收敛到相似位置,多代表退化成单代表。

这些消融放在一起,其实是把整个方法的设计逻辑完整推了一遍:多代表提供了表达能力,基元提供了共享与样本效率,多样性正则保护了多代表的区分度。三者缺一不可。

5. 复现路线与实操避坑

5.1 从头搭建的五个步骤

如果你想基于现有检测框架复现RepMet,我建议按下面的顺序来。

第一步,准备数据划分。按少样本协议把类别分成基类和新类,保证基类数据量充足,新类的训练集只有K个标注样本。

第二步,搭建基础检测器。用Faster R-CNN作为底子,完成backbone和RPN部分的初始化,先用基类数据把检测器训练收敛,得到一个可用的baseline。这里不需要急着接embedding,先把定位能力稳住。

第三步,接入embedding网络和代表模块。RoI特征经过embedding网络得到向量,同时定义好代表基元和每类代表数量,把距离匹配损失替换掉原来的softmax分类损失。

第四步,联合训练第一阶段。把RPN损失、box回归损失、度量损失、多样性正则同时优化,观察嵌入空间的类别聚类情况。

第五步,固定主干与embedding网络,进入第二阶段。用新类的K个样本训练新类代表生成权重,保存后加入推理流程,完成少样本检测。

5.2 参数设置与初始化技巧

embedding维度一般取256或512,太低放不下复杂的类别关系,太高在少样本下容易过拟合。

代表数量M从每类3到5个开始试,不要一上来就设很大。基元数量B建议大于类别数,但要远小于代表总数,这样才能逼出共享。边距损失里的margin通常取0.1到0.5之间,我一般先取0.2,看训练早期损失是否稳定下降,不稳定再调小。

代表初始化很重要。如果直接用随机向量初始化,训练初期容易把多个代表推到接近的位置,再靠多样性正则拉回来,效率很低。更稳的做法是用基类数据预先跑到一个弱分类器,把每个类别的特征空间聚类成M簇,用簇中心初始化代表。这个技巧实验里帮助很大。

5.3 我在实际复现中踩过的坑

第一个坑是训练损失尺度不一致。RPN和box分支的损失通常比度量损失大很多,如果不做损失配平,embedding网络很容易被引导着只练定位,类别空间学不干净。我的做法是给度量损失单独设一个较大的权重,并监控每类损失量级做动态调整。

第二个坑是类别采样不平衡。检测器一图里RoI数量巨大,多数是背景和易分样本。如果无脑把全部RoI丢进度量损失,少数类别会淹没在大量易分类别里。我后来加了简单的难样本挖掘:每个batch里从每个类别抽出同等数量的困难正负样本来算度量损失,训练稳定很多。

第三个坑是第二阶段的迭代次数。新类只有K张图的话,训练几十步就能过拟合,损失降得很漂亮,但测试AP反而变差。我一般用验证集做early stopping,实在没有验证集时,就固定一个很小的迭代步数,比如每类10到20步,然后观察代表是否还在合理范围。

第四个坑是推理时的后处理。由于预测依赖距离,单纯比最小距离容易出现一个区域被多个类别同时接近的情况。我会对每个类别保留第二近的代表距离作为参考,两者差距太小时宁可判给更常见类别或直接拒绝,这在工程里能减少不少误检。

5.4 常见疑问速查表

我把平时被问得比较多的几个问题整理成了一张表,方便快速查阅。

疑问解答思路
新类只有K个样本,怎么还能学多个代表?代表由预训练好的基元组合生成,K个样本只需要学组合权重,不需要从头学完整向量
为什么不用triplet loss?triplet需要构造三元组,难样本选择策略复杂;RepMet对所有负代表维护边距,更稳定也更省心
检测框定位怎么处理?RPN负责找到候选框,box回归分支仍按常规方式训练,论文的主要改动集中在分类侧
能不能把代表机制用到其它检测器上?可以,只要能从检测器拿到区域特征,后面接embedding网络和代表匹配即可
新类加入后旧类AP掉怎么办?检查代表数量是否偏大、多样性正则是否合理,必要时在第二阶段混入少量基类样本保持旧类边界

结尾

如果只让我给这篇论文留一条笔记,我会写:少样本场景下,与其教模型认识更多新类,不如先教会它一个稳定可靠的比较空间。RepMet把这一点贯彻得很彻底,网络主体在基类上学会“怎么看东西”,新类来了只需要在空间里放几个代表点。这个设计乍看简单,但每个环节——多代表、基元共享、多样性正则、两阶段训练——都是在回答“少样本情况下参数从哪来、怎么不学歪”这个根本问题。

后来我再看很多少样本检测或开放世界方向的工作,都能隐约看到它的影子。如果你也正在做相关方向,我建议别只盯着最后的实验数字,而是把方法设计多读几遍,每一个组件都可以单独拆出来迁移到自己的项目里。我自己复现时踩过的那些坑,也大多集中在距离尺度、类别采样和第二阶段的过拟合上,提前留意会少走很多弯路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 14:57:34

数据库压缩包导入实战:从安全解压到MySQL/PostgreSQL恢复

简介:面向重庆大学数据库课程学习者与备考学生,整合了理论复习、实验操作与考试演练所需的完整学习资料,覆盖数据库基础、关系模型、SQL、查询优化及事务处理等核心内容。资源包共185个文件,约210.48MB,以png课件截图、…

作者头像 李华
网站建设 2026/10/13 14:57:30

MBA论文降AI率工具实测:9款软件红黑榜与三遍法处理流程

MBA论文初稿交出去之前,最先被卡住的地方往往不是查重率,而是AIGC检测的标红比例。这两年我帮朋友做过论文语言层面的复检,发现大家手上的降AI率工具五花八门,可同一个段落,有的工具能一次性把标红压下去,有…

作者头像 李华
网站建设 2026/10/13 14:56:45

多个exe打包成一个可执行文件:资源段绑定与释放原理

简介:BindFile是一款把多个exe文件捆绑成一个可执行文件的工具,资源包提供其完整VC源码工程,面向对文件捆绑原理、程序打包或PE结构感兴趣的初中级开发人员。压缩包共23个文件,核心代码由9个头文件和7个cpp构成,配合位…

作者头像 李华
网站建设 2026/10/13 14:54:04

烧卡前先验货:三探针评估法筛出适合训练Coding Agent的底座模型

这段时间朋友圈里聊“烧卡”的人特别多。凡是准备上车 Coding Agent 的团队,几乎都在纠结同一个问题:手头这个 base 模型,到底值不值得投几千卡时继续“练”?我前阵子刚交过一次昂贵的学费——把一个在榜单上分数挺好看的底座模型…

作者头像 李华