项目背景与概述
无人机航拍图像通常存在目标尺度小、密集分布及多尺度混合等特点,传统检测算法往往难以取得理想效果。本项目基于 Ultralytics YOLO11 框架,在 VisDrone 2019 数据集上进行训练与优化,实现了对行人、车辆等 10 类交通相关目标的高效检测。此外,我们还配套开发了基于 PyQt6 的桌面应用,支持图片、视频及摄像头的实时检测与训练指标可视化,便于模型验证与日常使用。
数据集准备
数据概况
我们选用 VisDrone 2019-DET 数据集,该数据集由天津大学机器学习与数据挖掘实验室 AISKYEYE 团队发布,是面向无人机视角目标检测的大规模基准数据集。其包含超过 260 万个边界框,涵盖 288 个视频片段和 10,209 张静态图像,格式均为 JPEG。
| 子集 | 图像数量 | 说明 |
|---|---|---|
| 训练集 (train) | 6,471 张 | 用于模型训练 |
| 验证集 (val) | 548 张 | 用于超参数调优与模型选择 |
| 测试集 (test-dev) | 1,610 张 | 含标注,可进行论文实验与结果发布 |
目标类别
数据集预定义了 10 个类别,涵盖了常见的交通参与者:
| 类别 ID | 英文名称 | 中文名称 |
|---|---|---|
| 0 | pedestrian | 行人 |
| 1 | people | 人群 |
| 2 | bicycle | 自行车 |
| 3 | car | 小汽车 |
| 4 | van | 面包车 |
| 5 | truck | 卡车 |
| 6 | tricycle | 三轮车 |
| 7 | awning-tricycle | 带篷三轮车 |
| 8 | bus | 公交车 |
| 9 | motor | 摩托车 |
数据特点
- 地理位置:覆盖中国 14 个不同城市,场景跨度大。
- 小目标特性:航拍高度较高,大量目标归一化后宽度或高度小于 2%。
- 密集分布:交通路口、人行道等场景中目标密集,遮挡严重。
- 多尺度混合:同一张图像中存在近大远小现象。
目录结构
dataset_visdrone/
├── data.yaml # YOLO 数据集配置文件
├── data_local.yaml # 自动生成,含本机绝对路径
├── 数据集介绍.md # 数据集说明文档
├── VisDrone2019-DET-train/ # 训练集
│ ├── images/
│ └── labels/
├── VisDrone2019-DET-val/ # 验证集
│ ├── images/
│ └── labels/
└── VisDrone2019-DET-test-dev/ # 测试集
├── images/
└── labels/
标注格式
采用 YOLO 标准格式,每行一个目标:<class_id> <x_center> <y_center> <width> <height>,坐标均为归一化值 [0, 1]。
训练流程
脚本说明
训练脚本位于项目根目录下的 train_yolo11.py,支持三种运行模式:
- train:训练模式(默认)
- val:验证模式,需指定权重路径
- predict:推理模式,需指定权重与输入路径
基本步骤
- 检查
dataset_visdrone/data.yaml是否存在。 - 调用
fix_data_yaml()自动生成data_local.yaml(含本机绝对路径),避免跨设备路径错误。 - 加载 YOLO 预训练模型。
- 调用 Ultralytics 训练流程进行训练。
- 结果保存在
runs/train/<实验名称>/或--project指定目录。
命令示例
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:建议 200–300,VisDrone 数据集收敛相对较慢。
- 数据增强:默认开启 mosaic,最后 10 个 epoch 关闭以稳定收敛;可使用
--multi_scale提升小目标性能。
训练参数详解
主要配置
| 参数 | 默认值 | 说明 |
|---|---|---|
--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 数据增强概率 |
优化策略
- 优化器:SGD
- 损失权重:box=7.5, cls=0.5, dfl=1.5
- 数据增强:mosaic=1.0, randaugment, erasing=0.4, close_mosaic=10
检测参数(应用配置)
| 参数 | 默认值 | 说明 |
|---|---|---|
conf_threshold | 0.25 | 置信度阈值 |
iou_threshold | 0.70 | NMS IoU 阈值 |
max_det | 300 | 单张图像最大检测数量 |
可视化分析
训练完成后,Ultralytics 会在实验目录下生成一系列可视化文件,帮助我们分析模型表现。
训练过程图表
results.csv:记录每个 epoch 的损失与指标(训练/验证 loss、mAP、精确率、召回率等)。results.png:训练曲线概览,包含损失、mAP、学习率等随 epoch 变化趋势。train_batch*.jpg:展示数据增强后的输入图像与标签。val_batch*_pred.jpg:验证 batch 的预测结果可视化。
评估指标曲线
confusion_matrix_normalized.png:归一化混淆矩阵,展示各类别的预测与真实标签对应关系。PR_curve.png:精确率–召回率曲线。P_curve.png/R_curve.png/F1_curve.png:分别展示精确率、召回率、F1 分数随置信度阈值的变化。
results.csv 字段说明
主要包含 epoch、time、train/box_loss、metrics/mAP50(B)、metrics/mAP50-95(B)、val/box_loss、lr/pg0 等关键列,用于量化模型收敛情况。
桌面应用功能
本项目提供基于 PyQt6 的桌面应用 「无人机航拍小目标检测系统」,将训练好的模型封装为易用的工具。
核心模块
- 图片识别:支持 JPG/PNG/BMP 等格式,拖拽导入即可检测,支持导出结果图片与 CSV。
- 视频识别:支持 MP4/AVI/MOV 等格式,逐帧检测并显示进度。
- 摄像头识别:实时调用本地摄像头进行目标检测。
- 检测历史:查看所有历史检测记录,支持筛选与导出。
- 模型管理:管理检测模型文件路径,调整置信度、IoU 阈值等检测参数,验证模型加载。
- 指标展示:展示模型训练过程的各项可视化指标,包括训练曲线、指标汇总、可视化图表。
启动与配置
- 入口:
detection_app/main.py,启动后进入登录窗口。 - 默认账号:admin / admin123
- 检测逻辑:通过
utils/detector.py中的ImageDetectWorker、VideoDetectWorker、CameraDetectWorker调用 Ultralytics YOLO 进行推理。 - 配置文件:
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 |
依赖包
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/
└── 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

