YOLO11 无人机航拍小目标检测系统实战与优化
本项目聚焦于无人机航拍场景下的微小目标检测难题,基于 Ultralytics YOLO11 框架,在 VisDrone 2019 数据集上完成训练与调优。除了核心算法模型,还配套开发了基于 PyQt6 的桌面应用,支持图片、视频及摄像头的实时检测,并内置了训练指标的可视化功能。
项目背景与数据基础
无人机航拍图像通常面临目标尺度极小、分布密集以及多尺度混合的挑战,传统算法往往难以达到理想效果。我们选用 VisDrone 2019-DET 数据集,这是面向无人机视角的大规模基准数据集,由天津大学 AISKYEYE 团队发布,涵盖行人、车辆等 10 类交通相关目标。
数据集概况
| 子集 | 图像数量 | 说明 |
|---|---|---|
| 训练集 (train) | 6,471 张 | 用于模型训练 |
| 验证集 (val) | 548 张 | 用于超参数调优与模型选择 |
| 测试集 (test-dev) | 1,610 张 | 含标注,可用于论文实验 |
该数据集包含超过 260 万个边界框,图像来源覆盖中国 14 个不同城市,场景丰富。其显著特点包括:
- 小目标特性:大量目标归一化后宽度或高度小于 2%。
- 密集分布:交通路口等场景遮挡严重。
- 多尺度混合:同一图像中存在近大远小现象。
目录结构
dataset_visdrone/
├── data.yaml # YOLO 数据集配置文件
├── data_local.yaml # 自动生成,含本机绝对路径
├── 数据集介绍.md
└── VisDrone2019-DET-train/
├── images/
└── labels/ # YOLO 格式标签 (.txt)
标注采用 YOLO 标准格式,每行一个目标:<class_id> <x_center> <y_center> <width> <height>,坐标均为归一化值 [0, 1]。
模型训练流程
训练脚本位于项目根目录 train_yolo11.py,支持训练、验证和推理三种模式。实际运行中,建议根据显存情况调整 batch size,并针对小目标优化输入分辨率。
启动与配置
确保 dataset_visdrone/data.yaml 存在后,脚本会自动生成包含本机绝对路径的 data_local.yaml。加载预训练模型即可开始训练,结果默认保存在 runs/train/<实验名称>/ 目录下。
python train_yolo11.py # 默认配置训练
python train_yolo11.py --model yolo11m # 指定模型大小
python train_yolo11.py --epochs 200 # 指定训练轮数
python train_yolo11.py --imgsz 1280 # 提升小目标分辨率
python train_yolo11.py --multi_scale # 开启多尺度训练
python train_yolo11.py --mode val --weights runs/train/exp/weights/best.pt
python train_yolo11.py --mode predict --weights runs/train/exp/weights/best.pt --source path/to/image
关键参数建议
- 图像尺寸:建议 ≥ 640,针对小目标推荐 1280。
- Batch Size:16–32,显存不足时降低。
- Epochs:VisDrone 收敛较慢,建议 200–300。
- 数据增强:默认开启 mosaic,最后 10 个 epoch 关闭以稳定收敛。
- 优化器:SGD,损失权重 box=7.5, cls=0.5, dfl=1.5。
训练指标解读
Ultralytics 会在实验目录下生成丰富的可视化文件,帮助分析模型表现:
- results.csv / results.png:记录每个 epoch 的损失与指标(mAP、精确率、召回率等)变化曲线。
- train_batch.jpg / val_batch_pred.jpg**:展示数据增强后的输入及预测结果,直观查看漏检与误检情况。
- confusion_matrix_normalized.png:归一化混淆矩阵,分析各类别的预测准确性。
- PR_curve.png / F1_curve.png:评估置信度阈值对性能的影响。
主要列名包括 epoch, train/box_loss, metrics/mAP50(B), val/box_loss 等。
桌面应用系统
为了便于模型验证与日常使用,我们开发了基于 PyQt6 的桌面应用「无人机航拍小目标检测系统」。
核心功能
- 图片识别:支持 JPG/PNG/BMP 拖拽导入,导出检测结果图片与 CSV。
- 视频识别:逐帧检测 MP4/AVI/MOV 格式,显示进度条。
- 摄像头识别:实时调用本地摄像头进行目标检测。
- 检测历史:查看与管理历史记录,支持筛选与导出。
- 模型管理:配置模型路径,调整置信度(conf_threshold)、IoU 阈值等参数。
- 指标展示:集成训练过程可视化图表。
架构与配置
入口为 detection_app/main.py,默认账号 admin/admin123。检测逻辑封装在 utils/detector.py 中,通过 ImageDetectWorker 等线程类调用 Ultralytics YOLO 进行推理。
配置文件 config.json 存储模型路径与检测参数,用户信息与历史记录分别保存在 data/users.json 和 data/history.json。
技术栈与依赖
| 类别 | 技术选型 |
|---|---|
| GUI 框架 | PyQt6 |
| 深度学习框架 | Ultralytics (YOLO11) |
| 后端 | PyTorch |
| 图像处理 | OpenCV, Pillow |
| 可视化 | matplotlib, pandas |
环境依赖
PyQt6>=6.4.0
ultralytics>=8.0.0
opencv-python>=4.7.0
Pillow>=9.0.0
matplotlib>=3.7.0
numpy>=1.23.0
pandas>=1.5.0
pyyaml
项目结构概览
c124/
├── train_yolo11.py # YOLO11 训练脚本
├── README.md
├── dataset_visdrone/ # 数据集目录
│ ├── data.yaml
│ └── VisDrone2019-DET-train/
├── detection_app/ # 检测系统应用
│ ├── main.py
│ ├── utils/
│ │ ├── detector.py
│ │ └── storage.py
│ └── pages/ # 各功能页面
└── runs/ # 训练输出目录
参考文献
如在论文中使用 VisDrone 数据集,建议引用:
@article{zhu2021detection,
title={Detection and tracking meet drones challenge},
author={Zhu, Pengfei and Wen, Longyin and Du, Dawei and Bian, Xiao and Fan, Heng and Hu, Qinghua and Ling, Haibin},
journal={IEEE Transactions on Pattern Analysis and Machine Intelligence},
volume={44},
number={11},
pages={7380--7399},
year={2021}
}
本方案通过结合 YOLO11 的高效性与 PyQt6 的交互性,提供了一套完整的无人机小目标检测解决方案。在实际部署中,注意根据具体场景调整输入分辨率与置信度阈值,以获得最佳平衡。


