ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

无人机航拍数据集整理:从原始影像到可训练数据的完整流程

无人机航拍数据集整理:从原始影像到可训练数据的完整流程 一说到无人机航拍项目大家的第一反应往往是飞得够高、拍得够多然后赶紧丢进模型里训练。但真正上手之后你会发现前期最耗时间、也最决定成败的恰恰是“无人机航拍数据集整理”这个听起来不酷、甚至有点枯燥的环节。数据乱、漏标多、尺寸五花八门后续不管用 YOLOv8 还是 MMRotate效果都很难跑起来。我最近刚完成一个面向农田识别和城区车辆检测的航拍数据集整理项目里面既有自己布点飞回来的原始影像也有从公开数据集里筛选出来的补充素材。整个过程踩了不少坑也沉淀出一套从原始素材到可训练数据集的完整流程。这篇内容写给打算用无人机航拍数据做目标检测、语义分割或旋转框检测的同学尤其是刚开始接触、不清楚“从哪儿下手整理”的那批人。我会把需求分析、素材清洗、标注规范、格式转换到训练验证的完整闭环讲清楚最后再附上几个高频问题的排查办法。1. 先想清楚数据边界检测目标、场景与模型选型1.1 从任务反推数据需求一个常见的错误是先下载一堆公开数据集再回头想“我到底要做什么检测”。正确做法应该反过来先把任务定义为“用无人机在哪个高度、什么场景下、检测哪几类目标”再把数据需求变成可量化指标比如目标类型数量、最小目标像素尺寸、正负样本比例、是否需要适应不同光照和季节变化。我以前带过一个小目标检测项目初始拿到一张分辨率 4000×3000 的航拍图整幅图里有几百辆小车每辆只有 20×30 像素。如果按通用检测思路把整幅原图直接塞进网络绝大多数目标都小到没法学训练完漏检率非常高。后来把图切成 640×640 的 patch再搭配多尺度增强结果才慢慢好起来。这个例子说明切块策略、尺度策略一定是在整理数据集阶段就要定的不是训练时补救的事。任务的类别界定也直接影响标注规范。比如“车”要分成 car、truck、bus还是统一用 vehicle“农田里的作物行”和“杂草”怎么划分界线建筑物是不是要把边缘轮廓也算进去这些细节都要在数据整理方案里写清楚否则每个标注员各标各的模型学到的只是一个“混乱的平均值”。1.2 自采航拍影像的收益与成本自己飞一趟无人机看起来最费事却是很多时候绕不开的选择。公开数据集终究是别人的成图类别分布、成像高度和你的实际场景未必对齐。比如我在农田项目里需要 50~120 米高度下的作物长势影像公开农业数据大多是地面视角或高分辨率卫星无法直接满足。自己采集要注意三个参数航线重叠率、相机曝光和光照方向。一般建议使用下视相机固定朝向地面航向重叠率取 60%~80%旁向重叠率取 50%~70%。飞得太高地物细节不足飞得太低覆盖效率差还容易因风速产生运动模糊。顺光采集比逆光好得多逆光时阴影会严重影响标注效果阴天其实最适合做数据集光线平、影子少模型更容易学到本质特征而不是阴影特征。采集时一定要同步记录经纬度、海拔高度和拍摄时间。这不仅是整理归档需要后续做多传感器对齐和野外部署时的航线规划这些元数据都能派上大用场。1.3 公开数据集的取舍与拼接策略公开数据集是用来补长尾的不是用来凑数的。我在整理过程中挑选公开集的四条标准是场景高度接近、分辨率足够、标注格式可转换、类别与任务有交集。做航拍目标检测值得优先考虑的候选集有以下这些数据集任务类型特点适合补充什么VisDrone目标检测/跟踪无人机视角小目标极其密集车辆、行人、自行车DOTA旋转框检测大场景航拍图像类别丰富旋转目标、船舶、球场、桥梁UAVDT目标检测/跟踪城区车辆、行人、道路城市多目标跟踪xView目标检测卫星/航空图像小目标多车辆、船、储油罐等基础设施Agriculture-Vision语义分割农田正射影像农田胁迫、杂草、叶面积指数CUB-200-2011鸟类分类/检测精细类别标注鸟类识别类项目辅助训练CUB-200 严格来说不是航拍数据集但它在细粒度鸟类识别中非常常用如果你的项目本身是鸟类识别系统这类数据反而比普通航拍集更合适。关键是不要迷信数据集名称里有没有“航拍”两个字而要看拍摄视角、目标类别和你的任务是否匹配。公开集和自采数据合并时要小心分布偏移。比如 VisDrone 多在高层建筑密集区域色彩饱和度高而你的农田场景以绿色为主直接混训容易让模型产生环境偏好。我的做法是分层抽样让每个子集的场景比例保持一致比如自采占 80%公开集占 20%并且每个批次内部再做随机打乱。2. 原始素材的清洗与工程化整理2.1 目录结构一开始就要能追溯数据整理最怕的就是目录一锅炖。我推荐按“项目-场景-采集批次”三级来组织每个批次下面再按原始影像、筛选影像、标注文件、切图输出分目录。这样无论是自己回补标注、还是交给同事做训练都不会找不到东西。下面是我实际用过的目录结构可以参考dataset/ ├── project_agri/ │ ├── scene_paddy/ │ │ ├── batch_01_2025_05_12/ │ │ │ ├── raw_images/ │ │ │ ├── selected_images/ │ │ │ ├── annotations/ │ │ │ ├── split_train/ │ │ │ └── split_val/ │ │ ├── batch_02_2025_05_18/ │ │ │ └── ... │ └── scene_orchard/ │ ├── batch_01_2025_06_03/ │ └── ...每次飞行记录建议单独建一个metadata.csv记录图片名、拍摄时间、GPS 经纬度、高度、焦距、重叠率和备注。这一步看似多余但在后期做数据筛选和补充采集时能帮你省下好几个小时。我曾经因为没记录航高后面想按高度区间做多尺度评估时只能靠肉眼猜非常被动。2.2 图像质量筛选存下来的应该是精华飞行素材里总能筛出大量不能用的图包括运动模糊、对焦不准、部分区域曝光异常、镜头上的水渍痕迹、边缘畸变严重等。逐张人工看当然最靠谱但数据一多还是要写脚本做初筛。一个实用的初筛策略是用 OpenCV 计算清晰度评价指标比如拉普拉斯方差或 Tenengrad 梯度设定阈值卡掉过于模糊的图片再结合亮度均值和直方图判断曝光是否合理。阈值不要一上来就定死先跑一批数据看可视化结果再根据分布调整。筛选时还有个容易被忽略的问题同一条航线的相邻帧重叠度极高。如果全部保留会导致训练集和验证集之间出现“近亲照片”验证指标虚高真正部署时却一塌糊涂。一般做法是抽帧间隔 2~5 帧并且按地块或航次来划分集合而不是简单随机打散。2.3 元数据对齐与多源数据合并无人机拍摄时飞行日志和影像常常是两个独立来源。你需要的不仅是图片本身还有飞控记录的 GPS。部分消费级无人机的照片自带 EXIF 信息可以用 exiftool 批量导出如果图传链路或自组机只写日志就得按时间戳把日志和照片配对。这一步的常见坑是时间戳时区不统一相差 8 小时GPS 全对不上。我一般把所有时间统一成 UTC 并明确记录然后按“影像文件修改时间±1 秒”和“日志采样时间”做最近邻匹配。匹配后检查距离突变点往往能抓出几张误配的图这些图如果不处理后续做多传感器融合时序会很混乱。如果涉及高光谱或多光谱数据比如林业、矿山项目里常见的 ICVL 高光谱数据集还需要额外记录波段中心和光谱响应函数这一步不能在后期补一定要在整理初期完成。2.4 大影像切块别把整幅正射图当训练样本航拍或倾斜摄影得到的正射影像动不动就是 1 万×1 万像素以上。直接拿这种大图训练显卡显存扛不住目标尺度也差异过大模型很难在有限分辨率下学到稳定的特征。我在实操时习惯用 GDAL 或 QGIS 的切图工具把大影像按 512、640 或 1024 的网格切块同时保留地理坐标信息。切块时相邻块之间要留 10%~20% 的重叠防止目标正好落在边界被截断。切完之后先随机抽样 100 张看一眼确认没有空白块、全黑块以及切块边缘没有把重要地物切成两半。切块和分训练集最好在同一个坐标系下完成不能这边用 UTM、那边用经纬度否则后面训练时坐标换算全都错位。我踩过这个坑最后不得不重新切了一轮数据浪费了快一个下午。2.5 视频抽帧的取舍很多人会拿着航拍视频来问我到底要不要把每一帧都抽出来我的建议是先明确用途。如果是训练目标检测抽帧间隔建议 1 到 2 秒一帧这样可以同时保证连续性又避免重复帧过多。如果是训练时序模型或目标跟踪那就需要保持连续的帧序列不能随便抽。抽帧时还要注意运动模糊无人机转弯、俯仰或者快速飞行时地面景物会有明显拖影这些帧要提前过滤掉。我通常在抽帧脚本里加一个简单规则检测帧间光流或拉普拉斯方差连续三帧评分过低就直接丢弃这一段视频。3. 标注规范、工具与格式转换实战3.1 标注工具怎么选标注是整理数据集里最花人力的环节。工具我试过 LabelImg、X-AnyLabeling、Label Studio 和 Roboflow简单总结一下各自定位LabelImg轻量适合个人快速小批量标注导出 PASCAL VOC 或 YOLO 格式X-AnyLabeling支持半自动辅助标注对航拍密集目标比较省力Label Studio适合多人协作和复杂标注类型支持目标检测、分割、文本还能接 ML 后端做预标注Roboflow云端流程齐全从图片上传到自动标注、增强、导出一站式适合不想折腾环境的人但免费额度有限。我个人对小数据集用的是 X-AnyLabeling理由是它在目标密集的航拍图里支持半自动传播显著减少重复劳动。但有一点务必注意半自动标注的初稿必须人工复查。航拍视角目标密集、相互遮挡自动结果经常漏框、错框直接拿去训练等于埋雷。3.2 航拍视角的标注规范必须要提前定死标注规范是训练质量的隐形杀手一定要先写清楚再动手。航拍视角有几条特殊规则需要提前约定最小目标阈值。太小的目标比如 8×8 像素以下人眼都很难确认到底是什么建议直接不标。我通常把阈值定为 16×16 像素低于这个尺寸弃标。遮挡处理。被树冠、电线、建筑边缘挡住一半以上目标是否要标团队内部必须统一。我一般只标遮挡面积小于 50% 的目标。目标出现在两个 patch 的边界。切块重叠区域内的目标要有一套明确规则避免同一目标被标两次。我的做法是目标中心点落在哪个 patch 就以哪个为准。类别边界。比如“农田中的车辆”和“道路上的车辆”如果任务只需要 vehicle 这一类就不拆子类否则标注成本翻倍还容易造成类间混淆。难例处理。很多物体在航拍视角下只是灰色或白色小点人眼基本分不清是车还是井盖这类样本必须标记为“难例”由两人核对后再决定是否进入训练。建议在开始前做一页标注规范示例图加上 10 张典型样例图片标注员看 10 分钟就比边标边解释高效得多。还有一个经验项目负责人在交付给他人之前先自己标注前 50 张样例能显著降低返工率。3.3 格式转换从 COCO/VOC/DOTA 到 YOLO不同数据集格式不一样训练框架常要求统一成 YOLO 的 txt 格式或者 COCO 的 json。YOLO 格式核心是“类别 id、归一化中心 x、归一化中心 y、归一化宽、归一化高”。DOTA 的旋转框则要保留四点角坐标并加上角度信息。VisDrone 转 YOLO 是很多同学都会遇到的下面这个脚本是我实际用过多次的基础逻辑把平面坐标除以图像宽高得到归一化坐标def visdrone_to_yolo(txt_path, img_w, img_h): results [] with open(txt_path, r, encodingutf-8) as f: for line in f: data line.strip().split(,) if len(data) 6 or int(data[5]) 0: # 第6列是质量标记0表示不合格直接跳过 continue category int(data[0]) # VisDrone 的类别 id 不是从0开始的 x1 float(data[2]) y1 float(data[3]) x2 float(data[4]) y2 float(data[5]) cx ((x1 x2) / 2) / img_w cy ((y1 y2) / 2) / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h results.append(f{category} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) return results注意 VisDrone 的类别 id 和 YOLO 类别 id 往往不一致要做映射表偏移。很多新手在这翻车最后训练出来所有类别的预测结果全乱了。如果做旋转框检测用 MMRotate格式要求是四点角坐标或旋转角表示可以直接把 poly 格式存成四点坐标。转换时要注意边界情况比如边界框越界、宽高为负、目标中心点在图像外面的一定要过滤掉否则训练时会报 nan整个 loss 直接崩掉。3.4 语义分割数据的准备如果项目要做语义分割就不能只画框了得准备像素级 mask。农田语义分割是典型场景比如你需要识别作物、土壤、杂草、水体和道路。比较稳妥的流程是先把大正射影像裁剪成 512×512 的图块然后用 QGIS 或多边形工具在图上勾画类别导出栅格掩膜再用 GDAL 把掩膜同样切片保证图片和 mask 完全对齐。图片块和 mask 块必须使用完全一样的行列范围和投影否则训练时一个像素类别会对应到边上的图像内容。实操中我习惯用 Rasterio 的 window 读写按同一个 window 同时读取图片通道和掩膜这样对齐关系天然正确不用反复检查。语义分割数据集还有一个“类不平衡”问题农田影像里背景占比往往高达 90% 以上如果直接把整块图拿去训练背景会主导梯度更新。做法一般是统计每个图块中前景类占比只保留前景占比超过 10% 的图块或者对前景占比低的图块做重采样。同时在损失函数里对背景类适当降低权重。4. 训练集/验证集划分与增强策略4.1 划分方式尽量不要纯随机训练集、验证集、测试集的比例多数资料给的是 7:2:1 或 8:1:1。航拍数据真正要紧的是划分粒度完全按图片文件随机划分等于让验证集“见”过训练集里高度重叠的相邻帧。我的做法是按航次或按地块划分比如十个地块取八个训练、一个验证、一个测试。这块宁可牺牲少量训练量也要保证验证指标可信。如果做自动驾驶场景SemanticKITTI、CLCD 这类道路数据集也可以作为辅助基准但它们的相机高度和无人机完全不一样混用前要仔细评估视角差异对特征分布的影响。我在一个城区车辆计数项目中强行混入过此类数据结果验证集 mAP 反而掉了最终只能按航次分层重新划分。4.2 类别不平衡的采样策略整理快要结束时最好先统计一次每个类别的实例数量。如果 car 有一万个boat 只有十几个模型大概率会忽略少数类。处理上可以这样对少数类做复制粘贴增强给少数类提高采样权重或者干脆把相似类别合并成一个大类比如把船和船坞合并为“水上设施”。复制粘贴增强在航拍图上效果极好因为目标小粘贴到背景区域时基本不会穿帮。这也是 YOLOv8 内置 mosaic 能力不能完全替代手动叠加的原因。我自己实验下来少数类样本量在总样本 5% 以下时复制粘贴增强能让验证集 mAP 提升 2~3 个百分点。4.3 增强策略不是越多越好增强不是堆越多越好。航拍真实场景的光照差异大所以随机亮度和对比度增强可以保留但大幅度的裁剪和旋转要小心无人机图像有明确的方向性很多地物只有在特定朝向下才可辨识。比如建筑立面、道路走向、作物行方向一旦旋转过度模型可能学到错误的空间先验。我在训练时常用的初始配置是Mosaic 0.5HSV 随机扰动 0.1水平翻转 0.5其他增强先不开。先跑一版不加增强的基线再逐步增加不能一上来全部开启否则出问题根本不知道是哪个环节导致。4.4 第一次训练验证时盯什么我把验证指标分成两部分一是 loss 曲线二是可视化预测结果。loss 下降正常但 mAP 上不去大概率是训练集和验证集分布不一致比如同一个场景以不同形式出现在了两个集合里或者标注质量本身有问题。可视化预测结果时重点关注三类错误漏检Ground Truth 里有的目标没被框出来重复框同一个目标被多个检测框覆盖错位框框住了物体一部分但中心明显偏移。出现 mAP 比预期低 10 个点以上时先不要调学习率应该回到数据链路排查。大多数情况下问题出在标注错位或数据泄漏而不是网络结构不够强。5. 踩过的坑高频问题与排查速查表我把整理航拍数据集过程中高频出现的状况整理成一张表格方便以后自查现象可能原因排查方向训练 loss 很低但 mAP 极低数据泄漏或标注错位检查 train/val 是否同源抽样可视化 50 张标注看坐标偏移小目标完全检不出原图直接训练、无切块、无小目标增强切块到 640打开 mosaic 和小目标增强目标框全部偏在左上角标注坐标归一化错误或图像宽高搞反对比 images 尺寸和标注文件中的 w、h统一宽高顺序预测置信度普遍低于 0.2背景噪声太大、类别太杂、标注不规范提高负样本过滤阈值精简类别统一标注口径验证集首轮 mAP 波动超过 5%验证集太小或划分不稳定增加验证集样本量到 500 张以上按航次分组MMRotate 训练时报 nan边界框坐标越界或宽高为负过滤越界数据检查 DOTA 转 poly 的点序语义分割 mask 与图像不对应切片行列范围不一致或坐标系不同用 Rasterio 同步 window打印尺寸与投影验证这些坑看似不难但在赶进度时确实很容易被忽略。还有一个值得特别注意的坑多人标注一致性。如果两个标注员对同一批图片的标注结果重合率只有 70%即使整个流程都对模型也很难收敛到高精度。所以标注完成后最好随机抽 5%~10% 的图片做两次标注一致性检查用 IoU 计算平均重合度低于 0.85 就需要重新对齐标注标准。具体操作上我建议每个批次结束后输出一份“标注质量报告”内容包括每类目标数量、框尺寸分布、漏标抽样结果、多人一致性 IoU。这份报告最后放进训练日志往后模型效果变差时回查数据质量会非常方便。6. 从云端和社区获取辅助数据集的补充思路除了自己飞和经典公开集现在还有两个常见渠道值得用起来Hugging Face 上的现成数据集以及各类比赛公开的数据集。Hugging Face 数据集的优点是下载方便、格式统一很多社区已经帮你做过初步清洗缺点是类别和质量参差不齐依然要花时间评估。比赛数据集方面农业领域有 Agriculture-Vision Challenge城市遥感有 DeepGlobe、xView 等这些比赛通常提供带官方划分的训练验证集对做论文实验非常合适。想用得顺手我一般会先看数据集的标注说明文档再下载并跑一个简单的类别统计脚本快速判断它和自采数据的分布差距。另外如果只是为了验证算法流程不需要追求真实场景也可以先用公开的合成或仿真数据跑通 pipeline再替换成真实航拍数据。这样可以减少前期标注压力。7. 我最终的几点体会这个项目做下来我最大的体会是数据整理不是一个一次性完成的前置步骤而是一个需要反复迭代的闭环。每次模型在验证集上表现异常都要先回到数据整理环节去检查是不是标注漏了、类别偏了、集合切分串了。与其花几周训练一个华丽模型不如先把手上的影像整理成一份干净、有据可查、可追溯的训练资料。最后再分享一个小技巧给一批数据做完整理后可以专门留出 50 张图作为“灾难测试集”标注一些最刁钻的场景比如强逆光、雨雾、重度遮挡。这些图不参与训练只用来做最终验收往往能比常规验证集更真实地反映模型部署水平。我自己在多个项目里试下来这套思路比单纯盯验证集 mAP 要靠谱得多。
返回列表