做旋转目标检测的朋友应该都有同感:模型结构越来越复杂,性能涨得也快,但标注成本始终是绕不过去的一道坎。水平框只要拉一个矩形,旋转框却要精确定位五个参数(中心点、宽、高、角度),在遥感影像里密密麻麻的船、飞机、油罐上一个个抠角度,一天标不了几百个目标。最近某高校团队放出来的这个弱监督旋转目标检测框架,恰好踩在这个痛点上——它想做的事情很简单:把标注成本打下来,同时让旋转框检测精度尽量不掉队。
这套工作公布在计算机视觉领域某顶级学术会议上,整体思路是在弱监督条件下做旋转目标检测。所谓弱监督,大白话就是不给你完整的旋转框标注,只给更便宜的标注形式,比如图像级标签、水平框,甚至点标注,让模型自己学会把目标的“朝向”和“紧致包围”信息从数据里挖出来。对于遥感、航拍、工业质检这类场景,这项工作的实际价值很大。这篇文章我从头到尾拆一遍:它解决什么问题、框架怎么设计、训练怎么做、实测有哪些坑,以及落地时该怎么调整。不管你是刚入门的小白,还是已经在调旋转框模型的老手,应该都能找到有用的东西。
1. 弱监督旋转目标检测,到底在解决什么难题
1.1 旋转框标注为什么这么贵
很多人第一次接触旋转目标检测,是在遥感数据集上看到那种带角度的框,第一反应是“不就是水平框加个旋转角度吗,有什么难的”。真上手标过数据就知道,这里面的成本远超预期。水平框标注本质上是画一个轴对齐的外接矩形,两个角点就够了,熟练的标注员一秒钟能标几个。旋转框却要精确贴合目标边缘,尤其是飞机、舰船这种长条形目标,角度偏几度,IoU掉一大截,Ap结果立刻变难看。
更麻烦的是,遥感影像里的目标通常是多角度、多尺度、密集排列的。港口里停靠的船一艘挨一艘,彼此的角度还不一样;机场上的飞机有的头朝左、有的头朝右,机身和跑道有夹角。标注员在这种场景下要同时判断目标的类别、轮廓、朝向,认知负担很高,单位时间产出比水平框标注低不少。行业里做过粗略统计,旋转框标注的单价普遍是水平框的2到3倍,质量还不稳定。
除了人工成本,还有一致性问题。同一个目标,不同标注员画出来的旋转框,角度可能差好几度;同一个标注员标到后面累了,框的形状也会走样。这类标注噪声在水平框任务里也有,但旋转框任务里对最终精度的影响更明显,因为旋转框回归本身就是一个对角度误差很敏感的活。
1.2 弱监督想省的是哪部分钱
弱监督旋转检测的核心思路,就是绕开“完整旋转框标注”这个贵环节,用便宜的标注形式代替它。框架里讨论的弱监督设定,主要包含两类:一是图像级标签,也就是只告诉模型这张图里有飞机还是有船,不告诉具体位置和朝向;二是水平框标注,告诉模型目标在哪里,但不给旋转角度。前者连位置都要靠模型自己学,后者本质上是让模型在已知区域里自己回归出旋转框。
这里面的动机很实在。图像级标签的获取成本几乎可以忽略,很多公开遥感数据集本身就有场景级类别标签;水平框标注虽然也要花钱,但比旋转框便宜得多。如果模型能从这两类弱标注里学会输出旋转框,等于把数据生产的成本曲线往下压了一个台阶。尤其是很多企业做遥感或者巡检项目时,存量数据里往往只有水平框或者图像标签,重新做旋转框标注要额外支出一大笔预算。能直接用上存量数据训练旋转检测模型,本身就是很有吸引力的选项。
这也解释了这类工作的目标:不是要刷新某个全监督榜单,而是要在“标注预算有限,但又要旋转框输出”的现实约束下,尽可能逼近全监督的性能上限。
2. 框架设计与核心思想:模型怎么在弱标注下长出旋转框
2.1 双分支结构:定位靠粗标,角度靠自监督
这套框架的设计思路,拆开看其实很像一个“两条腿走路”的方案。一条腿负责目标定位,一条腿负责角度与形状精修。定位分支的输入是那些相对廉价的标注,比如水平框或者图像级标签,它要先回答“目标在哪里、大概多大”的问题。角度与形状精修分支则依托定位结果,在目标区域内进一步预测旋转框和类别。
为什么要把定位和角度分开处理?因为弱监督设定下,两者的信息获取难度完全不同。位置信息多少还能从水平框或者类别响应图里得到线索,角度信息则几乎没有现成的监督信号。框架在这部分采用了一种类似自监督的优化策略:模型先根据粗定位区域生成一个初始的旋转提名框,然后通过特征对齐和一致性约束,让模型自己判断“哪个角度的框能更好贴合目标”。这个过程不需要真值角度,完全依赖模型对目标轮廓和特征的感知。
权限与规律上有个细节值得留意:框架里对旋转框的表示方式不是直接用角度回归,而是引入了顺序点集或者八参数表示这类更稳定的形式。直接回归四参数加角度的方案,在弱监督条件下容易出现角度突变和训练不稳;换成点集回归后,模型预测的是目标轮廓上的关键点,再通过后处理转换成旋转框,鲁棒性会好很多。这种设计思路在近几年旋转检测工作里很常见,本质上是把角度回归问题转换成了更容易优化的几何约束问题。
2.2 伪标签迭代:让模型自己教自己
弱监督训练绕不开的一个环节是伪标签(Pseudo Label)。框架的训练流程分阶段推进:第一阶段,模型在弱标注数据上预热,先学出基础的类别响应和粗定位能力;第二阶段,用预热后的模型在训练集上生成旋转框伪标签,挑出高置信度的样本作为额外监督;第三阶段,用原始弱标注加上优质伪标签一起微调模型,然后重新生成伪标签,迭代若干轮。
这个“自己教自己”的过程,乍一听有点玄,其实背后的道理不复杂。模型在弱监督下能学到一部分可靠的模式,把这些模式沉淀成伪标签,再回头训练自己,等于把模型已经确认的信息固化下来。难点在于伪标签质量控制:置信度阈值设低了,噪声混进去,模型会被带偏;设高了,有效样本太少,训练不动。
框架在这块做了一个很实用的设计:伪标签不是一次性生成、一次性用完,而是每一轮迭代都会更新,并且不同来源的伪标签会分配不同权重。低置信度的区域只参与一致性约束,不直接参与监督回归;高置信度的区域才作为强监督信号。这种分级处理的方式,实际上是在“信任模型”和“防止模型自欺欺人”之间做平衡。
2.3 损失函数与角度一致性约束
损失设计是弱监督方法的灵魂。框架的损失可以粗分为三个部分:定位损失、分类损失、角度一致性损失。前两者好理解,是常规检测头里的标准损失;关键在角度一致性损失。
角度一致性约束是这样运作的:将同一个目标区域的图像做轻微扰动(比如平移、旋转、缩放),分别送入模型得到两个旋转框预测;理想情况下,两个预测经过逆变换后应该对齐。如果不一致,说明模型对目标朝向的感知不稳定,于是加大惩罚。这个约束不需要任何真值框,属于典型的自监督思想,等价于告诉模型“你对同一个目标的判断必须稳定,不能因为输入稍微变化就乱转”。
实际效果上,这个约束能显著提升旋转框预测的稳定性。我在自己的实验里也有类似体会,仅仅加入这种一致性损失,模型在密集排列目标上的角度预测就平滑了很多,不再出现“同一目标相邻两次预测角度差十几度”的抽风现象。
3. 实操环节:数据准备、超参与训练全流程
3.1 数据准备与标注格式转换
如果你想复现或者借鉴这套框架,第一步是把数据整理成模型需要的格式。弱监督设定下,数据格式比全监督要灵活,但也更需要规范化。图像级标签模式下,每张图只需要一个包含目标类别的列表,标注文件很小;水平框模式下,每张图需要目标的类别和水平框坐标,坐标格式推荐使用XYWH(中心点加宽高),这样转换到旋转框格式时更方便。
这里有一个值得提前规划的点:训练过程中伪标签是在线生成还是离线生成?框架的原始方案是离线生成,每训练完一个阶段就重新推理一遍训练集,得到新的伪标签文件。离线生成的优点是调试方便,你能直观检查伪标签质量;缺点是训练集大时推理耗时很可观。我在实际跑的时候,对训练集做了一次完整推理,单卡要跑接近一小时,如果你有几十万张图,建议把推理脚本并行化,或者退一步用在线伪标签。
数据增强方面,常规的翻转、缩放、裁剪都可以用,但是要避开一种危险操作:随机旋转增强。弱监督训练中,模型本来就在学角度,你再用随机旋转增强,等于不断改变目标的朝向真值,会让角度一致性约束失效。如果你确实需要旋转增强,必须同步旋转标注和伪标签,并确保旋转后的角度在定义域边界附近处理正确,否则很容易在0度和179度附近产生大误差。
3.2 关键超参数与训练配置参考
下表是我结合框架公开信息以及自己的实测,整理的一组参考配置,不同数据集需要微调,但大概量级是通用的:
| 参数 | 参考值 | 说明 |
|---|---|---|
| 输入图像尺寸 | 800×800 到 1024×1024 | 遥感目标小,分辨率太低会直接丢失细节 |
| 主干网络 | ResNet-50 或 Swin-T | 平衡速度与精度,大模型提升有限但显存涨得快 |
| 预训练权重 | ImageNet-1K 预训练 | 必须使用,弱监督任务对初始化很敏感 |
| 初始学习率 | 1e-4(骨干) / 1e-3(检测头) | 检测头用更大学习率,加速收敛 |
| 批次大小 | 8 | 根据显存调整,尽量别小于4 |
| 伪标签更新周期 | 每2个epoch更新一次 | 太频繁模型不稳定,太慢伪标签滞后 |
| 高置信度阈值 | 0.7 | 低于0.5噪声太大,高于0.85训练样本太少 |
| 低置信度阈值 | 0.3 | 用于一致性约束的样本下限 |
| 角度一致性损失权重 | 0.5 | 过大淹没定位损失,过小不起作用 |
训练配置里最容易踩的坑是学习率。弱监督方法本质上是先让模型建立基础的感知能力,再用伪标签精修,所以前期学习率要稳,建议用线性预热,前5个epoch从1e-5慢慢涨到设定值。我一开始直接按全监督的训练策略来,用1e-3从头训,结果前两个epoch模型就输出了大量空置信度,伪标签根本生成不出来。
另一个容易被忽略的参数是伪标签更新周期。很多博客和论文里一句话带过,但实际影响很大。更新太频繁,模型还在剧烈变化,旧标签和新标签之间跨度大,训练不稳定;更新太慢,模型已经学会新特征,却还在用旧标签,性能上不去。一个稳妥的做法是:每两个epoch更新一次伪标签,同时在更新时保留上一轮得分高的样本,做并集过滤,这样能避免模型“记忆震荡”。
3.3 训练监控与收敛判断
弱监督训练不像全监督那样有清晰的loss下降曲线,因为训练目标里有一部分是模型自己生成的,loss降得再低,也可能只是模型在迎合自己。判断训练是否正常,我一般看三个指标:
第一,伪标签的统计分布。每次更新伪标签时,记录高置信度样本的数量和平均置信度。正常训练下,高置信度样本数应该逐步增加,平均置信度稳步上升。如果这两个指标停滞甚至倒退,大概率是模型学到了错误的模式,需要回退到上一个检查点调整超参。
第二,验证集上的旋转框IoU分布。虽然弱监督训练不用验证集的旋转框标注,但你要留出一小部分带完整旋转框标注的数据作为“隐式评测集”,每几个epoch跑一次,观察mAP趋势。这一步很关键,很多弱监督方法看起来loss正常,但旋转框和目标的贴合度其实没有提升。IoU中位数能从0.5涨到0.7,模型基本就算学出来了。
第三,可视化检测结果。这是土办法,但永远有效。训练中期,随机抽几张训练图,把模型输出的旋转框画出来,肉眼看贴合度。如果框的角度明显跟目标轮廓一致,说明模型已经学到了角度信息;如果框的朝向一团乱,那说明角度分支还没正确激活,需要检查角度一致性损失的权重和伪标签的质量。
4. 实测避坑:伪标签噪声、小目标与角度误差
4.1 伪标签质量不稳,模型越训越歪怎么办
这是弱监督训练里最典型的问题,表现形式是:训练loss正常下降,但验证集mAP不涨反跌,或者第一轮迭代还好,第二轮迭代明显变差。原因几乎都是伪标签里混入了大量低质量样本,且这些低质量样本的梯度主导了训练方向。
我的排查思路分三步走。第一步,检查伪标签的可视化结果,直接叠加到图像上看,如果大量框与目标轮廓明显不贴合,说明模型的当前状态根本不适合生成伪标签,优先回到上一轮检查点,缩小伪标签更新幅度。第二步,提高高置信度阈值,从0.7调到0.8甚至0.85,宁可少用样本,也不让噪声混进来。第三步,对伪标签做空间去重,同一目标周围如果有多个高度重叠的旋转框,只保留置信度最高的那个,否则模型会反复强化多个互相矛盾的输出。
另外,引入EMA(指数移动平均)版本的模型来生成伪标签,是个性价比极高的改进。每轮训练时维护一个参数滑动平均模型,用它来推理生成伪标签,比直接用当前训练模型稳定很多。原因在于EMA模型对参数的更新更平滑,不容易被最近的几个异常样本带偏。
4.2 小目标漏检,弱监督框架的天然短板
遥感场景里小目标占比很高,而弱监督方法恰恰在小目标上容易翻车。原因不复杂:小目标在特征图上的响应本身就很弱,弱监督下没有真值框来强制模型聚焦,模型很容易直接忽略它们。
要改善这个问题,有几个实操手段值得尝试。一是特征金字塔层的选择,把P2层的高分辨率特征引入检测头,对小目标的召回率提升立竿见影;二是调整伪标签生成时的置信度阈值,小目标天然置信度低,如果全局统一用0.7的阈值,小目标伪标签几乎全被过滤掉,建议按目标面积分桶设置阈值,小目标用0.5,大目标用0.8;三是数据层面,把遥感图切块时采用重叠滑动窗口,保证目标在窗口边缘时不会因为截断而丢失关键特征。
我试过最有效的是分桶阈值,改动不大,但在小目标密集的数据集上,mAP能涨3到5个点。这个方法也侧面说明了一个原则:弱监督方法里,伪标签筛选策略对最终结果的影响,往往比网络结构本身更显著。
4.3 角度边界误差:0度和179度到底有什么猫腻
旋转框检测里一个经典坑就是角度定义边界。常见的角度定义范围是[-90, 0),但弱监督伪标签在角度边界附近非常不稳定。具体说,一个实际角度接近0度的长条目标,模型预测可能是-5度,也可能是-179度,两个值在数值上差很远,但表示的框几乎一样。这种非连续的角度标签分布,会让回归损失剧烈震荡。
应对方案有两种。一种是在角度表示上做文章,把单角度回归改成两个正交向量的回归,比如预测长边向量和短边向量,从根上规避角度回绕问题;另一种是在损失函数里加入角度周期性处理,计算角度差时取min(|a-b|, 180-|a-b|),等价于考虑角度的环形距离。框架的公开资料里提到,他们在伪标签生成时也会对边界角度做修正:预测角度落在边界附近时,将伪标签角度微调若干度,避免给模型强加一个难以学习的突变目标。
实操时,我会额外检查伪标签文件里角度接近边界值的样本比例。如果超过10%,说明当前模型对角度边界的处理不够好,优先调整角度损失的周期处理逻辑,而不是盲目加大回归损失权重。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 排查与解决方向 |
|---|---|---|
| 伪标签高置信度样本极少 | 阈值设置过高/模型未收敛 | 降低高置信度阈值,延长预热阶段 |
| 伪标签框角度乱转 | 角度一致性损失过弱/增强不当 | 增大一致性损失权重,移除随机旋转增强 |
| 训练后期mAP反而下跌 | 伪标签噪声累积 | 回退到最佳检查点,缩小伪标签更新幅度,引入EMA模型 |
| 小目标大量漏检 | 特征分辨率不足/阈值一刀切 | 引入高分辨率特征层,按目标面积分桶设置阈值 |
| 旋转框贴合度差但loss低 | 模型学会了迎合自己的伪标签 | 用隐式评测集评估真实旋转框IoU,回归可视化检查 |
| 训练初期loss就剧烈震荡 | 学习率过大/预热缺失 | 加线性预热,降低初始学习率 |
5. 应用场景与扩展思考
5.1 哪些场景最适合这套框架
从框架的设定来看,最适合的场景是数据量大但标注预算有限的遥感影像分析。典型的有船舶检测、飞机停靠识别、油罐与储罐检测这三类,这些目标形状规则、长宽比大、方向性强,旋转框检测的优势能发挥出来,同时这类数据集往往已经存在水平框或者图像级标签的存量标注,正好符合弱监督的输入要求。
工业质检是另一个潜在落地场景。工业产线上的零件、PCB板、包装箱,很多都有明确的朝向和形状,采集图像容易,但人工标注旋转框同样昂贵。用弱监督框架可以先在少量旋转框标注数据上启动,然后大量利用无标注数据做伪标签迭代,把模型精度逐步抬上去。这个思路本质上是用“少量好标注+大量弱标注”的组合,替代“大量好标注”的旧路径,在数据收集困难的场景里尤为实用。
医学影像里也有一些长条状目标检测需求,比如血管、神经纤维、骨折线,这类目标没有严格的“旋转框”语义,但点集表示方式天然适合描述细长结构,框架的表示方法有迁移潜力。当然,医疗场景对模型可解释性和误检要求更高,弱监督方法要过临床验证门槛还有不少路要走,但作为预标注工具帮助医生缩小阅片范围,已经具备一定可行性。
5.2 后续可以做的改进方向
框架本身有不少可以继续挖的点。一个很直接的方向是引入多尺度伪标签协同。当前的伪标签策略是在单尺度特征上生成的,如果能同时利用多尺度特征分别生成伪标签,再进行融合筛选,能进一步提高伪标签的召回率和定位精度,代价是推理时间会翻倍。
另一个方向是与大模型时代的视觉基础模型结合。像SAM这样的分割基础模型在提取目标轮廓上有很强的先验能力,把它们的输出作为伪标签的初始化或者约束条件,理论上可以补足弱监督模型在轮廓贴合度上的不足。这个思路目前学术界有团队在探索,但不是简单地把SAM的分割结果转成旋转框就完事,还需要解决SAM对遥感小目标不敏感、以及分割结果与检测类别不对齐的问题。
还有一个容易被忽视的改进点,是类别不平衡与角度分布不平衡的联合处理。遥感场景里船舶和油罐数量可能差一个数量级,而每类目标的角度分布也不均匀,有些类横竖方向多,有些类斜向多。这会让模型偏向预测训练集中占多数的角度。引入类别级的角度分布均衡采样策略,在采样时对尾部角度做加权,能明显改善长尾类别的旋转框预测质量。
5.3 个人实操体会
整套框架跑下来,我最大的感受是:弱监督旋转检测的瓶颈,与其说在模型结构上,不如说在伪标签管理的工程细节上。数据准备流程可以直接抄,网络结构也能按论文搭出来,真正决定最终精度的是你怎么生成伪标签、怎么筛选、怎么更新。这三个环节只要有一个粗糙,模型性能就会明显打折。
还有一点心得是,不要迷信论文里的默认参数。不同数据集的分布差异远比你想象的大,尤其是遥感数据,目标尺度和密度变化剧烈。我在一个密集型港口数据集上,最优置信度阈值是0.8,但换到稀疏的机场数据集,最优阈值就掉到了0.6。参数这种东西,只能当起点,不能当终点。
如果你打算在自己的项目里用这套方案,我的建议是先拿一小块数据完整跑通流程,确认伪标签质量看着顺眼之后,再全量铺开。宁可前面多花一天做可视化检查,也不要盲目跑一周训练到最后发现伪标签全是噪声。这套框架的价值在于降低了旋转框检测对昂贵标注的依赖,但代价是你要在模型训练细节上花更多心思,这个交换是否划算,取决于你的数据规模和标注预算,实测下来,在人工标注成本高的项目里,它确实是一条值得走的路。