
简介本资源面向计算机视觉学习者与目标检测开发者提供一套细分类型飞机、鸟类与无人机的YOLOv5检测训练方案可区分具体飞机型号适用于课程设计、科研实验与算法对比等场景。压缩包共约2000个文件以1994个txt标签文件为主另含3个Python脚本与3份PDF教程整体约924.72MB数据集已按YOLO格式配置好train、val、test划分并附data.yaml文件yolov5、yolov7、yolov8等算法可直接训练。资源还包含PyQt界面相关脚本与使用说明方便搭建可视化检测演示。目前已有467人学习下载读者可获取一万余张标注图像、完整目录结构与训练配置快速复现细分机型识别流程并借助环境配置教程与界面脚本完成从训练到展示的闭环实践。1. 从一堆 txt 标签说起这套细分机型检测资源到底能干什么拿到一个检测数据集第一反应不该是急着train.py而是先翻标签目录。这套资源里最值钱的部分是那一万多张已经切成 YOLO 格式的 txt 标注而且类别不是笼统的「飞机」一个框而是细分到了具体机型同时把鸟类、无人机也纳入了同一套标签体系。这意味着你训出来的模型不是只会喊「天上有东西」而是能区分「这是某型客机」「这是鸟」「这是四旋翼」。对做低空安防、机场净空监测、航拍目标过滤的人来说这个粒度直接决定了模型能不能落地。资源本身是「训练模型 数据集 PyQt 界面」三件套数据集目录已经按 train/val/test 划好带data.yaml配套有share.py、test.py这类脚本还有一份 PyQt5 使用说明和几份环境配置 PDF覆盖 YOLOv3 到 YOLOv8 的配置流程。换句话说它省掉的是你最烦的那段——找数据、标数据、切数据、配 yaml。适合两类人一类是想快速跑通「细分目标检测」全流程的新手另一类是手里有业务场景、想拿现成数据先验证模型上限的从业者。下面我按「先看懂数据 → 再跑通训练 → 再避坑 → 最后上界面」的顺序拆一遍。2. 数据集结构与标签格式先搞懂 train/val/test 和 data.yaml 怎么对上2.1 目录布局与文件命名规律这套数据的文件命名很有特点像Pexels-Videos-2068519_mp4-6_jpg.rf.152992a221524d15e4dc36a2ab9d647a.txt这种前缀是视频源中间是抽帧序号后面跟一串 hash。这种命名一看就是从视频抽帧后自动标注或半自动标注出来的好处是可追溯——同一个视频的帧会聚在一起方便你按视频维度做数据泄漏检查。常见做法是图片和标签同名不同后缀放在images/和labels/两个平行目录下YOLOv5 默认就是这么找的。你要做的第一件事是确认这个对应关系没断。我一般会先跑一段脚本统计图片数和标签数是否一致再看有没有空标签文件。import os from pathlib import Path img_dir Path(datasets/aircraft/images/train) lbl_dir Path(datasets/aircraft/labels/train) imgs {p.stem for p in img_dir.glob(*.jpg)} lbls {p.stem for p in lbl_dir.glob(*.txt)} print(图片数:, len(imgs)) print(标签数:, len(lbls)) print(有图无标签:, len(imgs - lbls)) # 这些图会被当负样本注意 print(有标签无图:, len(lbls - imgs)) # 这些是脏数据必须清掉逻辑说明用stem去掉后缀的文件名做集合比对是最快发现配对断裂的方法。参数上没什么可调的重点看两个差值。有图无标签如果数量很大说明这批图是纯背景负样本YOLOv5 默认会把没有对应标签的图当背景训练这是合理的但如果只是零星几个多半是标注漏了。有标签无图一定是错的训练时会直接报找不到图片必须删掉。2.2 data.yaml 的字段含义与类别顺序data.yaml是 YOLO 系列训练的入口配置它决定了模型输出通道数和类别映射。这套资源号称能区分具体机型那类别数就不是 3而是「飞机各型号 鸟 无人机」的总和。你得先把这个文件读明白。# data.yaml 典型结构 path: ../datasets/aircraft # 数据集根目录 train: images/train # 相对 path 的训练集路径 val: images/val test: images/test nc: 12 # 类别数量必须和 names 长度一致 names: 0: boeing_737 1: boeing_747 2: airbus_a320 # ... 中间省略 10: bird 11: drone逻辑说明nc和names长度必须严格相等这是最常见的翻车点——你改了 names 忘了改 nc训练能启动但类别全错位。path建议用相对路径方便整个数据集打包迁移。类别顺序一旦定了就不要动因为标签 txt 里存的是类别索引0、1、2…你调换 names 顺序等于把所有标签的含义改了。参数上train/val/test三个字段指向的是图片目录YOLO 会自动去同级或约定的labels目录找同名 txt。2.3 标签 txt 的归一化坐标怎么读YOLO 格式每行是class_id x_center y_center width height全部归一化到 0~1。很多人第一次看觉得反直觉不是左上角坐标是中心点加宽高。校验的时候重点看有没有越界值。def check_label(path): bad [] with open(path) as f: for i, line in enumerate(f): parts line.strip().split() if len(parts) ! 5: bad.append((i, 字段数不对)) continue cls, x, y, w, h parts vals list(map(float, parts[1:])) if any(v 0 or v 1 for v in vals): bad.append((i, 坐标越界)) if float(w) 0 or float(h) 0: bad.append((i, 宽高非正)) return bad逻辑说明这段是训练前的体检脚本。字段数不对通常是标注工具导出时多了空格或逗号坐标越界说明标注框超出了图像边界YOLOv5 训练时会自动裁剪但越界太多说明标注质量差宽高非正是零面积框会直接导致 loss 异常。我一般会把这个脚本挂在整个 labels 目录上跑一遍把有问题的文件列出来人工过一遍比训练到一半发现 loss 不降要省事得多。3. 用 YOLOv5 跑通训练环境、命令与关键超参数3.1 环境配置与依赖版本选择资源里附了 YOLOv3 到 YOLOv8 的环境配置 PDF说明作者踩过版本兼容的坑。我的经验是YOLOv5 对 PyTorch 和 CUDA 的版本比较敏感尤其是你要用 GPU 训练的时候。常见做法是建一个独立 conda 环境别和系统 Python 混。conda create -n yolov5_air python3.9 -y conda activate yolov5_air # 按你的 CUDA 版本装 torch下面以 CUDA 11.8 为例 pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118 # 再装 yolov5 依赖 git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt逻辑说明Python 3.9 是 YOLOv5 生态里兼容性最稳的版本3.10 以上偶尔会遇到某些依赖编译失败。torch 的安装一定要指定 index-url否则 pip 默认装 CPU 版训练时你会发现torch.cuda.is_available()返回 False白等半天。装完先验证import torch print(torch.__version__, torch.cuda.is_available())如果第二项是 False别急着改代码先查驱动和 CUDA 版本是否匹配这是新手最容易卡住的地方。3.2 训练命令与超参数怎么设YOLOv5 的训练入口是train.py但真正决定效果的是那几个超参数。资源里数据量一万多张属于中等规模我一般会从预训练权重起步而不是从头训。python train.py \ --data datasets/aircraft/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --hyp data/hyps/hyp.scratch-low.yaml \ --name aircraft_run1 \ --cache逻辑说明--weights yolov5s.pt用 COCO 预训练权重能大幅加快收敛一万张数据从头训基本不现实。--img 640是输入分辨率飞机和无人机在画面里如果很小可以提到 1280但显存占用翻倍。--batch 16要按显存调8G 显存跑 640 大概能到 16爆显存就减半。--hyp选hyp.scratch-low.yaml是因为你的数据集和 COCO 分布差异大低增强策略更稳如果发现过拟合再换hyp.scratch-high.yaml加增强。--cache把图片缓存到内存一万张图大概占几个 G能明显加快每个 epoch 的读取速度内存不够就去掉。3.3 训练过程看什么指标训练启动后终端会打印每个 epoch 的 loss 和 mAP。别只盯着总 loss要分开看box_loss、obj_loss、cls_loss。cls_loss降不下去说明细分机型之间特征太像模型分不开这时候要么加数据要么提高分辨率。obj_loss高说明背景误检多可能是负样本不够。验证集上的mAP0.5是主指标但细分任务更要看mAP0.5:0.95因为它对框的精度更敏感。如果mAP0.5很高但mAP0.5:0.95很低说明模型能找到目标但框不准这时候检查标注框是否贴合或者调--img提分辨率。训练完在runs/train/aircraft_run1/下会有weights/best.pt和last.pt部署用 best续训用 last。4. 避坑与排查细分检测里最容易翻车的五件事4.1 类别数对不上导致输出通道错位现象训练能启动但验证时所有预测都归到某一类或者 mAP 异常低。原因data.yaml里nc和names长度不一致或者你换了数据集但忘了改 nc。解决训练前强制校验写个断言。import yaml with open(data.yaml) as f: d yaml.safe_load(f) assert d[nc] len(d[names]), fnc{d[nc]} 但 names 有 {len(d[names])} 个这个断言加在训练脚本最前面能省掉你几个小时的困惑。4.2 图片和标签路径不匹配现象报No labels found或者训练时大量图片被跳过。原因YOLOv5 默认把images替换成labels来找标签如果你的目录结构不是这个约定就找不到。解决要么按约定改目录名要么在data.yaml里显式指定。我一般直接按约定来别跟框架较劲。4.3 小目标漏检严重现象飞机和无人机检测还行鸟几乎全漏。原因鸟在画面里像素太少640 分辨率下可能就十几个像素。解决提高--img到 1280或者在data.yaml里开rect训练减少 padding再不行就切图训练。这是细分检测的硬骨头没有银弹。4.4 显存溢出中断训练现象训练到一半CUDA out of memory。原因batch太大或者--img提太高或者--cache把内存吃满。解决先降 batch再考虑降 img最后去掉 cache。别一上来就改模型结构那是最后的手段。4.5 验证集指标虚高现象验证集 mAP 很高但实际测试一塌糊涂。原因train/val/test 划分时同一个视频的帧被分到了不同集合造成数据泄漏。解决按视频源前缀分组划分而不是随机按帧划分。资源里的命名前缀正好能帮你做这件事别浪费。5. 接上 PyQt5 界面从 best.pt 到可交互检测工具5.1 界面与推理脚本的衔接方式资源里给了pyqt5使用说明.pdf和share.py、test.py说明作者已经把界面和推理打通了。核心思路是PyQt 负责选图、显示、按钮推理部分调用 YOLOv5 的detect.py或者直接加载模型做前向。我一般会把推理封装成一个函数界面只传路径和参数。import torch from PyQt5.QtWidgets import QApplication, QLabel, QPushButton, QVBoxLayout, QWidget, QFileDialog from PIL import Image model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt) class DetectApp(QWidget): def __init__(self): super().__init__() self.label QLabel(等待选择图片) self.btn QPushButton(选择图片并检测) self.btn.clicked.connect(self.run) layout QVBoxLayout() layout.addWidget(self.label) layout.addWidget(self.btn) self.setLayout(layout) def run(self): path, _ QFileDialog.getOpenFileName(self, 选图, , Images (*.jpg *.png)) if not path: return results model(path) results.save(runs/detect/exp) # 保存带框结果 self.label.setText(f检测完成结果已保存\n{results.pandas().xyxy[0]})逻辑说明torch.hub.load直接加载本地best.pt不用改 YOLOv5 源码。results.pandas().xyxy[0]返回的是 DataFrame包含每个框的坐标、置信度、类别界面里可以直接展示。参数上model.conf可以设置信度阈值默认 0.25细分任务建议提到 0.4 减少误检。results.save会把带框图存到指定目录方便你回看。5.2 界面里要暴露哪些参数一个能用的检测界面至少要让用户调三样东西置信度阈值、IOU 阈值、是否显示标签。置信度控制「宁可错杀还是宁可放过」IOU 控制重叠框合并。我一般把这两个做成滑块实时刷新结果。别做太复杂界面越简单越不容易出 bug。5.3 打包成 exe 的注意事项如果你要发给别人用PyQt5 程序可以用pyinstaller打包。坑在于 YOLOv5 的模型文件和依赖路径打包后经常找不到best.pt。解决把模型文件用--add-data显式打进去代码里用sys._MEIPASS定位资源路径。这一步不做别人拿到 exe 一运行就报错血泪经验。6. 进阶技巧用 test.py 做批量验证与阈值调优6.1 批量跑测试集并统计每类指标训练完只看一个总 mAP 是不够的细分任务必须知道哪一类拖后腿。test.py就是干这个的。跑之前确认data.yaml里test字段指向正确。python test.py \ --data datasets/aircraft/data.yaml \ --weights runs/train/aircraft_run1/weights/best.pt \ --img 640 \ --batch 16 \ --task test \ --verbose逻辑说明--task test指定用测试集--verbose会打印每一类的 P、R、mAP。跑完你会看到类似bird 0.42 0.38 0.40这样的行鸟类的指标如果明显低于飞机就说明小目标问题没解决回去调--img或加鸟的样本。参数上--batch只影响速度不影响结果--img必须和训练时一致否则精度会掉。6.2 用混淆矩阵定位类别混淆YOLOv5 在验证时会生成混淆矩阵存在runs/val/exp/confusion_matrix.png。这张图能告诉你模型把哪些机型搞混了。如果boeing_737和airbus_a320互相误判严重说明这两个类别在视觉上太接近要么合并类别要么补充区分性强的样本。我一般会把这个矩阵和每类指标对着看比盲目加数据有效得多。6.3 阈值调优的实操方法置信度和 IOU 阈值不是拍脑袋定的。我的做法是在测试集上跑一遍导出所有预测框和真实框然后画 P-R 曲线找 F1 最大的那个点作为置信度阈值。IOU 阈值一般保持 0.45 到 0.5除非你的目标重叠特别严重。这套流程走下来比默认 0.25 的置信度通常能提几个点的 F1。参数默认值细分检测建议影响conf0.250.35~0.45提高减少误检但可能漏检iou0.450.45~0.5控制重叠框合并img640小目标多则 1280显存换精度batch16按显存调只影响速度6.4 一个我踩过的坑有次我拿这套数据训完测试集 mAP 0.78觉得不错直接部署到实际场景结果无人机检测率不到一半。排查发现测试集里的无人机都是白天拍的实际场景有逆光和夜间。数据集再干净也覆盖不了所有工况。从那以后我每次训完模型都强制拿一段真实场景的视频抽帧跑一遍不看指标看实际效果。这个习惯帮我省了好几次返工。希望这套资源和上面的流程能帮你把细分检测这条路走得顺一点。本文还有配套的精品资源点击获取