☰
无人机航拍目标检测数据集选型与训练避坑指南
2026/10/14 7:04:35 网站建设 项目流程

做目标检测这几年,我大部分时间都在和无人机、航拍数据打交道。每次有人拿着通用检测模型直接搬到航拍图上,然后跑来问我“为什么效果这么差”,我基本都是同一个回答:先别怀疑模型,你的数据集选对了吗。今天这篇想把“无人机、航拍数据集”这件事从头到尾整理一遍。因为不少公开数据集的授权不允许我直接转述具体名称,下面会用代号指代几类常见数据,但方法、参数、坑全部是真实项目里试出来的。内容适合正在做无人机巡检、智慧城市、农业遥感、低空安防等方向的朋友,也适合刚入门、不知道该去哪找数据的人看。我会从“为什么不能用普通数据”讲起,再讲怎么分类选型、怎么看标注质量、怎么训练评估,最后放一些独家经验。

1. 为什么无人机航拍检测不能用通用目标检测数据集

1.1 视角变了,问题也跟着全变

航拍数据集和通用数据集之间最本质的区别,是视角从“平视”变成了“俯视”。你可以想象自己站在十几层楼顶往下看一个停车场,和站在路边看同一个停车场的区别。平视时,车的侧面、轮胎、车窗纹理非常明显,目标之间的遮挡是前后层叠的关系;俯视时,车顶成了绝对主体,轮子几乎不可见,车身投影面积变小,目标也不再是前后遮挡,而是平面摊开、密集排列。

这个变化意味着卷积特征的空间分布完全偏移。通用检测模型在预训练阶段学到的更多是“侧面车身”“正面人脸”“直立行人”这类视角特征,一旦迁移到俯视影像,特征不匹配,最常见的表现就是大量漏检和把屋顶误检成车辆。我早期做过一个对照实验:同一套模型权重,在普通街景验证集上mAP接近0.5,在无人机俯视测试集上直接掉到0.2以下。这不是模型不够强,而是数据分布从一开始就没对上。

1.2 目标尺寸的分布完全不一样

航拍图像里,目标通常只占几十甚至十几个像素。很多人对“小目标”没有概念,工程上一般用GSD(地面采样距离)来量化,也就是图像中一个像素对应实际地面上多少厘米。同一台相机,飞行高度越高,GSD值越大,目标像素越少。

一个实长约20米的卡车,在GSD为10cm/pixel时约占200像素;但如果飞到GSD为50cm/pixel的高度,就只剩约40像素。很多航拍大图是4000×3000甚至更大,如果直接缩放到640×480去训练,很多目标可能只有三五个像素,几乎不可辨认。通用数据集里的目标相对较大,目标占画面面积的比例通常在百分之一量级;而航拍密集场景中,几百辆车挤在一个画面里,单目标占比往往小于千分之一。这种尺度分布的差异,决定了通用模型的预设几乎不适合直接套用。

1.3 密度、遮挡与背景复杂度

航拍数据另一个容易让人头疼的是目标密度。停车场、港口、物流园区的图像里,同类目标经常排得密密麻麻,互相挤压、遮挡。检测器要在密集场景中逐个区分实例,预测框之间的IoU往往很高,NMS后处理稍不留神就把一堆正确结果误删了。

背景复杂度也不低。同一张航拍图里可能同时出现树荫、屋顶阴影、道路标线、水面反光、玻璃反光等,目标和背景之间纹理相似,容易产生大量误检。类别不平衡问题则更明显:车辆类别可能有上百万样本,而船只、飞机、某些农业设施可能只有几千个,模型天然偏向高频类别,低频类别几乎学不到有效特征。

1.4 同是航拍,不同场景之间也有明显域偏移

即使都是无人机航拍,不同飞行高度、不同相机传感器、不同天气条件下的视觉差异也很大。晴天和阴天,正射和倾斜视角,可见光和热红外,模型效果会剧烈波动。很多项目组误以为用一套公开数据训练完就能通用,结果换一个拍摄区域、换一款无人机,指标立刻下跌。

