无人机航拍目标检测:基于YOLO的航拍影像小目标检测全流程优化
在电力巡检、国土测绘、安防监控这类无人机落地场景里,小目标检测从来都是绕不开的硬骨头。航拍影像动辄几千甚至上万像素的分辨率,而待检测的行人、车辆、杆塔部件往往只有十几到几十像素,原生YOLO拿过来直接训,最终mAP能掉到通用数据集的一半,漏检率居高不下,根本没法落地。
我们团队前后做过三个无人机巡检类项目,踩过从数据处理到模型改进再到边缘部署的全套坑。最开始也陷入过“堆注意力、加检测头”的误区,改了半个月网络,mAP只涨了不到两个点,速度还掉了三分之一。后来从数据侧、训练侧、推理侧全链路调整,才在VisDrone这类标准数据集上把小目标mAP拉上来8个多点,同时保证了机载端的推理速度。
本文就把整套优化方案完整拆解开来,从数据预处理、网络改造、训练调优到工程部署,每一步都给出可复现的方法和实测效果,帮大家少走弯路。
一、航拍小目标检测的四大核心痛点
和普通监控视角的目标检测不同,航拍场景的难点是系统性的,不是单改某一个模块就能解决的。
第一是目标尺度极小,特征信息严重不足。行业内通常把小于32×32像素的目标定义为小目标,而航拍数据里大量目标只有10-20像素。经过骨干网络32倍下采样后,一个20像素的目标在深层特征图上只剩不到1个像素点,语义信息几乎完全被背景噪声淹没,模型根本学不到有效特征。
第二是视角特殊,数据集分布差异巨大。YOLO的预训练权重基于COCO数据集,大多是平视视角的日常物体;而航拍是俯视视角,目标的形态、纹理、长宽比和平视场景差异极大,迁移学习的收益大打折扣。最典型的就是车辆,平视视角有明确的车头车身轮廓,俯视视角只剩一个车顶矩形,特征区分度很低。
第三是目标密集且类别极度不均衡。航拍影像里经常出现几十上百辆车密集排列的场景,目标间距小,很容易出现漏检和重复检测;同时不同类别样本量差距悬殊,比如车辆样本很多,骑行者、行人样本少,稀有缺陷类目标更是只有几百张,长尾效应严重。
第四是场景干扰因素多,鲁棒性要求高。实际飞行中会遇到光照变化、云层阴影、雾气模糊、镜头抖动等问题,同一区域在不同时段的成像效果差异极大。只在理想数据上训出来的模型,到了真实作业环境里精度直接跳水。
二、全流程优化整体架构
小目标检测的优化从来不是单点突破,而是全链路的系统性工程。我们的优化思路分为四层,从数据到部署逐层递进,优先做性价比最高的改动。
实战下来的经验是:数据侧优化的投入产出比最高,往往能带来50%以上的精度收益;其次是训练策略调优;网络架构改动的收益排在第三位;最后是部署侧的精度对齐与性能优化。很多人一上来就改网络结构,其实是走了弯路。
三、数据侧优化:从源头提升小目标特征质量
数据是算法的上限。航拍场景下,数据处理的质量直接决定了模型最终的精度天花板。
3.1 滑动窗口切片:解决大图小目标的矛盾
航拍原图普遍在4000×3000像素以上,直接缩放到640×640输入模型,小目标会被缩到几个像素,完全失去特征。标准做法是用滑动窗口把大图切成固定尺寸的小图,再送入模型训练。
切片有两个核心参数:窗口尺寸和重叠率。
- 窗口尺寸:常用的是640×640或800×800,和模型输入尺寸对齐,避免二次缩放损失。
- 重叠率:建议设置为20%-30%。重叠的目的是防止目标刚好落在窗口边缘被截断,导致标注不完整。如果重叠率太低,边缘目标的漏检率会明显上升;重叠率太高,又会产生大量重复样本,增加训练耗时。
切片后还要做一步过滤:把不含任何标注目标的纯背景图删掉,减少无效样本对训练的干扰。对于只包含极小目标的切片,可以适当提高其在训练集中的采样权重,强制模型多学习小目标特征。
3.2 针对性数据增强:适配小目标场景
原生YOLO的Mosaic、Mixup增强是为通用场景设计的,对小目标检测甚至有副作用——四张图拼接后,目标会被进一步缩小,原本就小的目标直接变成几个像素。
我们的增强策略是做减法+针对性补充:
- 降低Mosaic概率:训练初期开启,概率设为0.3-0.5,训练后20%轮次完全关闭,避免小目标特征被破坏。
- 加入Copy-Paste增强:这是小目标检测涨点最明显的增强手段。从数据集中抠出各类小目标,随机粘贴到背景图的合理位置,既能增加小目标的样本数量,又能丰富目标的背景环境。实测仅这一项,小目标召回率就能提升4%以上。
- 几何与光照增强:随机旋转±15°、水平垂直翻转、亮度对比度随机调整、加高斯噪声模拟雾气模糊。核心原则是不改变目标的物理尺度,不破坏目标的完整性。
- 随机裁剪放大:以一定概率对图像进行局部裁剪,然后放大到原尺寸,变相提高小目标在图中的占比,强化模型对小目标细节的学习。
3.3 标注规范与样本均衡
工业项目里,标注质量差导致的精度问题,比模型本身的问题多得多。
- 标注边界要紧贴目标边缘,不要留太多背景,也不要切到目标本身。极小目标标注时统一标注规则,比如低于5像素的目标是否标注、模糊目标如何处理,避免标注标准不一致带来的噪声。
- 对于类别不均衡问题,采用重采样策略,对稀有类别样本过采样,同时对海量常见类别欠采样。配合损失函数的类别权重,缓解长尾分布带来的偏向性。
四、网络架构改进:针对性强化小目标检测能力
数据打好基础后,再对网络做定向改造,重点是强化小目标的特征表达,不要盲目堆模块。
4.1 新增P2小目标检测头
原生YOLOv8/v11只有三个检测头,对应stride=8、16、32的特征图,最小的检测头负责检测大目标,最大的特征图(stride=8)负责检测小目标。但对于20像素左右的极小目标,8倍下采样后只剩2-3个特征点,特征表达严重不足。
解决方案是新增一个stride=4的P2检测头,专门负责极小目标检测。
- 从骨干网络的第二层引出P2特征图,尺寸为输入的1/4;
- 在Neck部分增加一次上采样,将P3特征上采样后与P2特征融合,输出第四个检测分支;
- 对应调整检测头的通道数,保证小目标分支有足够的细节特征。
改动后,20像素的目标在P2特征图上对应5个特征点,特征信息量提升了一倍多,小目标的定位和分类精度都会明显上升。代价是参数量增加约10%,推理速度下降约8%,性价比很高。
4.2 嵌入Coordinate Attention注意力
注意力机制很多,但不是所有都适合小目标。SE通道注意力完全丢失空间信息,CBAM的全局池化会抹平小目标特征,效果都一般。我们最终选了Coordinate Attention(坐标注意力),它把空间注意力拆分为水平和垂直两个方向编码,既能强化通道特征,又能保留精确的位置信息,刚好命中小目标检测的核心需求。
插入位置也有讲究,不是越多越好:
- 骨干网络的P2、P3输出层各加一个,强化浅层特征的目标定位;
- Neck的P2融合分支加一个,增强小目标特征的语义信息;
- 深层大目标分支不加,避免不必要的计算开销。
核心代码片段如下,基于ultralytics源码修改即可:
classCoordAtt(nn.Module):def__init__(self,inp,oup,reduction=32):super().__init__()self.pool_h=nn.AdaptiveAvgPool2d((None,1))self.pool_w=nn.AdaptiveAvgPool2d((1,None))mip=max(8,inp//reduction)self.conv1=nn.Conv2d(inp,mip,kernel_size=1,stride=1,padding=0)self.bn1=nn.BatchNorm2d(mip)self.act=nn.SiLU()self.conv_h=nn.Conv2d(mip,oup,kernel_size=1,stride=1,padding=0)self.conv_w=nn.Conv2d(mip,oup,kernel_size=1,stride=1,padding=0)defforward(self,x):identity=x n,c,h,w=x.size()x_h=self.pool_h(x)x_w=self.pool_w(x).permute(0,1,3,2)y=torch.cat([x_h,x_w],dim=2)y=self.conv1(y)y=self.bn1(y)y=self.act(y)x_h,x_w=torch.split(y,[h,w],dim=2)x_w=x_w.permute(0,1,3,2)a_h=self.conv_h(x_h).sigmoid()a_w=self.conv_w(x_w).sigmoid()returnidentity*a_w*a_h4.3 特征融合路径优化
原生PANet是自顶向下再自底向上的双向融合,对于小目标来说,深层语义特征传过来的时候,细节信息已经损失了不少。我们做了两个小改动:
- 在P2到P3的融合路径上增加跳跃连接,让浅层细节特征更直接地传递到中层;
- 小目标分支的融合通道占比调高,让细节特征的权重更大,语义特征的权重适当降低。
改进后的网络整体架构如下:
五、训练策略调优:最大化模型收敛效果
同样的网络,不同的训练策略,最终精度能差出3-5个点。航拍小目标场景有几个必须调的参数。
5.1 锚框重新聚类
这是很多人容易忽略的细节。YOLO默认的锚框是基于COCO数据集聚类出来的,适配平视视角的目标尺寸。航拍场景的目标普遍偏小,长宽比也不一样,直接用默认锚框,正样本匹配效率很低,收敛慢且精度差。
做法很简单:用自己数据集的标注框重新跑k-means聚类,生成适配当前场景的9组锚框,对应三个检测头;加了P2头的话,就聚类12组。实测重新聚类后,模型收敛速度能加快20%,最终mAP提升1-2个点。
5.2 多尺度训练
开启多尺度训练,设置尺寸范围为480-960。训练过程中随机选取输入尺寸,让模型适应不同大小的目标。当输入尺寸变大时,小目标的像素数增加,特征更清晰,模型能学到更丰富的细节;小尺寸输入则能提升模型的泛化能力。
注意多尺度训练的显存占用会波动,要根据显卡显存调整batch size,避免爆显存。
5.3 损失函数加权优化
针对小目标做损失加权,是提升召回率的有效手段。
- 回归损失换SIoU:相比CIoU,SIoU引入了方向匹配代价,对小目标的位置回归更友好,定位更精准。
- 小目标损失加权:在损失计算时,根据目标的像素大小动态分配权重,面积小于32×32的目标损失权重乘以1.5-2.0,强制模型更关注小目标的学习。
- 分类损失类别加权:对稀有类别设置更高的分类损失权重,缓解样本不均衡带来的偏向性。
5.4 分阶段训练策略
不要上来就端到端全量训练,很容易震荡不收敛。我们常用三阶段训练法:
- 预热阶段:冻结骨干网络,只训练检测头和新增模块,学习率稍高,快速让新分支收敛;
- 全训阶段:解冻全部网络,调低学习率,端到端联合训练,配合强数据增强;
- 微调阶段:关闭Mosaic、Mixup等强增强,用更低的学习率微调10-15轮,稳定最终精度。
六、推理部署优化:工程落地的性能与精度平衡
训练做得再好,推理阶段处理不对,精度照样掉。航拍场景的推理有其特殊的工程逻辑。
6.1 大图重叠切片推理
和训练侧对应,推理时不能直接把几千像素的大图缩到640,必须用滑动窗口切片推理,然后把结果拼接起来。
- 切片尺寸和训练保持一致,重叠率设为20%-30%,保证边缘目标至少能出现在一个完整切片里;
- 每个切片独立推理,输出检测框;
- 所有切片的结果合并后,做一次全局NMS,去除重复检测的目标。
这里有个细节:切片重叠率不是越高越好。太高会产生大量重复框,NMS压力大,推理速度慢;太低又会漏检边缘目标。25%左右是我们实测下来的最优平衡点。
6.2 TensorRT加速部署
无人机机载端的算力有限,必须做模型加速。我们的标准方案是导出ONNX后转TensorRT FP16精度,速度能提升4-5倍,精度损失控制在0.5个百分点以内,完全可接受。
导出和转换时有两个注意点:
- 预处理必须和训练严格对齐,包括归一化系数、通道顺序、填充方式,任何一点不一致都会导致精度掉点;
- 如果输入尺寸固定,就用静态shape,比动态shape推理快20%以上。
6.3 后处理优化
航拍场景目标密集,普通NMS很容易把相邻的两个目标误当成一个删掉。建议用DIoU-NMS替换普通NMS,考虑检测框之间的距离和重叠,对密集目标的处理效果更好;如果追求速度,也可以调整NMS的IoU阈值,从默认的0.45调到0.5-0.6,减少误删。
对于端边云协同的场景,可以在机载端用轻量化模型做粗检,把疑似目标的区域裁剪出来,传到云端用大模型做精判,兼顾实时性和精度。
七、实验对比与消融分析
我们以YOLOv11s为基线,在VisDrone2019数据集上做了完整的消融实验,输入尺寸640×640,测试环境为RTX 3090 + TensorRT FP16。
| 优化方案 | mAP@0.5 | 小目标召回率 | 推理FPS | 参数量(M) |
|---|---|---|---|---|
| 原生YOLOv11s | 38.2% | 41.5% | 152 | 9.4 |
| +数据优化(切片+Copy-Paste) | 42.7% | 50.3% | 152 | 9.4 |
| +P2小目标检测头 | 44.5% | 54.8% | 140 | 10.3 |
| +CA注意力机制 | 45.8% | 57.2% | 137 | 10.6 |
| +训练策略全优化 | 46.9% | 59.1% | 137 | 10.6 |
从数据可以清晰看到:
- 仅数据侧优化,mAP就涨了4.5个点,是所有优化里收益最高的;
- 加P2头和注意力,带来2-3个点的提升,同时速度略有下降;
- 训练策略调优在不改变模型和速度的前提下,再涨1个多点。
整体下来,mAP从38.2%提升到46.9%,涨幅8.7个百分点,其中小目标召回率提升了17.6个百分点,效果非常显著。推理速度从152帧降到137帧,下降幅度不到10%,完全在可接受范围内。
可视化对比更直观:原生模型对远处的行人和非机动车漏检非常严重,很多置信度低于0.3;优化后大部分小目标都能被检出,置信度普遍提升到0.6以上,定位框也更贴合目标边缘。
八、实战踩坑与避坑指南
最后总结几个我们踩过的深坑,很多新手都会栽在这里。
盲目堆砌注意力模块。很多人把SE、CBAM、CA全往网络里插,每层都加,结果参数量涨了很多,精度没涨多少,速度还掉得厉害。记住:注意力只加在中低层小目标分支,深层大目标分支没必要加,性价比极低。
Mosaic增强开太高。默认0.9的Mosaic概率,在航拍小目标场景是灾难,目标越拼越小,模型根本学不到小目标特征。训练初期开0.3-0.5就够了,后期一定要关掉。
推理直接缩放原图。很多人图省事,把几千像素的大图直接缩到640推理,结果小目标全没了,还纳闷为什么模型效果差。切片推理是航拍场景的标配,省不了。
只看整体mAP,不看小目标指标。整体mAP看着还行,实际落地漏检一堆,因为大目标把平均分拉上去了。一定要单独统计小目标的召回率和精度,这才是航拍场景的核心指标。
不做域适应直接上预训练模型。COCO预训练权重和平视场景适配度高,和航拍俯视差异大。有条件的话,先用大量无标注航拍数据做自监督预训练,再微调,效果会好很多。
写在最后
无人机航拍小目标检测,本质上是一个工程问题大于算法问题的场景。它不需要多么前沿的理论,而是要把数据处理、模型改进、训练调优、工程部署每一个环节的细节都做到位。
给大家的落地建议是:先把数据侧的工作做扎实,切片、增强、标注规范这些做好,就能拿到大部分收益;然后再根据业务的精度和速度要求,选择性地做网络改造和训练调优;最后把部署侧的细节对齐,保证训练和推理的一致性。
按照这个路径走下来,绝大多数航拍巡检类的目标检测需求,都能达到量产落地的标准。
