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

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

本项目针对无人机航拍场景下的小目标检测问题,基于 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 + 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} } 

十、相关链接

Read more

CPU 架构:x86、x64、ARM 到底是什么?为什么程序不能通用?

我们日常使用的电脑、手机、服务器,都有一个共同的“核心”——CPU。但不同设备往往运行不同的程序,比如 Windows 版软件不能直接在手机上运行;Linux 的 ARM 可执行文件不能跑在 x86 服务器上。原因就在于 CPU 架构不同。 那么,x86、x64、ARM 分别是什么?为什么一个程序不能在它们之间通用? 今天我们深度讲解一下。 一、x86、x64、ARM 是什么? 简单理解:它们是 不同的 CPU 指令集架构(ISA)。就像不同语言,中文、日文、英文语法不同,CPU 也有自己的“语法规则”。 1)x86(32 位) • 由 Intel

By Ne0inhk
基于 Spring Boot 的项目中使用微信服务号实现订阅通知的发送

基于 Spring Boot 的项目中使用微信服务号实现订阅通知的发送

文章目录 * 1. 准备工作 * 2. 添加 Maven 依赖 * 3. 配置文件 * 4. 创建配置类 * 5. 发送订阅通知 * 6. 控制器 * 6.1. 接收消息 & 获取 OpenID 的 Controller * 6.2. 发送订阅通知(使用已保存的 OpenID) * 7. 注意事项 上一篇文章介绍的是使用模板消息进行消息的推送,本文使用微信服务号订阅通知来推送消息;因为随着微信的发展,转向使用“订阅通知”是大势所趋。 使用微信服务号的订阅通知功能,可以向用户发送定制化的消息。本文给出 Spring Boot 的完整示例,演示如何在微信服务号中实现订阅通知的发送。 1. 准备工作 * 公众号类型:确保你使用的是已认证的服务号。 * 模板申请:你需要先在微信公众平台上为你的服务号申请相应的订阅通知模板,并获取到模板ID。

By Ne0inhk
「深度实战」ERNIE-4.5模型系列全解析:从架构创新到多场景性能测评

「深度实战」ERNIE-4.5模型系列全解析:从架构创新到多场景性能测评

文章目录 * 前言 * ERNIE 4.5系列一图看懂 * 核心特点 * 三大分支技术特性与场景定位 * 模型对比总览 * Base 版与进阶版 * 模型版本对比总览 * 详细对比分析 * A47B分支(超大规模多模态) * A3B分支(轻量多模态与高效文本) * 0.3B分支(极致轻量化文本) * 细分逻辑的核心价值 * 1. 降低使用门槛 * 2. 平衡效率与成本 * 3. 适配多样化部署 * 部署及测试 * 测评方法与标准 * 测评维度 * 测评任务类型 * 文本类任务(17种) * 视觉类任务(3种) * 评分标准 * 模型部署测试 * FastDeploy 硬件环境依赖要求 * NVIDIA GPU 环境依赖要求 * Kunlunxin XPU 环境依赖要求 * Iluvatar GPU 环境依赖要求 * Enflame GCU 环境依赖要求

By Ne0inhk
70 倍性能碾压 + SQL 全兼容!金仓数据库终结 InfluxDB 的复杂时序场景统治

70 倍性能碾压 + SQL 全兼容!金仓数据库终结 InfluxDB 的复杂时序场景统治

70 倍性能碾压 + SQL 全兼容!金仓数据库终结 InfluxDB 的复杂时序场景统治 在物联网、工业互联网和运维监控领域,时序数据处理的需求正以前所未有的速度增长。面对海量设备产生的持续数据流,企业需要一个既能高速写入、又能快速分析的数据库引擎。长期以来,InfluxDB以其在时序领域的先发优势和简洁设计,成为许多团队的首选。然而,随着数据规模从“万级”跃升至“千万级”,业务查询从简单的点查变为复杂的多维度聚合,其性能瓶颈开始显现。 一场关于性能、扩展性与综合能力的较量,正在国产数据库金仓(KingbaseES)与国际开源方案InfluxDB之间展开。 性能对决:从数据摄入到复杂洞察的全面领先 真正的性能对比必须基于真实、可复现的测试场景。金仓数据库使用业界公认的开源时序基准测试套件TSBS,与InfluxDB进行了多轮正面较量,结论清晰而有力:在小规模、简单查询的工作负载下,两者各有千秋;但在大规模、复杂分析的真实生产环境中,金仓展现出压倒性的优势。 在数据写入吞吐方面,格局随数据规模急剧变化。测试模拟了从100台到1000万台设备的不同数据压力。当设备规模达到40

By Ne0inhk