这也是为什么我在选型时不太迷信“某个数据集特别全”的说法。公开数据集的场景、传感器、标注风格已经固定,真正务实的方式是把它当成基础训练集合,再针对自己的目标场景采集与标注一部分数据做微调,让模型见过“你真实要处理的长相”。

2. 航拍数据集怎么分类,怎么按项目选型

2.1 高空遥感型:大范围、旋转框、普查类任务

“高空遥感型”指的是拍摄高度在数公里以上,由卫星或高空固定翼平台获取的遥感影像。这类数据覆盖范围极大,单张图尺寸经常达到上万像素。目标以建筑物、储油罐、桥梁、大型车辆、舰船等大型地物为主。由于俯视角度下目标方向任意,水平框往往包进太多背景,因此很多标注采用旋转框。

如果你的任务是“对大片区域做目标普查”,比如港口舰船统计、城市建筑变化检测,优先考虑这类数据集。优点是覆盖面积大、目标类型明确;缺点是正射影像为主,缺少低空视角的细节,对行人、普通车辆这类小目标检测能力有限。选型时还要注意遥感影像是否真的来自目标传感器,多光谱影像和普通RGB影像的训练结论不能直接互换。

2.2 低空无人机型:视频流、密集小目标、交通参与者

“低空无人机型”是目前无人机目标检测里用得最多的一类。它一般由多旋翼无人机在几十米到几百米高度拍摄,很多以视频序列形式发布,内容常包含行人、车辆、骑车人等交通参与者。标注以水平框为主,部分还会附带目标跟踪ID。

如果你的项目是低空巡逻、车流统计、重点区域安防,这种类型最合适。它的特点是目标密度大、尺度变化剧烈、帧间关联强。但要注意,这类数据的视频时间相关性很强,同一个目标会连续出现在几十帧里。如果做随机划分训练集和验证集,同一辆车可能同时出现在两边,得到的结果会虚高,部署到新场景后立刻现原形。

2.3 合成仿真型:标注便宜、适合预训练

合成仿真数据集是用3D引擎或仿真环境生成的航拍图,车辆、行人、建筑等目标可以由场景程序自动摆放,标注完全自动生成,天气、光照、高度都能定制。缺点是图像分布和真实影像始终有差异,直接训练出来容易在真实数据上水土不服。

工程上更推荐把合成数据放到预训练阶段,让模型先学会“目标大致长什么样”,再用少量真实数据微调。如果你要检测一种很罕见的物体,比如某种特殊工程车,真实样本只有几百张,可以先拿合成数据把类别语义学起来,再用少量真实样本把外观细节拉回来。但一定要清楚,最终效果评估必须以真实场景数据为准,合成数据只能当辅助。

2.4 怎么选:一张决策表方便抄作业

选数据集前先问自己三个问题。第一,目标有多大,是大型设施、车辆还是行人级别?第二,你要做的是单张图检测,还是视频流实时检测?第三,检测结果要水平框还是旋转框,模型要部署在服务器还是机载边缘设备?

我把常见情况整理成一张表,可以直接对照参考:

任务类型推荐数据集类型重点关注
大范围卫星遥感普查高空遥感型旋转框、超大图切图、类别以大型地物为主
低空车流统计与安全巡检低空无人机型密集小目标、按视频序列划分数据
罕见目标检测合成仿真型 + 少量真实数据预训练、域适应、数据增强
实时机载检测低空无人机型 + 轻量化模型推理速度、模型裁剪、量化部署

除了技术维度,许可授权也必须查。有些数据只允许学术研究,商用会惹麻烦;有些即使能商用也要求署名。这个坑我在项目交付阶段踩过,后面专门讲。

3. 拿到数据集后的第一件事:标注格式与质量体检

3.1 先把标注格式统一成一套

公开航拍数据集的标注格式非常混乱。常见的有XML格式的方框标注,每张图对应一个XML文件;有JSON格式的标注,内部包含图片信息、实例列表和分割多边形;有TXT格式的归一化坐标,每行一个目标,保存类别、中心点、宽高;旋转框数据还会保存四个角的坐标。格式转换是第一步,绝对不能省。

