本项目针对无人机航拍场景下的小目标检测问题,基于 YOLO11 系列模型,在 VisDrone 2019 数据集上进行训练与优化,并提供了完整的检测系统桌面应用,支持图片、视频、摄像头的实时检测与训练指标可视化。
一、项目概述
无人机航拍图像具有目标尺度小、密集分布、多尺度混合等特点,传统检测算法难以取得理想效果。本项目采用 Ultralytics YOLO11 框架,结合 VisDrone 数据集进行训练,实现了对行人、车辆等 10 类交通相关目标的高效检测,并配套开发了基于 PyQt6 的桌面应用,便于模型验证与日常使用。
二、数据集
2.1 数据集简介
本项目使用 VisDrone 2019-DET 数据集,由天津大学机器学习与数据挖掘实验室 AISKYEYE 团队发布,对应 ICCV 2019 "Vision Meets Drone" 挑战赛,是面向无人机视角目标检测的大规模基准数据集。
2.2 数据规模
| 子集 | 图像数量 | 说明 |
|---|---|---|
| 训练集 (train) | 6,471 张 | 用于模型训练 |
| 验证集 (val) | 548 张 | 用于超参数调优与模型选择 |
| 测试集 (test-dev) | 1,610 张 | 含标注,可进行论文实验与结果发布 |
- 总标注框数量:超过 260 万个边界框
- 图像来源:288 个视频片段 + 10,209 张静态图像
- 图像格式:JPEG (.jpg)
2.3 目标类别
数据集包含 10 个预定义类别:
| 类别ID | 英文名称 | 中文名称 |
|---|---|---|
| 0 | pedestrian | 行人 |
| 1 | people | 人群 |
| 2 | bicycle | 自行车 |
| 3 | car | 小汽车 |
| 4 | van | 面包车 |
| 5 | truck | 卡车 |
| 6 | tricycle | 三轮车 |
| 7 | awning-tricycle | 带篷三轮车 |
| 8 | bus | 公交车 |
| 9 | motor | 摩托车 |
2.4 数据集特点
- 地理位置:中国 14 个不同城市,相距数千公里
- 场景类型:城市、乡村等多种环境
- 小目标特性:无人机航拍高度较高,目标在图像中占据像素较少,大量目标归一化后宽度或高度小于 2%
- 密集分布:交通路口、人行道等场景中目标密集,遮挡严重
- 多尺度混合:同一张图像中存在近大远小现象
2.5 目录结构
dataset_visdrone/
├── data.yaml # YOLO 数据集配置文件
├── data_local.yaml # 自动生成,含本机绝对路径
├── 数据集介绍.md # 数据集说明文档
├── VisDrone2019-DET-train/
│ ├── images/ # 训练图像
│ └── labels/ # YOLO 格式标签 (.txt)
├── VisDrone2019-DET-val/
│ ├── images/
│ └── labels/
└── VisDrone2019-DET-test-dev/
├── images/
└── labels/
2.6 标注格式
采用 YOLO 标准格式 ,每行一个目标:<class_id> <x_center> <y_center> <width> <height>,坐标均为归一化值 [0, 1]。
三、训练过程
3.1 训练脚本
训练脚本为项目根目录下的 train_yolo11.py,支持三种运行模式:
- train:训练模式(默认)
- val:验证模式,需指定权重路径
- predict:推理模式,需指定权重与输入路径
3.2 基本流程
- 检查
dataset_visdrone/data.yaml是否存在 - 调用
fix_data_yaml()自动生成data_local.yaml(含本机绝对路径) - 加载 YOLO 预训练模型
- 调用 Ultralytics 训练流程进行训练
- 结果保存在
runs/train/<实验名称>/或--project指定目录
3.3 使用示例
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
3.4 训练注意事项
- 图像尺寸建议 ≥ 640,推荐 1280(小目标分辨率更高)
- batch 建议 16--32(显存不足时降低)
- epochs 建议 200--300(VisDrone 收敛较慢)
- 默认开启 mosaic 数据增强,最后 10 个 epoch 关闭以稳定收敛
- 可使用
--multi_scale多尺度训练提升小目标性能
四、训练参数
4.1 主要训练参数
| 参数 | 默认值 | 说明 |
|---|---|---|
--model |
yolo11s | 模型:yolo11n/s/m/l/x |
--epochs |
300 | 训练轮数 |
--imgsz |
640 | 输入图像尺寸(小目标建议 1280) |
--batch |
16 | 批大小 |
--lr0 |
0.01 | 初始学习率 |
--lrf |
0.01 | 最终学习率比例 |
--patience |
100 | Early stopping 等待轮数 |
--device |
"" | GPU 编号或 cpu |
--workers |
4 | DataLoader 工作进程数 |
--project |
runs/train | 实验保存目录 |
--name |
yolo11_visdrone | 实验名称 |
--multi_scale |
False | 多尺度训练 |
--copy_paste |
0.0 | Copy-paste 数据增强概率 |
4.2 模型与优化器
- 优化器:SGD
- 损失权重:box=7.5, cls=0.5, dfl=1.5
- 数据增强:mosaic=1.0, randaugment, erasing=0.4, close_mosaic=10
4.3 检测参数(应用配置)
| 参数 | 默认值 | 说明 |
|---|---|---|
conf_threshold |
0.25 | 置信度阈值 |
iou_threshold |
0.70 | NMS IoU 阈值 |
max_det |
300 | 单张图像最大检测数量 |
五、可视化图含义
训练完成后,Ultralytics 会在实验目录下生成以下可视化文件,用于分析模型表现:
5.1 训练过程图表
| 文件 | 含义 |
|---|---|
results.csv |
每 epoch 的损失与指标(训练/验证 loss、mAP、精确率、召回率等) |
results.png |
训练曲线概览,包含损失、mAP、学习率等随 epoch 变化 |
train_batch*.jpg |
训练 batch 样本可视化,展示数据增强后的输入图像与标签 |
val_batch*_labels.jpg |
验证 batch 的标签可视化 |
val_batch*_pred.jpg |
验证 batch 的预测结果可视化 |
5.2 标签与类别分析
| 文件 | 含义 |
|---|---|
labels.jpg |
标签分布图,展示各类别目标在图像中的位置与数量分布 |
labels_correlogram.jpg |
标签关联图,展示类别间相关性 |
5.3 评估指标曲线
| 文件 | 含义 |
|---|---|
confusion_matrix_normalized.png |
归一化混淆矩阵,展示各类别的预测与真实标签对应关系 |
P_curve.png |
精确率--置信度曲线,随置信度阈值变化的精确率 |
R_curve.png |
召回率--置信度曲线,随置信度阈值变化的召回率 |
F1_curve.png |
F1 分数--置信度曲线 |
PR_curve.png |
精确率--召回率曲线(PR 曲线) |
5.4 results.csv 主要列说明
epoch、time、train/box_loss、train/cls_loss、train/dfl_loss、metrics/precision(B)、metrics/recall(B)、metrics/mAP50(B)、metrics/mAP50-95(B)、val/box_loss、val/cls_loss、val/dfl_loss、lr/pg0、lr/pg1、lr/pg2
六、系统功能
本项目提供基于 PyQt6 的桌面应用 「无人机航拍小目标检测系统」,主要功能如下:
6.1 功能模块
| 模块 | 功能说明 |
|---|---|
| 图片识别 | 支持 JPG/PNG/BMP 等格式,上传图片后点击开始检测,支持拖拽导入,可导出检测结果图片与 CSV |
| 视频识别 | 支持 MP4/AVI/MOV 等格式,加载视频后逐帧检测,显示进度 |
| 摄像头识别 | 实时调用本地摄像头进行目标检测 |
| 检测历史 | 查看所有历史检测记录,支持筛选与导出 |
| 模型管理 | 管理检测模型文件路径,调整置信度、IoU 阈值等检测参数,验证模型加载 |
| 指标展示 | 展示模型训练过程的各项可视化指标,包括训练曲线、指标汇总、可视化图表 |
6.2 入口与流程
- 入口 :
detection_app/main.py,启动后进入登录窗口 - 默认账号:admin / admin123
- 检测流程 :通过
utils/detector.py中的ImageDetectWorker、VideoDetectWorker、CameraDetectWorker调用 Ultralytics YOLO 进行推理
6.3 配置与存储
config.json:模型路径、指标目录、检测参数等data/users.json:用户信息data/history.json:检测历史记录
七、项目技术栈
| 类别 | 技术 |
|---|---|
| GUI 框架 | PyQt6 |
| 深度学习框架 | Ultralytics (YOLO11) |
| 检测模型 | YOLO11s + EMBSFPN + TADDH + C3K2 + PMSFA(改进模型) |
| 后端 | PyTorch (ultralytics) |
| 图像处理 | OpenCV, Pillow |
| 可视化 | matplotlib, pandas |
| 数据处理 | numpy, pandas |
依赖包(detection_app/requirements.txt)
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 # 数据集配置
│ ├── data_local.yaml # 自动生成(本机路径)
│ ├── 数据集介绍.md # 数据集说明
│ ├── VisDrone2019-DET-train/
│ ├── VisDrone2019-DET-val/
│ └── VisDrone2019-DET-test-dev/
│
├── detection_app/ # 检测系统应用
│ ├── main.py # 应用入口
│ ├── login_window.py # 登录窗口
│ ├── main_window.py # 主窗口
│ ├── config.json # 应用配置
│ ├── requirements.txt # 依赖列表
│ ├── data/
│ │ ├── users.json # 用户数据
│ │ └── history.json # 检测历史
│ ├── pages/
│ │ ├── image_page.py # 图片识别页
│ │ ├── video_page.py # 视频识别页
│ │ ├── camera_page.py # 摄像头识别页
│ │ ├── history_page.py # 检测历史页
│ │ ├── model_page.py # 模型管理页
│ │ └── metrics_page.py # 指标展示页
│ └── utils/
│ ├── detector.py # 检测逻辑
│ ├── storage.py # 配置与存储
│ └── styles.py # 界面样式
│
├── 训练文件1/ # 训练输出示例
│ └── exp-yolo11s-EMBSFPN-TADDH-C3K2_PMSFA/
│ ├── args.yaml # 训练参数快照
│ ├── results.csv # 训练指标
│ ├── results.png # 训练曲线
│ ├── weights/
│ │ ├── best.pt # 最佳权重
│ │ └── last.pt # 最后一轮权重
│ └── 其他可视化图表...
│
└── runs/ # 训练输出目录(默认)
└── detect/runs/train/yolo11_visdrone/
九、参考文献
如在论文中使用 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},
publisher={IEEE}
}
十、相关链接
- VisDrone 数据集官网:https://aiskyeye.com/
- VisDrone GitHub:https://github.com/VisDrone/VisDrone-Dataset
- ICCV 2019 挑战赛:Vision Meets Drone Object Detection in Image Challenge














