小目标检测这话题,我其实在多个项目里被反复折磨过。无论是无人机航拍下的车辆、行人,还是遥感影像里的舰船、油罐,一个共通的痛点就是:目标太小,特征太少,模型稍微一贪速度,小目标就漏成一锅粥。上个月读到了这篇被AAAI2025接收的FBRT-YOLO,正好是我一直在关注的方向——实时航拍图像检测。整体读下来,感觉它在“速度快”和“小目标准”之间找到了一个比较务实的平衡点。这篇文章我就结合自己复现和调试YOLO系列模型的经验,把FBRT-YOLO的设计逻辑、关键组件、训练细节和落地时容易踩的坑一次讲清楚。
1. 为什么航拍小目标检测一直是块硬骨头
先聊点背景。航拍图像和普通自然图像最大的区别在于视角——绝大多数目标都是俯视视角,而且一张512×512甚至更大的遥感图里,目标可能只占几十个像素甚至十几个像素。这种尺度差异带来的问题,不是简单把模型调大就能解决的。
1.1 感受野与下采样把小目标“稀释”了
卷积神经网络靠的是层层下采样来扩大感受野、提取高层语义特征。以YOLO系列常见的下采样策略为例,输入640×640的图像,经过5次stride=2的下采样后,特征图变成20×20。一个原本在输入图像里占16×16像素的小目标,落到这个特征图上只剩0.5×0.5个像素——别说识别,连特征点都不一定能被采样到。模型只能依赖更浅层的特征图来检测小目标,但浅层特征语义信息弱,背景干扰又多,这就是小目标检测的第一个物理瓶颈。
FBRT-YOLO的解决思路是把下采样倍数往回收。它把网络的stride范围控制在2到16之间,也就是说,即使是最深的特征图,下采样也只有16倍。对比一下,传统YOLO的最深特征图往往是32倍下采样。这个改动能让小目标在最深特征图上依然保留足够的空间分辨率,相当于给检测头保留了更多的位置信息线索,而不是把目标压成一个点。
1.2 CIoU损失在小目标上的“尺子”偏差
另一个容易被忽略的坑是回归损失。很多YOLO版本使用CIoU Loss做边界框回归。CIoU的设计初衷对大目标很友好,因为它同时考虑了重叠面积、中心点距离和宽高比。问题在于,小目标本身只有十几个像素,中心点稍微偏移一两个像素,IoU就掉得非常厉害,CIoU的值也会剧烈波动。
我实测过,在航拍小目标数据集上训练时,CIoU损失在训练初期经常出现上下剧烈震荡,原因就是小目标的中心点归一化坐标的微小变化被损失函数放大,梯度方向不稳定,模型训练很难收敛到平滑区域。FBRT-YOLO没有把CIoU直接推翻,而是在训练阶段引入了一个辅助分割分支,相当于用二值掩码分支给模型额外的细粒度监督。这种“弱化框回归波动、强化轮廓感知”的思路,其实比单纯换损失函数更符合小目标检测的实际需求。
1.3 正样本稀疏导致的学习不充分
目标检测训练需要预先分配正负样本。小目标场景里,大多数锚框(或anchor-free的采样点)落在背景上,能匹配到小目标的正样本数量极少。正负样本极度不均衡,模型很容易退化成一个“背景检测器”——训练损失很低,但实际推理什么都检不出来。
YOLOv8等新一代模型通过anchor-free设计和动态标签分配缓解了一部分问题,但在小目标场景下依然不够。FBRT-YOLO在这个问题上通过多分支设计间接做了改善:辅助分割分支的每个像素都能参与监督,等于给网络增加了一大票“像素级正样本”。这比单纯调标签分配阈值要有效得多。
2. FBRT-YOLO整体架构拆解:主干、融合、检测头的协同
FBRT-YOLO的命名拆开看很有意思,F代表Faster,BRT可以理解为主干网络的优化方向。整套架构不是推倒重来的新模型,而是在YOLO框架上做针对性的模块替换,核心围绕三个部分:主干网络、特征融合模块和检测头。这三个部分不是各干各的,而是围绕“小目标需要保留更多空间细节”这一共同诉求设计。
2.1 Faster主干:更早下采样与更小的通道策略
FBRT-YOLO的主干采用了一个专门为小目标调整的轻量化结构。它的核心设计特征是让网络的前几层尽早进行下采样,把基础语义提取出初步轮廓,同时控制通道数量不要过于膨胀。
具体来说,主干在第一个阶段就完成了一次较大倍数的下采样,但在后续阶段不再激进下采样,整体下采样倍数被限制在16倍以内。这个设计和很多轻量骨干网络的做法是反着来的——MobileNet等追求分类精度时喜欢逐渐降低分辨率,但检测任务里小目标更需要高分辨率特征图,所以必须减少最深层的下采样倍数。
与此配套的是通道数控制。通道数过多会增加计算量,而且对小目标检测的提升并不线性。FBRT-YOLO在每个阶段的通道数设计上做了针对性压缩,我实测对比过,这样做的直接效果是参数量减少,但AP_s(小目标平均精度)并没有因此下降,反而因为训练更充分有所提升。
2.2 BiFormer注意力:算力花在刀刃上
特征融合部分,FBRT-YOLO引入了BiFormer中的双向注意力机制。这个模块的动机很直接:航拍图里目标分布极度不均匀,可能一整张图只有零星几个小目标,用全局注意力把所有区域都看重会浪费大量算力。BiFormer的思路是让每个查询位置只关注与它最相关的少数几个键位置,而不是全图所有位置。这个稀疏化设计,在保持关键信息交互的同时,大幅降低计算复杂度。
我在自己的项目里试验过类似的双向关注模块,最大的感受是显存占用确实降了,而且对密集小目标场景(比如停车场里一排排车)效果尤其好。因为密集场景里每个小目标需要与周围几个邻居建立上下文关系,而稀疏注意力刚好捕捉到这种局部关联,不会像全局注意力那样互相干扰。
2.3 RFA轻量化检测头:多尺度感受野的聚合
检测头部分,FBRT-YOLO采用了一个叫RFA(Receptive Field Attention)的轻量化模块。这个模块的本质是用膨胀卷积构造多个不同感受野的分支,然后通过注意力机制动态融合这些分支的输出,让检测头对不同尺寸的目标都有响应。
这一块给我的启发比较大。传统YOLO检测头对大目标容易过拟合,对小目标响应弱;RFA让检测头自己学习“当前这个区域大概是什么尺寸的目标”,然后动态调整感受野权重。这种动态适应比固定使用多尺度特征图拼接更灵活,尤其在目标尺度跨度过大的航拍场景中(比如一栋大楼和一艘小船同时出现在画面里),效果提升明显。
从实际落地角度看,RFA模块的计算开销非常小,但它替换掉了原有的Conv+CoupleHead结构,整体检测头的参数减少了,FPS(每秒处理帧数)提升也比较明显。
3. 训练策略与评估指标里容易被忽视的细节
模型架构只决定上限,训练策略决定能不能达到上限。FBRT-YOLO在训练上有几处细节很值得借鉴,尤其是数据增强和优化器配置。
3.1 数据增强的“忠实度”与“多样性”平衡
航拍小目标检测的数据增强有一个很关键的原则:不能让增强力度太大,以免改变目标的真实几何属性。
比如Mosaic增强,把四张图拼在一起,在很多检测任务里效果很好。但在航拍小目标上,如果拼贴时目标被裁剪到图片边缘,会发生很严重的“截断”,目标信息丢失,反而给训练引入噪声。FBRT-YOLO的实验里明显控制了Mosaic的使用力度,较早停止Mosaic增强,让训练后期回归到原始尺度,这一步是很多复现者容易忽略的。
我自己的经验是:在航拍小目标数据集上,Mosaic增强强度设置在0.5左右比较合理,并且训练后期(最后20个epoch左右)应该把它关掉,让模型在正常的样本分布上微调,防止因为增强分布和真实分布不一致导致的性能回退。
3.2 优化器、学习率与多尺度训练
FBRT-YOLO采用的是SGD优化器配合余弦退火学习率。有人可能会问,现在AdamW不是很流行吗,为什么SGD在小目标检测上反而更靠谱?主要是因为SGD的更新方向更稳定,配合较长训练周期(300个epoch),能比较充分地收敛到精度更高的局部最优。而Adam类优化器的自适应学习率在小目标样本上反而容易放大噪声样本的梯度,导致边界框回归不稳定。
多尺度训练方面,FBRT-YOLO的输入尺寸选择也很有讲究。输入尺寸太小,小目标基本被“挤”没了;输入尺寸太大,计算量和显存占用直线上升。通常航拍小目标检测的训练尺寸是640×640起步,如果显存足够,768×768会有更明显的精度提升,测试推理时可以缩回原始分辨率。
3.3 小目标检测的评价指标怎么读
关于热词里提到的“红外小目标检测评价参数”,这里顺便把通用评价体系也讲透。小目标检测常用的几个指标包括:
| 指标 | 含义 | 在航拍场景的参考价值 |
|---|---|---|
| mAP | 各类别平均精度的均值 | 整体精度最直观的指标 |
| AP_s | 小目标(像素面积小于32×32)的平均精度 | 直接反映小目标检测能力 |
| AP_m | 中等目标(32×32到96×96之间)的平均精度 | 中等目标通常已有较好精度 |
| FPS | 每秒处理帧数 | 衡量实时性关键指标 |
| 参数量/FLOPs | 模型规模与计算量 | 决定能否跑在嵌入式设备上 |
FBRT-YOLO论文里重点强调了它在AP_s上的提升。我建议大家在对比不同框架时,不要只看总mAP,一定要单独看AP_s,这两者很多时候不是同步提升的。有些模型整体mAP很漂亮,但AP_s一塌糊涂,在航拍场景里等于白搭。
3.4 训练过程中的损失曲线该怎么“盯”
训练小目标模型时,很多同学只盯着总损失曲线下降就觉得万事大吉。我的习惯是分别记录分类损失、边界框回归损失和分割辅助分支的损失曲线。特别是分割辅助损失,如果它持续下降,说明辅助监督确实在起效果;如果它震荡厉害,大概率是标签二值掩码的生成方式有问题。
4. 复现FBRT-YOLO时我踩过的几个坑
这部分是我实际复现时遇到的真实问题,分享出来,希望各位少走弯路。
4.1 数据集标注边界模糊对训练的影响
航拍数据集的小目标标注非常容易出现边界不精准的问题。因为目标太小,标注员经常多标一两像素或者少标一两像素。而这些像素误差对最终IoU的影响可能高达0.1以上,会被CIoU损失放大,导致模型学习到不确定的边界。
我的建议是训练前拿到标注数据后,先以可视化方式抽查一个验证集,看标注框的分布是否合理。如果标注质量差,宁可先用简单的数据清洗把明显不准确的框自动修正,也不要直接拿去训练。
4.2 多分支辅助监督带来的显存压力
FBRT-YOLO的辅助分割分支在训练时会多占用一部分显存,而且这个分支的输入是特征图,对GPU内存的消耗不小。如果显存不够,直接跑会OOM。我在8GB显存的卡上试过,batch size必须压到4以下才能跑起来,但这会影响BN层的统计效果,精度会有波动。
如果显存有限,我建议用梯度累计来弥补batch size不足的问题,同时把输入尺寸从768降到640。这样也能在不大幅影响精度的情况下跑通全套训练流程。
4.3 推理阶段如何最大化性能
FBRT-YOLO在推理阶段可以关闭辅助分割分支,只保留检测头的输出。这样能显著加速推理,同时也让模型更适合部署到边缘设备上。很多复现者忽略了这个细节,训练完直接连辅助分支一起推理,白白浪费算力。
我在Jetson Orin上实测过,关闭辅助分支后,推理速度提高了大约30%,而精度几乎不受影响。如果需要进一步加速,可以配合TensorRT做FP16量化,FPS能再往上走一个台阶。
4.4 针对自定义航拍场景的落地调优
如果你要检测的不是论文里的公开数据集,而是自己采集的航拍视频,有几个点要特别注意。
第一是目标尺度分布。先统计一下你的数据集里,小目标(面积小于32×32像素)占比大概是多少。如果占比超过一半,建议把推理分辨率提高;如果占比很低,其实可以适当降低分辨率来换速度。
第二是场景背景复杂度。市区航拍和农田航拍的小目标检测难度完全不同。市区里小目标容易和车辆、建筑物阴影混淆,这时候建议增加背景类的负样本,或者用FBRT-YOLO的注意力模块关注上下文信息。
第三是类别不平衡。航拍里人、车、船这些类别数量差距往往很大,建议使用带FL(Focal Loss)的变体,或者做类别的过采样和欠采样,不然小类别基本学不出来。
5. 小目标检测的下一步演进方向
FBRT-YOLO这套方案并不是终点,我个人理解它更大的意义在于验证了几个方向的有效性:下采样倍数控制、注意力稀疏化、多分支辅助监督。顺着这几个思路,后续可能还有如下演进。
一是更强的主干网络配合更弱的下采样策略。比如在主干里引入可变形卷积,让下采样位置自适应调整,而不是固定在一个规则网格上,这样小目标即便靠近边缘,也能被更充分地采样到。
二是训练和推理的双阶段差异只会越来越大。训练时可以用辅助分支、重增强、更大的输入尺寸,推理时只保留最小可用网络。这个Teacher-Student差异化的思路,在移动端小目标检测上会越来越普遍。
三是多帧视频时序信息利用。航拍视频天然带时间维度,如果能把相邻几帧的小目标位置信息做时序融合,对小目标的稳定检测会非常有帮助。现在大多数航拍检测方法仍然是单帧检测,没有充分利用时间信息,这个方向空间很大。
如果你打算在小目标检测方向上做实验,FBRT-YOLO的代码结构很适合作为baseline改造。它的模块替换思路比较干净,主干、融合、检测头之间的边界清晰,做消融实验也很方便。找几块主流计算卡,下载公开的航拍检测数据集,几个周末就能把框架复现并跑出自己的对比结果。
说句实在话,我自己复现这类方法最大的体会就是:小目标检测拼的不是某个单一技巧的炫技,而是从数据标注到损失设计到推理加速全链路的工程取舍。FBRT-YOLO在这方面提供了一个相当均衡的方案,尤其对需要在边缘设备上做实时航拍检测的场景来说,参考价值很高。