转换时最需要注意三点。第一,坐标系差异,有的是左上角和右下角,有的是中心点加宽高,换算公式要写对。第二,归一化坐标与绝对像素坐标不能混用,否则训练损失直接异常。第三,类别ID的起始值,有的数据从1开始,而框架要求0开始,不调整会在损失函数计算时越界。

下面这段Python代码可以把TXT归一化格式转换成绝对像素坐标,并顺手检查是否越界:

def txt_to_abs(txt_line, img_w, img_h): parts = txt_line.strip().split() cls_id = int(parts[0]) cx, cy, w, h = [float(x) for x in parts[1:]] x1 = (cx - w / 2) * img_w y1 = (cy - h / 2) * img_h x2 = (cx + w / 2) * img_w y2 = (cy + h / 2) * img_h return cls_id, [x1, y1, x2, y2] # 使用示例:打印越界框信息 for line in txt_lines: cls_id, box = txt_to_abs(line, img_w, img_h) if box[0] < 0 or box[1] < 0 or box[2] > img_w or box[3] > img_h: print('越界框:', cls_id, box)

越界框不能直接丢,要看情况,有些只是标注时把边界目标的多余背景包进来了,截断到图像边缘就行;有些则是坐标错误,需要人工复核。

3.2 统计bbox分布,给模型量身定做

数据格式统一后,我强烈建议先做一次标注统计,而不是直接开训。统计内容至少包括:目标像素面积分布、宽高比分布、类别数量、每张图目标数。这些数字直接决定训练分辨率、是否切图、模型输出层设计。

举例来说,统计后发现90%的目标面积小于32×32,而你的训练输入只有640×640,并且直接对完整原图缩放,那么绝大多数小目标信息会在下采样过程中消失。这时候就需要提高输入分辨率、使用切图训练,或者在特征金字塔上增加高分辨率特征层。

下面是一个统计脚本的核心片段,用来快速了解数据集里的目标尺寸:

import numpy as np areas = [] whs = [] for box in all_boxes: w = box['x2'] - box['x1'] h = box['y2'] - box['y1'] areas.append(w * h) whs.append(w / (h + 1e-6)) areas = np.array(areas) print('box面积分位数:', np.percentile(areas, [50, 80, 90, 99])) print('宽高比中位数:', np.median(whs))

我习惯把面积小于32×32的目标比例单独打印出来。如果这个比例超过50%,后面所有训练策略都会围绕“保住小目标”来设计。宽高比中位数也很关键,如果大量目标宽高比超过1:5,比如舰船、桥梁,水平框的评估会有很多冗余面积,可能要换成旋转框检测方案。

3.3 清洗脏数据,不要贪多

公开数据集再“干净”,实际用起来也总有脏数据。最常见的有这几种:标注框超出图像边界;目标太小且模糊,人眼都看不清;视频数据里的重复帧;类别标签错误,把轿车标成卡车;空标注图片被混进训练集。

我的清洗流程一般分三步。第一步,脚本过滤坐标越界、宽高为0、面积过小的标注。第二步,人工抽检,随机采样几百张图,重点看类别混淆区域,比如远处的车辆和屋顶有没有标反。第三步,根据业务需求做类别归并,比如把小汽车、SUV、公交车合并成“vehicle”,减少类别不平衡的影响。

但要注意别过度清洗。某些场景下,模糊目标本来就是真实分布的一部分,全删了会导致模型在低分辨率目标上泛化更差。我的经验是,清洗主要针对标注噪声,而不是针对难样本。难样本应该保留,甚至要额外增强。

4. 从数据集到模型:训练与评估中的关键操作

4.1 切图、缩放与增强:小目标友好型预处理

无人机航拍图原始分辨率很大,常见做法是直接缩放到固定尺寸,但这会对小目标造成毁灭性打击。我常用的方案是滑窗切图加重叠:把大图切成多个patch,patch之间有10%~20%的重叠,确保跨边界的完整目标至少完整出现在一个patch里。每个patch可以缩放到模型输入尺寸,再送进网络。

切图尺寸需要根据目标尺寸选。如果目标平均大小是80×80像素,patch用800×800就合适;如果目标平均只有20×20,patch可以适当小一些,比如600×600,避免缩小后目标消失。推理时还要把多个patch的检测结果映射回原图坐标,再统一做NMS合并,这就是所谓的“大图切图推理”,后面排查部分会再提到。

