简介面向固定翼无人机视觉检测任务这份YOLO格式数据集包含数百张真实场景图片已按mq-20-drone单类别完成标注适用于yolov5、yolov7、yolov8等主流目标检测算法。数据集目录已预先划分好train、val、test集合并附带data.yaml配置文件可免去格式转换与手工划分环节直接投入模型训练。包体共624个文件其中362张jpg原图、260个txt标签文件以及2个yaml配置压缩后整体约14.56MB图片尺寸与场景复杂度适合进行迁移学习与精度调优。目前已有1098人学习下载适合需要快速搭建无人机检测基线模型的算法工程师、科研人员及相关专业学生。借助该数据集使用者可以直观理解YOLO项目目录结构与标签组织方式直接复现训练流程并在此基础上扩展数据增强或二次标注提升模型对固定翼无人机的识别鲁棒性。1. 几百张YOLO大型固定翼无人机检测数据集拿来就能训但姿势要对如果让你自己从零标一套固定翼无人机检测数据光是框那些细长机身和展开的机翼就够你怀疑人生。固定翼不像多旋翼那样自带对称外形它在航拍画面里经常是细长条、带倾斜角度、甚至被云层切掉一半标注一致性和训练稳定性都很难保证。所以我更愿意拿到别人整理好的数据集再自己补迭代但前提是它的目录结构、标签格式、配置文件都按 YOLO 的规矩来——不然光修数据就要耗掉一个晚上。这套几百张的 YOLO 大型固定翼无人机检测数据集jpg 和 txt 标签一一对应train、val、test 已经划分好data.yaml 里 nc、names 都写清了类别就是 mq-20-droneyolov5、yolov7、yolov8 都能直接读它训练。适合刚准备跑固定翼检测、又不想从标注开始折腾的开发者也适合拿来做 YOLO 系列快速对比的基线数据。来源说明里附过检测结果参考图条件允许可以先对照它判断标注风格和数据质量。2. 目录结构、标签格式与 data.yaml动手训练前先过这三关拿到数据别急着开训练。大部分数据集翻车不是模型问题而是你还没把数据集的“家底”摸清楚。目录怎么看、txt 里写了什么、yaml 到底改哪里这三件事各花三分钟后面能省三小时。2.1 先看清数据集根目录images、labels 和 yaml 一个都别少我拿到任何数据集第一件事就是先看目录树。你不需要逐个文件看关键是确认三件事图片和标签是否一一对应、train/val/test 是否真正划分开、data.yaml 是否在根目录。平时直接用 tree 命令看没有就 find 扫一遍几秒出结果。这套数据集的目录结构大致长这样mq-20-drone-dataset/ ├── data.yaml ├── images/ │ ├── train/ │ │ ├── 0.jpg │ │ ├── 1.jpg │ │ └── ... │ ├── val/ │ └── test/ └── labels/ ├── train/ │ ├── 0.txt │ ├── 1.txt │ └── ... ├── val/ └── test/这个结构里最关键的一条images 目录和 labels 目录里的文件名必须保持一致只是扩展名不同。比如 images/train/0.jpg 对应的标签就是 labels/train/0.txt。这套数据有一部分文件名很长带随机字母后缀是标注平台导出时自动生成的命名不影响读取但你别手动改文件名一改名字对应关系就崩了。 val 和 test 分开独立划分也是我确认过才放心用的。不少公开数据集会把 val 和 test 混在一起训练时用 val 做验证测指标时又用同一批图像结果看起来 mAP 很高真跑起来就露馅。提示目录结构确认过之后就不要再移动数据集整个文件夹。后面 yaml 里要写绝对路径移动一次改一次纯属给自己找事。2.2 txt 标签不是白板每一行五个数字的含义YOLO 格式的标签文件不是空白文档每一行是五个数字表示一个目标框。随便打开一个 txt内容长这样0 0.4921875 0.38194444444444444 0.2890625 0.18333333333333335 0 0.503125 0.5611111111111111 0.3140625 0.22777777777777777 0 0.470703125 0.22777777777777777 0.21640625 0.1388888888888889五个数字从左到右依次是目标类别索引、中心点 x 坐标、中心点 y 坐标、目标宽度 w、目标高度 h。注意后四个值全部是归一化坐标范围在 0 到 1 之间是相对图片宽高的比例不是像素绝对值。类别索引 0 对应 data.yaml 里 names 列表的第一个名字也就是 mq-20-drone。因为这套数据只有一个类别所以每行开头都是 0如果你后面并入新类别txt 里的索引就要跟着变names 顺序和类别索引必须严格对应这是最容易踩的坑之一。新手最常见的误解是打开 txt 看到全是 0 和小数以为文件坏了或者以为这些坐标是像素值直接拿去画框结果框全部错位。其实你只需要记住一点——这里写的是“比例”不是“坐标点”。标签文件还有个隐藏信息某张图的 txt 行数就等于这张图里的目标数量。你可以随机挑几张图数一数如果出现图片存在但 txt 是空文件的情况说明那张图的目标被漏标了如果 txt 行数远大于画面里明显能看到的飞机数量则要检查是不是把远处几个像素的小目标也框了进去。后者对固定翼数据集反而常见因为固定翼在航拍里很容易缩成十几个像素的小点标注得精细是好事但你要知道它存在不然训练时会对小目标的召回率有不切实际的期待。2.3 data.yaml唯一需要你在训练前完全读懂的配置文件这套数据集给你准备好了 data.yaml内容很短但字段含义不能理解错path: /home/you/datasets/mq-20-drone-dataset train: images/train val: images/val test: images/test nc: 1 names: [mq-20-drone]逐行拆。path 写的是数据集根目录train、val、test 分别是指向图片子目录的路径这里用相对 path 的写法所以只写 images/train 这种二级路径就行。nc 是类别总数当前是 1names 是类别名列表顺序就是标签文件里索引对应的顺序。yolov5 和 yolov8 对这组字段的处理方式不太一样yolov5 的旧版本不认 path 字段它默认把 train、val、test 当作相对仓库根目录的路径所以数据集放在仓库外时要么写绝对路径要么把 path 和 train 合并写成绝对路径yolov8 起手就找 path 字段然后拼接 train/val/test。为了让两套框架都能顺利读到我的做法是 train、val、test 三项直接写绝对路径不依赖 path 字段的拼接规则。比如train: /home/you/datasets/mq-20-drone-dataset/images/train val: /home/you/datasets/mq-20-drone-dataset/images/val test: /home/you/datasets/mq-20-drone-dataset/images/test nc: 1 names: [mq-20-drone]这样最稳框架版本怎么换都不会因为拼接逻辑出问题。需要改的只有根路径放 Linux 服务器就写 /mnt/data/...放 Windows 建议用正斜杠写 D:/datasets/...后面会专门讲为什么。3. 训练环境搭建yolov5 与 yolov8 各走一遍数据检查没问题下一步才是训练环境。固定翼数据集对训练框架没有任何特殊要求yolov5、yolov7、yolov8 都能跑但每个框架对应的 Python、PyTorch 版本不一样混着装容易翻车。我的建议是同一台机器上用 conda 为不同框架各建一个环境不要图省事全装进 base 里不然一次依赖冲突就够你解半天的。3.1 版本搭配先定死Python、PyTorch、CUDA 三者别乱配先看显卡驱动支持的 CUDA 版本。终端跑 nvidia-smi右上角有 CUDA Version这是驱动支持的上限不是说必须装到这个版本但 PyTorch 的 CUDA 版本不能超过它。比如驱动显示 12.1那装 cu118 或 cu121 都没问题。我常用的两套搭配方案PythonPyTorch适用框架A3.81.13.x cu117yolov5 / yolov7B3.102.1.x cu118yolov8 / yolov5 新版方案 A 偏保守老机器和老代码都能跑方案 B 适合新装的机器ultralytics 官方对 Python 3.10 以上的支持更友好。如果只为这套数据集跑训练方案 B 就能一步到位。但 yolov7 的代码比较老对 PyTorch 2.x 的兼容性一般你真要跑 yolov7建议单独再开一个 Python 3.8 环境别拿方案 B 硬跑。3.2 yolov5clone 仓库后只需两个命令先创建虚拟环境再拉仓库conda create -n yolo5 python3.8 -y conda activate yolo5 git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txtrequirements.txt 会把 torch、torchvision、opencv 等依赖一起装上。问题常常出在这里pip 默认装的 torch 可能是 CPU 版或者和机器 CUDA 版本不匹配训练时直接显示 CUDA 不可用。所以我一般先手动装 GPU 版 torch再跑 requirementspip install torch1.13.1cu117 torchvision0.14.1cu117 --extra-index-url https://download.pytorch.org/whl/cu117 pip install -r requirements.txt--extra-index-url 指向 PyTorch 官方源pip 才能找到带 cu117 后缀的包。国内镜像上通常没有带加号的版本所以这条命令必须带这个参数。装完验证一下环境python -c import torch; print(torch.__version__, torch.cuda.is_available())输出里 cuda.is_available() 为 True说明 GPU 环境通了。为 False八成是 torch 装成了 CPU 版或者驱动不匹配重新检查 CUDA 和 torch 的对应关系。注意yolov5 仓库更新很勤requirements.txt 内容会随版本变化。如果你 clone 的是最新版它要求的 Python 和 torch 版本可能更高。固定用 Python 3.8 时建议 clone 后先打开 requirements.txt 看一眼版本要求再决定 torch 装哪个版本别让它自己随意装。3.3 yolov8安装 ultralytics 一个包就够了yolov8 和 yolov5 不一样它是一个独立的 pip 包 ultralytics不需要 clone 仓库conda create -n yolo8 python3.10 -y conda activate yolo8 pip install ultralytics一行命令把训练、推理、导出能力全装上。它的坑在于安装时会自动拉一个 torch但这个 torch 版本不一定匹配你的 CUDA。所以我习惯先装 torch再装 ultralyticspip install torch2.1.1cu118 torchvision0.16.1cu118 --extra-index-url https://download.pytorch.org/whl/cu118 pip install ultralytics先装 torch 是让 pip 认为 torch 依赖已满足后面就不会擅自给你换版本。装完同样验证python -c import torch, ultralytics; print(torch.__version__, torch.cuda.is_available(), ultralytics.__version__)三个值都正常输出说明环境就绪。3.4 权重文件几百张数据更配轻量模型训练固定翼这种小数据集我对模型规模的建议是从 yolov8n.pt 或 yolov5s.pt 起步不要一上来就上 l 甚至 x 系列。几百张图撑不起大模型的参数量大模型在小数据上反而更容易过拟合收敛也不稳定训练时间和显存还翻倍。权重文件首次训练时会自动下载但下载源有时不稳定手动从 release 页面下载后放进仓库根目录也行yolov5 默认会找同目录下的 .pt 文件。注意权重文件的序列化格式要和框架版本匹配yolov5 老版本读不了新版 PyTorch 保存的权重遇到 unexpected key 类似的报错基本就是权重和 torch 版本不对应换个对应版本重新下载就好。4. 训练配置data.yaml 适配与关键参数一次调对环境有了权重有了接下来就是把这套数据集真正喂进训练管道。这一章的核心是data.yaml 怎么改、训练前要不要跑自检、训练命令里每个参数是什么含义。4.1 把 data.yaml 改成你机器上的真实路径前面提过我倾向于在 yaml 里写绝对路径这一步就是要落实。打开 data.yaml改成类似这样train: /home/you/datasets/mq-20-drone-dataset/images/train val: /home/you/datasets/mq-20-drone-dataset/images/val test: /home/you/datasets/mq-20-drone-dataset/images/test nc: 1 names: [mq-20-drone]这里提醒一句yolov5 要求图片路径最后一级是 train/val/test 目录它会根据路径推断当前是哪个 splityolov8 不强制这个习惯但路径写错一样报错所以保持一致最省事。如果你在 Windows 上操作路径写成反斜杠时要注意 yaml 的转义问题反斜杠会被当作转义符处理。要写 D:\datasets... 就必须加单引号包住或者干脆统一用正斜杠 D:/datasets/...。这个问题我排查过一回训练时它老老实实告诉我找不到图片折腾了一个多小时最后发现只是路径转义把反斜杠吞了。现在的习惯是不管在哪台机器上yaml 路径一律用正斜杠没有例外。再看 names。标签 txt 里索引 0 对应 names[0]也就是 mq-20-drone。单类别数据集目前不受顺序影响但如果你以后并进其他类别数据合并前一定要先统一索引表否则类别全串位。4.2 训练前自检脚本先确认图片和标签数量对得上训练前跑一遍数据自检是能救命的。我写过一个很小的脚本任何 YOLO 格式数据集都能直接复用统计每个 split 下的图片数和标签文件数统计所有 txt 里的类别分布检查坐标是否越界。import os from collections import Counter splits [train, val, test] base /home/you/datasets/mq-20-drone-dataset for split in splits: img_dir os.path.join(base, images, split) lbl_dir os.path.join(base, labels, split) imgs [f for f in os.listdir(img_dir) if f.endswith((.jpg, .jpeg, .png))] lbls [f for f in os.listdir(lbl_dir) if f.endswith(.txt)] print(f[{split}] images{len(imgs)} labels{len(lbls)}) cls_counter Counter() bad_boxes 0 for txt_name in lbls: with open(os.path.join(lbl_dir, txt_name)) as f: for line in f: parts line.split() if len(parts) 5: continue cls int(parts[0]) cls_counter[cls] 1 x, y, w, h map(float, parts[1:5]) if not (0 x 1 and 0 y 1 and 0 w 1 and 0 h 1): bad_boxes 1 print(f classes{dict(cls_counter)} bad_boxes{bad_boxes})这段脚本做的事很直白第一个 print 统计每个 split 下的图片数和标签文件数正常情况下两边应该相等。如果图片数大于标签数说明有图片漏标yolov5 训练时会把缺失标签的图片直接跳过你连报错都看不到训练完才发现某一类目标数量异常。第二个 print 统计类别分布单一类别时只看总数是否符合预期。第三个检查坐标是否越界正常的 YOLO 标签所有值都应落在 0 到 1 之间出现负数或大于 1 的值标签必须修否则训练 loss 会异常。我第一次拿到的数据的 val 下面有个 txt 坐标是 1.02排查后确认是导出时边界四舍五入的问题删掉那一行后训练就正常了。如果跳过这一步这问题会变成训练到一半 loss 不下降排查成本高得多。4.3 正式训练一条命令把数据集喂进框架自检通过后就可以开始训练。以 yolov5 为例python train.py \ --data data.yaml \ --weights yolov5s.pt \ --img 640 \ --epochs 100 \ --batch 16 \ --workers 4 \ --cache逐个参数说。--data 指向改好的 data.yaml--weights 是预训练权重想从零训练就写成 --weights 但对几百张的数据集强烈建议用预训练权重做迁移学习收敛快得多--img 是输入图像尺寸默认 640。固定翼机身偏细长用 640 会等比压缩目标比例不变但面积变小显存够用的话建议提到 960 甚至 1280对 mAP 的提升通常很明显--epochs 是训练轮数这个数据量级在 100 到 150 之间比较合适轮数太少欠拟合太多过拟合。--batch 是每批样本数显存不够就调小--workers 是数据加载线程数Windows 上建议设为 0否则容易报 DataLoader worker 错误--cache 是把图像缓存到内存几百张图完全放得下训练时不用反复读磁盘速度提升非常明显。yolov8 的命令参数基本一样yolo detect train \ datadata.yaml \ weightsyolov8n.pt \ img640 \ epochs100 \ batch16 \ workers4 \ cacheTrue不同的是 yolov8 用 keyvalue 风格含义相同。有一个差异yolov8 每个 epoch 结束都会完整跑一次验证验证时也会占用显存所以 batch 不要顶着显存上限设留一点余量。常用参数可以先按这个表起步参数推荐值说明--img6401280显存够就往上提对固定翼长条目标友好--epochs100150小数据集过拟合早不用拉太长--batch816以显存为上限优先保住 img 尺寸--workers0Windows/ 48LinuxWindows 多线程容易卡死--cache开启几百张图完整放内存提速明显训练日志里主要看三样东西box_loss、obj_loss、cls_loss 是否整体下降每个 epoch 结束后的 mAP50 和 mAP50-95 是否在上升训练和验证的指标差距是否越拉越大。固定翼检测场景里小目标占比高mAP50 会先动mAP50-95 动得慢这很正常不用在头几个 epoch 看到 mAP 低就急着停。提示训练中如果出现 “Stopping training early for poor results”说明指标连续多个 epoch 没提升框架自动提前停。这不一定是坏事但先确认不是数据问题引起的不然白跑一轮。5. 避坑指南固定翼数据集训练中反复出现的五个问题把训练中常见的报错和指标异常集中列一下每条按现象、原因、解决来写都是我实际踩过或看别人踩过的。5.1 路径报错FileNotFoundError 和数据集目录漂移现象训练刚开始就报 FileNotFoundError提示找不到图片或找不到 data.yaml有时候第一天训练正常第二天再跑同样的命令却报错。原因主要是路径相对依赖。data.yaml 里写的是相对路径或者用了软链数据集文件夹被移动过yolov5 对相对路径的解析基准是当前工作目录你在仓库根目录和子目录之间切换执行路径就会错位。解决统一用绝对路径写入 data.yaml把数据集固定放在一个不轻易挪动的目录删除之前的 cache 文件再试。我习惯在启动训练前先跑一行 python 检查路径存在性比如 Path(data.yaml).exists() 确认无误再往下走避免训练跑了十分钟才因为找不到文件中断。5.2 标签坐标越界框的位置全在画面外现象训练开始时 loss 正常下降但到某个 epoch 突然跳高或者 mAP 始终上不去画出来的预测框全在图片边缘位置完全不对。原因标签文件里的归一化坐标不是 0 到 1 之间。常见成因是标注工具导出设置不同坐标被乘了图像宽高变成像素值也有可能是某些 txt 里混入了空行或逗号分隔格式解析时把整行当成了坐标。解决先用第 4 章的自检脚本扫一遍 labels 目录把越界和格式异常的行打印出来人工核对异常行对应的图片。如果是像素坐标将所有值除以对应图片的宽高再写回如果是混入了别的分隔格式重新导出标签。修复后重新跑自检看到 bad_boxes0 再进训练。5.3 mAP 纹丝不动先查 names 和类别索引是否一致现象训练跑了几十个 epochloss 在降但 mAP 全程贴着 0 或 0.5 以下预测结果里类别名全是默认的 person、car 之类。原因data.yaml 里的 names 和标签 txt 里的类别索引对不上。典型情况是标签里写 0但 names[0] 不是期待的目标更常见的是用了自带 COCO 80 类的预训练权重你改了 data.yaml 但没提供自己的权重模型输出自然对到 COCO 的某个类上。解决确认 data.yaml 的 names 只有 [mq-20-drone]nc1确认权重文件不是别人的训练产物。用 COCO 预训练权重做迁移学习没问题框架会自动替换最后一层分类数但用了自定义训练出来的权重就要确认它的 nc 和 names 与当前 yaml 一致不一致时模型加载会失败或指标错乱。5.4 显存不足或数据加载卡死batch、workers、cache 三分天下现象训练一开始就报 CUDA out of memory或者数据加载到一半卡住不动画面停留在 Loading images... 超过十分钟。原因显存不足是 batch 和 img 尺寸太大固定翼数据用了 1280 输入时单张图占的显存是 640 的四倍很容易爆。卡死主要出现在 Windows 上 workers 设置过多Windows 的 DataLoader 多进程支持不好容易假死。解决显存不够就把 batch 降到 8再把 img 降到 640优先级是 batch 优先于 imgworkers 在 Windows 上设为 0Linux 一般 4 到 8数据能整体放进内存时用 --cache 缓存卡死问题通常同时消失。还有一个容易被忽略的点同时跑多个训练任务会叠加显存占用训练前先看 nvidia-smi确认没有旧的僵尸进程。5.5 过拟合验证集分数虚高真跑就露馅现象训练结束后 val 的 mAP50 接近 0.9但把没见过的固定翼航拍图喂进去框得乱七八糟或者训练曲线里 train 和 val 的 loss 从某个 epoch 开始分叉。原因几百张图的数据量本来就小模型又用了预训练权重训练轮数拉太长模型开始死记训练样本而不是学泛化特征。固定翼无人机在航拍里背景相似、拍摄角度单一过拟合来得更快。解决epochs 控制在 100 到 150 之间观察 val loss 开始回升就停数据增强里适当提高 hsv、fliplr 强度能缓解过拟合但 flip 对固定翼要慎用——左右翻转问题不大上下翻转会让目标特征错乱。更实际的做法是老老实实用 test 目录做最终评估别为了刷分把所有图都塞进 train再报一个漂亮的 val 指标没有意义。6. 装完怎么验证跑通推理测试集与看指标曲线训练结束不等于能交付。验证阶段要回答三个问题模型在测试集上到底多少分、预测框画得准不准、能不能对着单张图实际跑一次。训练完成后yolov5 在 runs/train/exp 目录下生成 weights/best.pt 和 last.pt以及一堆曲线图yolov8 在 runs/detect/train 下结构类似。先打开 results.png 看 mAP 曲线重点确认 mAP50 和 mAP50-95 在训练结束时没有大幅下降再打开 PR_curve.png曲线面积大、右上部分平缓说明模型在不同置信度下都稳定如果曲线在低置信度处剧烈下坠说明有一批难例没被学透可能是小目标漏检集中。再来是跑 test 推理python detect.py \ --weights runs/train/exp/weights/best.pt \ --source /home/you/datasets/mq-20-drone-dataset/images/test \ --conf 0.25 \ --save-txt--conf 是置信度阈值默认 0.25。固定翼目标在画面里偏小时建议降到 0.15 看一遍结果--save-txt 会额外保存 txt 格式的预测结果方便后续脚本评估 AP。跑完后打开 runs/detect/exp 下的标注图人眼过一遍框紧贴机身、置信度大于 0.5、没有把背景云层或地面物体误检成飞机就算过了。如果 test 集目标数量太少我一般会再单独挑几张没进过训练集的固定翼航拍图用同样的命令推理确保模型对陌生角度和陌生背景不崩。从那以后我每次拿到数据集第一件事永远是跑一遍自检脚本、确认路径和标签再开始训练模型训完固定要先跑 test 推理再交付结果已经成了肌肉记忆。希望这篇笔记能帮到你至少让这套固定翼数据集跑通时少走一点我当时走过的弯路。本文还有配套的精品资源点击获取