基于深度学习的无人机航拍小目标检测算法研究

基于深度学习的无人机航拍小目标检测算法研究

本项目针对无人机航拍场景下的小目标检测问题,基于 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英文名称中文名称
0pedestrian行人
1people人群
2bicycle自行车
3car小汽车
4van面包车
5truck卡车
6tricycle三轮车
7awning-tricycle带篷三轮车
8bus公交车
9motor摩托车

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 基本流程

  1. 检查 dataset_visdrone/data.yaml 是否存在
  2. 调用 fix_data_yaml() 自动生成 data_local.yaml(含本机绝对路径)
  3. 加载 YOLO 预训练模型
  4. 调用 Ultralytics 训练流程进行训练
  5. 结果保存在 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 主要训练参数

参数默认值说明
--modelyolo11s模型:yolo11n/s/m/l/x
--epochs300训练轮数
--imgsz640输入图像尺寸(小目标建议 1280)
--batch16批大小
--lr00.01初始学习率
--lrf0.01最终学习率比例
--patience100Early stopping 等待轮数
--device""GPU 编号或 cpu
--workers4DataLoader 工作进程数
--projectruns/train实验保存目录
--nameyolo11_visdrone实验名称
--multi_scaleFalse多尺度训练
--copy_paste0.0Copy-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_threshold0.25置信度阈值
iou_threshold0.70NMS IoU 阈值
max_det300单张图像最大检测数量

五、可视化图含义

训练完成后,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.pngF1 分数–置信度曲线
PR_curve.png精确率–召回率曲线(PR 曲线)

5.4 results.csv 主要列说明

epochtimetrain/box_losstrain/cls_losstrain/dfl_lossmetrics/precision(B)metrics/recall(B)metrics/mAP50(B)metrics/mAP50-95(B)val/box_lossval/cls_lossval/dfl_losslr/pg0lr/pg1lr/pg2


六、系统功能

本项目提供基于 PyQt6 的桌面应用 「无人机航拍小目标检测系统」,主要功能如下:

6.1 功能模块

模块功能说明
图片识别支持 JPG/PNG/BMP 等格式,上传图片后点击开始检测,支持拖拽导入,可导出检测结果图片与 CSV
视频识别支持 MP4/AVI/MOV 等格式,加载视频后逐帧检测,显示进度
摄像头识别实时调用本地摄像头进行目标检测
检测历史查看所有历史检测记录,支持筛选与导出
模型管理管理检测模型文件路径,调整置信度、IoU 阈值等检测参数,验证模型加载
指标展示展示模型训练过程的各项可视化指标,包括训练曲线、指标汇总、可视化图表

6.2 入口与流程

  • 入口detection_app/main.py,启动后进入登录窗口
  • 默认账号:admin / admin123
  • 检测流程:通过 utils/detector.py 中的 ImageDetectWorkerVideoDetectWorkerCameraDetectWorker 调用 Ultralytics YOLO 进行推理

6.3 配置与存储

  • config.json:模型路径、指标目录、检测参数等
  • data/users.json:用户信息
  • data/history.json:检测历史记录

七、项目技术栈

类别技术
GUI 框架PyQt6
深度学习框架Ultralytics (YOLO11)
检测模型YOLO11s
后端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} } 

十、相关链接

Read more

前端防范 XSS(跨站脚本攻击)

目录 一、防范措施 1.layui util  核心转义的特殊字符 示例 2.js-xss.js库 安装 1. Node.js 环境(npm/yarn) 2. 浏览器环境 核心 API 基础使用 1. 基础过滤(默认规则) 2. 自定义过滤规则 (1)允许特定标签 (2)允许特定属性 (3)自定义标签处理 (4)自定义属性处理 (5)转义特定字符 常见场景示例 1. 过滤用户输入的评论内容 2. 允许特定富文本标签(如富文本编辑器内容) 注意事项 更多配置 XSS(跨站脚本攻击)是一种常见的网络攻击手段,它允许攻击者将恶意脚本注入到其他用户的浏览器中。

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

目录 1. 打开浏览器开发者工具 2. 使用 Network 面板 3. 查看具体的API请求 a. Headers b. Payload c. Response d. Preview e. Timing 4. 实际操作步骤 5. 常见问题及解决方法 a. 无法看到API请求 b. 请求失败 c. 跨域问题(CORS) 作为一名后端工程师,理解前端如何调用接口、传递参数以及接收返回值是非常重要的。下面将详细介绍如何通过浏览器开发者工具(F12)查看和分析这些信息,并附带图片案例帮助你更好地理解。 1. 打开浏览器开发者工具 按下 F12 或右键点击页面选择“检查”可以打开浏览器的开发者工具。常用的浏览器如Chrome、Firefox等都内置了开发者工具。下面是我选择我的一篇文章,打开开发者工具进行演示。 2. 使用

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例)

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例) 前端开发中最令人头疼的莫过于那些难以定位的UI问题——元素错位、样式冲突、响应式失效...传统调试方式往往需要反复修改代码、刷新页面、检查元素。现在,通过Cursor编辑器集成的Codex功能,你可以直接用截图交互快速定位和修复这些问题。本文将带你从零开始,掌握这套革命性的调试工作流。 1. 环境准备与基础配置 在开始之前,确保你已经具备以下环境: * Cursor编辑器最新版(v2.5+) * Node.js 18.x及以上版本 * React 18项目(本文以Chakra UI 2.x为例) 首先在Cursor中安装Codex插件: 1. 点击左侧扩展图标 2. 搜索"Codex"并安装 3. 登录你的OpenAI账户(需要ChatGPT Plus订阅) 关键配置项: // 在项目根目录创建.