数据增强方面,我比较推荐mosaic增强和copy-paste增强。mosaic把四张图拼在一起,能丰富上下文信息,对检测器的鲁棒性有帮助;copy-paste把目标从一个图复制到另一个图,适合目标稀疏的数据集。但无人机俯视图里目标有真实朝向,增强时尽量不要做90度旋转,否则目标外观会变成不存在的角度,反而增加学习难度。

4.2 模型结构、检测头和部署约束

模型选型要同时考虑数据集特性和部署环境。航拍检测目前的提升点主要有三个:多尺度特征融合、小目标检测层、旋转框回归头。

多尺度特征融合几乎是必选项,建议优先选带FPN或类似结构的检测器。小目标比例很高时,额外增加P2层,也就是更高分辨率的浅层特征,能明显提升小目标召回。虽然计算量会增加,但对航拍场景来说通常是值得的。如果目标是有明显朝向的车辆、船、建筑,旋转框检测器比水平框更合适,但旋转框的表示方式和角度回归稳定性比水平框麻烦得多,训练难度更高。

部署在机载边缘设备时,参数量和推理速度是硬约束。我的经验是先训练一个大模型验证效果上限,再蒸馏或换成轻量化模型,而不是一开始就用小模型反复调参,那样会同时面对“模型能力不足”和“调参无效”两个难题。方向错了,后面再努力也补不回来。

4.3 分阶段训练与超参数调整

训练策略上,我比较喜欢分阶段。先用公开通用预训练权重初始化,不要从头训练,这样收敛快很多。接着用较低分辨率比如640×640训练若干轮,让模型先建立对目标的基础感知。然后再切到高分辨率比如1280×1280微调,重点把注意力放在小目标上。最后如果推理时间允许,可以开启测试时增强,把原图和翻转图的结果合并输出,一般都能稳定涨一点。

学习率方面建议带warmup,总epoch一般在30到60轮之间。航拍数据类别往往不均衡,如果某些类别样本极少但业务上很重要,可以对这些类别的损失函数加权,或者做正样本过采样。网络输出的置信度阈值不要拍脑袋定,等训练完拿到PR曲线再选。

验证集划分要格外小心。视频类数据不能随机分帧,否则同一辆车会同时出现在训练集和验证集里。我通常按视频序列划分:一条视频的前面部分进训练集,后面一小段进验证集,这样可以测试模型对连续新帧的适应能力。

4.4 评估指标不能只看mAP

mAP是通用检测最常用的指标,但在航拍任务里有很大误导性。航拍图中大量小目标对整体AP的贡献很小,而少数大目标只要框得准就能拉高数值。所以我会按目标尺寸分组看AP,至少分成小、中、大三组,其中小目标的定义一般用像素面积小于32×32来判断。

如果小目标的AP远低于其他组,说明模型还没充分学到小目标特征。这时不要急着加数据,先回到训练分辨率、FPN层设计和标注质量上去找原因。另外还要看每类的PR曲线,特别是低置信度区间。在巡逻项目里,漏检比误检更致命,我会把置信度阈值压低一点,宁愿后处理阶段用规则过滤误检,也不想漏掉关键目标。

还有一个简单粗暴但很有用的指标:平均每张图检出的目标数与真实目标数的比值。如果远小于1,说明整体漏检严重;如果大于1且mAP又低,大概率是误检太多。这个比值配合PR曲线一起看,能快速定位问题方向。

5. 常见问题与排查技巧实录

5.1 小目标检测不到,问题可能不在模型

小目标漏检是航拍任务里出现频率最高的抱怨。遇到这种情况,我建议先做三件事:一是确认训练时到底有没有把图片缩得太小;二是确认有没有用切图训练和切图推理;三是检查标注里的小目标漏标率。

切图推理是很有效的补救措施。官方术语叫切片辅助推理,实现思路很简单:推理时把大图切成多个patch,让模型在近原分辨率上检测,再把检测结果映射回原图坐标,最后统一做NMS。尤其当你已经有一个很好的模型,但加载大图直接推理时小目标全部漏掉,这个方法往往能救回来。

