资讯动态

无监督域适应目标检测:从域偏移到落地baseline的完整指南

发布时间:2026/10/15 2:35:03 来源:尧图企业网站定制
1. 当标注预算见底时无监督域适应为什么成了检测器的救命稻草做过目标检测落地的人大概都有过这种体验在实验室或者某个公开数据集上模型跑出来的mAP漂亮得能写进汇报PPT可一旦换到真实业务场景——换个摄像头型号、换个光照条件、换个城市街景、换个产品缺陷类型——指标立刻断崖式下跌。更让人头疼的是重新标注一批目标域数据成本高得离谱。一张图里框十几个目标标注员要逐个拉框、选类别、处理遮挡和截断一个中等规模的数据集动辄几万到几十万人民币周期还长。这就是无监督域适应Unsupervised Domain Adaptation, UDA在目标检测领域被反复研究的根本原因。它的设定很明确源域有充足标注目标域只有图像、没有任何标注目标是让在源域上训练好的检测器在目标域上也能打。注意这里的关键词是“无监督”——目标域一个框都没有模型只能靠图像本身的统计特性、风格差异、特征分布去“猜”怎么迁移。我最早接触这个方向是在一个工业质检的模拟项目里。源域是用标准光源、固定角度拍的产品图标注齐全目标域是产线上不同工位、不同批次、光照抖动的实拍图一张标注都没有。当时试过直接把源域模型拿过去推理mAP从源域的0.78掉到目标域的0.31几乎不可用。后来系统性地研究了UDA检测的几条主流路线才把指标拉回到0.6以上。这个过程让我意识到UDA检测不是“调个参”就能解决的事它涉及特征对齐、伪标签、风格迁移、对抗训练等一整套方法论。这篇内容适合三类人看一是正在做检测落地、被域偏移折磨的工程师二是想进入这个方向的研究生或算法同学三是对域适应有基础认知、想系统梳理检测场景特殊性的从业者。我会把UDA检测的核心矛盾、主流方法族、实操中的坑、以及评估时容易忽略的细节都拆开讲尽量做到看完能自己动手搭一版baseline。2. 检测任务做域适应比分类难在哪几个地方2.1 分类对齐的是全局特征检测还要对齐“位置类别尺度”图像分类的域适应相对成熟因为它的输出是一个全局的类别分布对齐两个域的特征分布时只需要在特征空间拉近源域和目标域的边缘分布或条件分布即可。但目标检测的输出是一组边界框每个框包含位置x, y, w, h、类别、置信度。这意味着域偏移不仅影响“这是什么”还影响“在哪里”和“有多大”。具体来说源域和目标域之间的差异会体现在三个层面外观层面颜色、纹理、光照、天气、语义层面同一类物体在不同域里的形态差异比如城市里的车和乡村里的车、布局层面目标出现的频率、共现关系、尺度分布。分类任务主要受前两层影响检测还要额外处理第三层。更麻烦的是检测器的特征图是空间相关的背景区域和前景区域的特征混在一起如果粗暴地对整张特征图做对齐背景噪声会把对齐信号带偏。我在模拟项目里做过一个对比实验用同样的对抗对齐策略分类任务的域适应能提升约15个点检测任务只提升了6个点而且训练极不稳定。原因就是检测的ROI特征里混入了大量背景对齐时这些背景特征互相拉扯导致前景特征反而没对齐好。2.2 伪标签在检测里的噪声放大效应无监督域适应的另一条主流路线是伪标签自训练先用源域模型在目标域上推理把高置信度的预测当伪标签再拿这些伪标签去微调模型。分类任务里伪标签就是一个类别标签错了顶多影响一个样本。但检测里一个伪标签是一个框框的位置偏几个像素、类别选错、或者把背景框成前景都会直接污染回归损失和分类损失。更严重的是检测的伪标签存在确认偏差模型在目标域上本来就预测不准高置信度的框往往集中在那些和源域长得像的简单样本上真正难的目标小目标、遮挡目标、罕见类别反而置信度低被过滤掉了。结果模型越训越偏向简单样本难样本永远学不到。我在实际调参时发现如果伪标签阈值设0.7目标域上只有约30%的GT能被覆盖设0.5覆盖到55%但噪声框比例从8%涨到22%。这个权衡非常难拿捏。2.3 域偏移在检测里的非对称性还有一个容易被忽略的点域偏移不是均匀分布的。在自动驾驶场景里源域是晴天白天目标域是雨天夜晚那么远处的小目标、反光路面、雨滴遮挡区域受到的偏移远大于近处的大目标。如果对整个图像一视同仁地做对齐近处容易对齐的区域会主导损失远处难对齐的区域被忽略。这就引出了检测UDA里的一个核心设计原则对齐要分区域、分尺度、分难度。后面讲方法时会看到很多工作专门设计了前景感知的对齐、多尺度对齐、以及基于不确定性的加权对齐都是为了解决这个非对称性问题。3. 主流方法族的底层逻辑与代表思路3.1 对抗式特征对齐让判别器分不清特征来自哪个域对抗式对齐是UDA检测里最经典的一类方法。核心思路是在检测器的特征提取器后面接一个域判别器判别器的任务是判断特征来自源域还是目标域特征提取器的任务是骗过判别器。两者对抗训练最终特征提取器学到的特征在源域和目标域上分布一致。但直接套用分类里的GAN式对齐效果很差因为检测的特征图有空间维度背景区域占了大头。所以改进方向主要有两个一是前景感知用源域的GT框生成前景mask只对前景区域的特征做对抗对齐二是层次化对齐在多个特征层级浅层、中层、深层分别接判别器因为浅层特征偏纹理和边缘深层特征偏语义域偏移在不同层级的表现不一样。我实测下来在FPN的P3、P4、P5三层分别加判别器并且只对前景ROI特征做对抗比只在最后一层做全局对抗稳定得多。训练时判别器的学习率要设得比检测器小否则判别器太强会导致梯度爆炸。一般判别器lr设为检测器的0.1倍对抗损失的权重从0.1开始 warm-up逐步加到1.0。3.2 伪标签自训练从“硬伪标签”到“软伪标签”的演进伪标签路线的演进很有意思。早期做法是硬阈值筛选置信度大于某个值就保留否则丢弃。但前面说了硬阈值会丢难样本。后来出现了软伪标签不直接取argmax而是用模型输出的类别概率分布作为软目标配合温度系数做蒸馏。这样即使某个框的置信度不高它的概率分布里也包含了类别间的相对关系信息量比硬标签大。再往后是教师-学生框架维护一个教师模型通常是学生模型的EMA教师模型在目标域上生成伪标签学生模型去学习。教师模型的参数更新更平滑生成的伪标签更稳定。这个思路在检测UDA里效果很好因为检测对伪标签噪声敏感EMA带来的稳定性提升很明显。还有一个关键技巧是类别平衡采样。目标域里如果某些类别特别少伪标签里这些类别的样本也少模型会偏向多数类。我通常会在生成伪标签后按类别做重采样让每个类别在训练batch里的比例大致均衡。这个操作在模拟项目里让稀有类的AP提升了约4个点。3.3 风格迁移与图像级对齐把目标域“翻译”成源域风格另一条路线不走特征对齐而是直接在图像层面做转换。典型做法是用CycleGAN之类的模型把目标域图像转换成源域风格然后用源域模型去推理转换后的图像。这样检测器看到的输入分布和训练时一致域偏移被“绕过”了。但这条路有个致命问题风格迁移会引入伪影。转换后的图像可能在纹理上像源域但物体的几何结构、位置关系被改变了检测器反而会框错。我在实验里见过把夜晚的车灯转换成白天风格后车灯被误检成独立目标的案例。所以纯图像级方法通常要和特征级方法结合使用或者用语义一致性损失约束转换前后检测结果的一致性。3.4 自监督辅助任务用目标域的无标注数据学表征目标域虽然没有框标注但有大量图像。可以设计自监督任务让模型在目标域上学到有用的表征比如对比学习同一张图的不同增强视图特征要接近、旋转预测判断图像被旋转了多少度、拼图还原把图像切块打乱后还原顺序。这些任务不需要标注但能让特征提取器适应目标域的统计特性。在检测UDA里自监督通常作为辅助损失加在主检测损失旁边权重不需要太大0.1到0.3即可。我试过在目标域上加对比学习损失配合对抗对齐目标域mAP比纯对抗提升了约3个点。但要注意自监督任务的设计要和检测任务相关比如对比学习的增强不能破坏物体的语义否则学到的表征对检测没帮助。4. 从零搭一版UDA检测baseline的实操路径4.1 环境与数据准备源域和目标域的划分策略假设你手头有一个标注齐全的源域数据集比如模拟场景A的检测数据和一个无标注的目标域数据集模拟场景B的图像。第一步是确认两个域的类别空间一致——如果目标域出现了源域没有的类别那就是开集域适应问题复杂度会高一个量级建议先做闭集。数据准备阶段要做几件事源域按正常检测数据集组织目标域只需要图像不需要标注文件。但为了评估你需要留出一小部分目标域标注作为测试集这部分标注绝对不能参与训练。我见过有人不小心把目标域测试集的标注泄漏到伪标签生成里结果指标虚高十几个点实际部署时原形毕露。目录结构建议这样组织data/ source/ images/ annotations/ target/ images/ # 无标注 target_test/ images/ annotations/ # 仅用于评估4.2 模型选型为什么我优先选带FPN的two-stage或anchor-free检测器UDA检测的基座模型选择很关键。我一般优先选带FPN的Faster R-CNN或者FCOS这类anchor-free检测器。原因有三一是FPN提供了多尺度特征方便在不同层级做对齐二是two-stage的ROI特征天然区分前景和背景做前景感知对齐更自然三是anchor-free检测器少了anchor匹配的复杂性伪标签生成时更直接。不建议一上来就用DETR类模型做UDA因为DETR的二分匹配和集合预测机制让伪标签的生成和对齐都更复杂调参空间太大不适合快速验证想法。4.3 训练流程三阶段还是端到端我推荐的训练流程是三阶段源域预训练在源域上正常训练检测器直到收敛。这一步得到基础模型。域适应训练加载源域模型加入对抗对齐损失和伪标签损失在源域目标域上联合训练。对抗损失权重从0.1 warm-up到1.0伪标签阈值从0.7逐步降到0.5。目标域微调用最终模型在目标域上生成伪标签筛选高置信度样本做几轮微调。这一步学习率要小1e-5量级。端到端训练虽然理论上更优雅但实际调参时很容易崩尤其是对抗损失和检测损失的量级不匹配时。分阶段训练给了你更多干预机会哪一步出问题可以单独排查。4.4 关键超参的取值经验下面这张表是我在多个模拟项目里总结的超参经验值供参考超参推荐值说明对抗损失权重0.1 → 1.0 warm-up前期小权重避免破坏源域特征判别器学习率检测器的0.1倍判别器太强会导致梯度爆炸伪标签初始阈值0.7逐步降到0.5配合类别平衡伪标签损失权重0.5太高会过拟合噪声自监督辅助损失权重0.1-0.3太高会干扰检测主任务目标域微调学习率1e-5比源域训练小一个量级注意这些值不是万能公式不同数据集的最优值可能差很多。建议先用小规模数据做超参搜索再放大到全量。5. 训练不稳定、指标不涨时怎么排查5.1 对抗损失震荡判别器太强还是太弱对抗训练最常见的问题是损失震荡。如果判别器loss迅速降到接近0说明判别器太强特征提取器骗不过它梯度会爆炸。解决办法是降低判别器学习率或者给判别器的输入加噪声。反过来如果判别器loss一直在0.7左右下不去说明判别器太弱对齐没效果需要提高判别器学习率或增加判别器层数。我通常会在训练日志里同时监控判别器在源域和目标域上的准确率。理想状态是判别器准确率在0.5到0.7之间波动说明它分不太清但又不是完全瞎猜。如果准确率稳定在0.9以上对齐基本没起作用。5.2 伪标签越训越偏确认偏差的识别与缓解伪标签自训练如果发现目标域指标先涨后跌大概率是确认偏差发作了。识别方法是统计每轮伪标签的类别分布和位置分布如果发现某些类别逐渐消失、或者框的平均尺寸越来越单一就是模型在自我强化简单样本。缓解手段有三个一是类别平衡重采样强制每个类别在batch里占一定比例二是伪标签衰减对连续多轮都被判为高置信度的样本降低权重避免模型反复学同样的东西三是引入目标域的自监督损失让特征提取器持续接触目标域的多样性不被伪标签带偏。5.3 目标域指标虚高评估集泄漏的隐蔽形式评估集泄漏不一定是直接把测试标注喂给模型。隐蔽的形式包括在目标域上做超参搜索时用了测试集指标、伪标签生成时用了测试集图像、风格迁移模型在测试集上训练过。这些都会让指标虚高。我的做法是目标域测试集在训练全程完全不碰超参搜索用目标域的一个小验证集从训练图像里划有标注但极少最终报告才用测试集。虽然麻烦但指标可信。6. 评估指标之外部署前还要看什么6.1 按难度分层的指标拆解整体mAP涨了不代表所有场景都变好。我习惯把目标域测试集按目标尺度小/中/大、遮挡程度无/部分/严重、光照条件白天/夜晚/逆光分层分别算AP。经常出现整体涨了3个点但小目标AP反而掉了2个点的情况。这种模型部署到实际场景里远处的小目标漏检会更严重。6.2 推理速度与显存占用UDA训练时加的判别器、伪标签生成、自监督分支在推理时都不需要所以推理速度和原始检测器一样。但如果你用了风格迁移做预处理推理时就要额外跑一个生成网络延迟可能翻倍。部署前一定要测端到端延迟别只看检测器本身。6.3 域偏移的在线监测模型上线后目标域的分布还可能继续漂移比如季节变化、设备老化。可以监控推理结果的置信度分布、类别分布、框尺寸分布一旦发现和训练时差异过大就触发重新适应。这个机制在工业场景里特别有用我见过因为镜头积灰导致图像整体模糊模型指标慢慢下滑但没人发现的情况。7. 几个容易踩的坑和我的应对习惯第一个坑是源域模型没训好就急着做域适应。源域模型如果本身没过拟合、没收敛域适应只会放大问题。我的习惯是源域模型在源域验证集上的mAP至少要到0.7以上才开始做适应。第二个坑是对抗对齐加得太早。训练初期特征提取器还没学好源域特征这时候加对抗会让它学出一堆域不变但没判别力的特征。我一般先让源域损失单独跑几个epoch等loss稳定了再加对抗。第三个坑是忽略背景区域的对齐。只对齐前景ROI特征虽然干净但目标域的背景分布和源域差异很大时检测器会把目标域的背景误检成前景。我的做法是前景对抗为主背景对抗为辅背景损失权重设前景的0.3倍左右。第四个坑是伪标签阈值一刀切。不同类别的置信度分布不一样稀有类的置信度天然偏低。我通常按类别分别设阈值稀有类阈值降0.1到0.15保证它们能进入训练。第五个坑是不做消融就堆模块。对抗、伪标签、自监督全加上指标涨了也不知道是哪个起的作用。我的习惯是每加一个模块都单独跑一组对照确认增益来源再决定是否保留。8. 这个方向后续还能怎么挖从最近的趋势看UDA检测正在往几个方向走。一是多源域适应不只有一个源域而是多个不同风格的源域如何融合它们的知识是个开放问题。二是开集和开放集适应目标域出现源域没有的类别时模型不仅要适应还要拒绝未知类。三是在线适应模型部署后持续从目标域的无标注流数据里学习这对训练稳定性和计算开销要求更高。四是和基础模型结合用大规模预训练的视觉基础模型做特征提取减少对源域标注的依赖。我自己比较看好的是在线适应自监督的组合因为实际业务里目标域数据是持续产生的一次性离线适应很难覆盖所有变化。但这个方向对工程实现的要求也高需要设计好数据缓冲、模型更新频率、回滚机制。如果你正在做相关落地建议先从离线适应跑通再逐步过渡到在线。最后分享一个我在调参时的小习惯每次实验只改一个变量并且把目标域验证集的分层指标都打出来。看起来慢但能避免“指标涨了但不知道为啥涨”的尴尬。UDA检测的随机性本来就大控制变量是唯一能让你看清因果的办法。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