还有一个反直觉的现象:模型在训练集上检测得很准,但测试集上小目标漏检严重。我试过把训练集检测结果和GT可视化叠加,人工看漏检区域,发现很多所谓“漏检”其实是GT漏标。模型学到的真阳性被当成负样本抑制了,这时候需要补标注,而不是调模型。

5.2 训练集验证集效果不一致,先查数据划分

训练集效果好,验证集却崩,最常见的两个原因分别是数据划分泄露和预处理不一致。视频数据随机分帧会把同一目标的多个相似帧分到两边,模型表现虚高;训练时用了mosaic增强,但验证时没有做等价处理,也可能造成差距。

解决办法是数据准备阶段就把划分逻辑写清楚。按视频或按场景划分训练与验证集,确保验证集不参与训练。如果验证集来自真实目标场景,训练集来自公开数据集,效果下降可能只是正常的域偏移,这时需要通过加入目标域数据、域适应、风格迁移等方式来缩小差距,而不能只盯着训练集指标。

5.3 旋转框训练不稳定的处理办法

旋转框检测比水平框多一个角度维度,训练崩溃的原因通常有两类。一类是角度采用弧度制,数值范围在边界处发生剧烈跳变,导致回归目标不稳定;另一类是长边定义法在目标接近正方形时,长边方向不稳定,角度预测随机翻转。

处理手段也比较固定。第一,对角度损失使用循环平滑损失,避免边界突变。第二,接近正方形的目标可以忽略角度惩罚,让它退化到水平框,反正旋转框和水平框对这类目标差别不大。第三,推理时不能用水平框IoU做NMS,必须计算旋转框的交并比,否则合并结果会错得离谱。训练中出现loss下降后突然反弹,优先查角度回归部分,而不是盲目调学习率。

5.4 问题排查速查表

为了省事,我把航拍检测训练中常遇到的问题整理成一张速查表,方便大家对照排查:

现象可能原因解决思路
mAP整体偏低数据域与模型预训练域不一致换航拍预训练或加入目标域数据微调
小目标AP明显低于其他组输入分辨率太低、下采样过强、GT漏标提高分辨率、增加P2层、切图训练
PR曲线召回低置信度阈值高、GT漏标严重降低阈值、补标注、检查数据清洗
误检很多背景复杂、类别不均衡、NMS阈值低增加难负样本、提高NMS阈值、后处理过滤
验证集比训练集还好数据划分泄露按视频序列重新划分,避免帧重复
旋转框训练反复震荡角度回归边界不稳定循环平滑角度损失、忽略正方形角度

6. 一些只有踩过坑才会知道的事

6.1 数据集数量不是越多越好,一致性才是

我见过一个团队把所有能找到的航拍数据全塞进训练,结果类别体系互相冲突,标注质量参差不齐,模型效果反而更差。数据不是越多越好,一致性比数量更重要。与其用十个风格迥异的数据集混合,不如挑两三个场景接近、标注一致的数据集,再配合少量真实场景数据微调。统一类别定义也是重点工作,同样的“车”,在不同数据集里可能包括不同车型,合并前一定要想清楚业务需求。

6.2 许可证、隐私与合规,真的别忽视

很多公开数据集只允许学术研究,即使你只是公司内部做实验,也需要看条款。无人机影像采集还涉及地物隐私和数据合规问题,尤其当你要在真实城市区域采集数据做商业项目时,最好提前咨询专门人士,不要等模型都训完准备上线了才发现数据来源不合规。我吃过这个亏,项目中途换数据集,等于所有训练重新来一遍,时间和精力损失很大。

6.3 一个帮我省了很多时间的习惯:给数据做版本追溯

我会把原始标注、清洗脚本、清洗后的数据集版本分别存放,甚至在标注清洗前后各做一次统计并保存结果。这样做的好处是,当模型出现异常指标时,可以快速回溯是数据问题还是训练问题。几个月后想复现某个结论,也不需要重新猜当时怎么处理数据。这个习惯帮我省下的时间,远超我维护版本所花的时间,强烈建议你也试试。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询