本项目是一套基于 YOLOv8 的无人机识别与检测系统,以 Anti-UAV 无人机目标检测数据集 为基础,完成数据组织、模型训练、结果评估与系统集成。系统提供 PyQt6 桌面端和 Web 端,支持图片识别、批量检测、视频识别、摄像头采样检测、模型管理、训练指标展示和检测历史查询,适用于计算机专业项目设计、课程实践与答辩展示。
一、项目简介
项目面向低空无人机目标检测场景,主要处理无人机目标较小、背景复杂、图像分辨率差异较大等问题,使用 Ultralytics YOLOv8 框架完成模型训练与推理。
整个项目包含以下几个部分:
- 数据集整理:按 YOLO 格式组织无人机图像与边界框标注,划分训练集、验证集和测试集。
- 模型训练:加载 YOLOv8n 预训练权重,在无人机数据上进行迁移学习。
- 实验分析:保留逐轮训练日志,分析损失、Precision、Recall 和 mAP 等指标。
- 系统应用:通过桌面端与浏览器界面完成检测、结果查看、历史查询和文件导出。
项目既包含模型训练代码和已有训练产物,也提供可直接操作的检测系统,便于结合实验数据与实际界面介绍完整实现过程。
二、系统功能设计
2.1 登录与注册
系统提供登录与注册入口。Web 端按账号保存会话、任务和检测记录,左侧侧栏集中放置图片、视频、摄像头、批量检测、任务管理、历史、模型和指标入口。

2.2 图片识别与目标放大
上传单张图片后,系统显示标注结果、目标数量、置信度和实际推理耗时,并列出目标框明细。使用者可以对照原图查看预测位置,点击目标后放大对应的原始区域,检查远距离无人机的局部特征。

2.3 批量检测
批量模块单次最多处理 50 张图片,可以逐图查看结果,汇总检测数量并下载结果包。任务交由后台队列处理,页面显示进度及运行状态,支持取消。

2.4 视频与摄像头识别
视频模块按设定间隔采样画面并调用模型,展示处理进度,生成标注视频和检测明细。摄像头模块通过浏览器获取画面,支持启动、停止和快照保存,停止时释放设备资源。
下图为数据集图片序列的视频功能演示。视频中的累计检出次数按采样帧累加,同一无人机在多帧出现时会重复计数。

2.5 任务管理
任务中心将排队、处理中、已完成、已取消、失败和已中断等状态集中呈现。可以按输入类型、任务状态和关键词查询,进入详情查看输入与输出,下载已完成任务的结果包。

2.6 模型与参数管理
模型页面提供当前项目的 best.pt 和 last.pt,显示权重大小、模型类别及推理设备,并支持调整置信度阈值、IoU 阈值和最大检测数量。
模型加载通过后再替换当前模型,切换失败时保留原可用权重。推理优先使用 GPU,GPU 推理失败时可以切换到 CPU。

2.7 训练指标与历史查询
训练指标页面读取真实日志,展示峰值、对应轮次、末轮结果和交互曲线,并支持导出训练数据 CSV。
检测历史按当前账号查询,支持类型、状态和文件名或任务编号筛选。每条记录保留输入来源、任务参数和结果信息,方便回查检测过程。

三、技术栈
| 类别 | 技术及用途 |
|---|---|
| 编程语言 | Python、JavaScript |
| 深度学习 | PyTorch、Ultralytics YOLOv8 |
| 检测模型 | YOLOv8n,单类别无人机目标检测 |
| 桌面界面 | PyQt6 |
| Web 后端 | FastAPI |
| Web 前端 | HTML、CSS、JavaScript |
| 图像与视频处理 | OpenCV、FFmpeg |
| 数据处理与离线绘图 | NumPy、Pandas、Matplotlib |
| Web 图表与局部放大 | Canvas |
| 配置管理 | PyYAML |
| 数据存储 | Web 端使用 SQLite;桌面端使用 JSON |
四、项目结构
训练、可视化、桌面界面和 Web 应用分别组织,核心目录如下:
text
c162/
├─ app.py # 桌面端入口
├─ train.py # 模型训练入口
├─ visualize.py # 离线图表生成入口
├─ Anti-UAV/
│ ├─ data.yaml # 数据集配置
│ ├─ images/train、val、test/ # 图像
│ └─ labels/train、val、test/ # YOLO 标注
├─ train/
│ ├─ config.py # 训练参数
│ └─ trainer.py # 训练流程封装
├─ train_result/exp/
│ ├─ args.yaml # 训练参数记录
│ ├─ results.csv # 逐轮训练日志
│ ├─ weights/ # best.pt、last.pt
│ └─ charts/ # 离线分析图表
├─ ui/ # PyQt6 界面与工具模块
├─ visualize/ # 离线绘图配置与实现
└─ web/
├─ run.py # Web 启动入口
├─ backend/
│ ├─ app.py # 接口与账号认证
│ ├─ detector.py # 模型加载与推理
│ ├─ jobs.py # 后台任务与结果导出
│ ├─ metrics.py # 训练日志与数据统计
│ └─ store.py # 账号、任务和会话存储
├─ frontend/ # 功能页面、样式与交互
└─ data/ # Web 独立数据目录
其中,训练入口负责生成模型和日志,推理模块负责读取权重并输出目标框,界面负责输入、展示和交互。Web 端的账号与历史单独保存,便于与桌面端分别使用。
五、数据集说明
5.1 数据集与检测任务
本项目使用 Anti-UAV 无人机检测数据,按 YOLO 目标检测格式存放,包含一个检测类别:
| 类别编号 | 类别名称 | 中文含义 |
|---|---|---|
| 0 | UAV | 无人机 |
模型需要判断图像中是否存在无人机,并输出目标位置及对应置信度。数据中包含天空、城市、复杂地物等背景,适合观察小目标、远距离目标和不同尺度下的检测表现。

5.2 数据规模与划分
以下数据来自当前项目目录的实际统计:
| 数据划分 | 图像数量 | 标注文件数量 | 原始标注框数 |
|---|---|---|---|
| 训练集 | 5,200 | 5,197 | 5,243 |
| 验证集 | 2,600 | 2,600 | 2,621 |
| 测试集 | 2,200 | 2,200 | 2,245 |
| 合计 | 10,000 | 9,997 | 10,109 |
当前项目的训练、验证和测试图像占比分别为 52%、26% 和 22%。
5.3 标注格式
每张图像对应同名的 TXT 标注文件,每行记录一个目标:
text
class_id center_x center_y width height
其中,class_id 固定为 0,中心点坐标和宽高使用归一化值。图像和标注分别存放在 images 与 labels 下,再按 train、val、test 划分。

上图展示训练集的类别数量、标注框形状、目标中心位置与宽高分布,来自训练目录保留的原始图像。图中的 5,243 对应训练集标注框数,整套数据的规模见上表。
六、模型训练过程
6.1 训练流程
训练由 train.py 和 train/trainer.py 组织,主要步骤如下:
- 读取训练参数和
Anti-UAV/data.yaml。 - 根据当前项目位置生成临时数据配置,修正数据集根路径。
- 加载
yolov8n.pt预训练权重。 - 调用 Ultralytics 的
YOLO.train()进行训练。 - 将权重、训练参数与逐轮日志保存到
train_result/exp/。 - 根据训练日志生成分析图表,并在系统中展示。
6.2 模型与训练参数
本项目使用 YOLOv8n 作为基础模型,在预训练权重上学习无人机这一目标类别。本次训练实际完成 100 轮 ,日志记录的训练耗时约 4,662.13 秒,即 77.7 分钟。
| 参数 | 本次配置 |
|---|---|
| 基础模型 | YOLOv8n |
| 训练轮数 | 100 |
| 输入尺寸 | 640 × 640 |
| Batch Size | 16 |
| DataLoader Workers | 4 |
| 优化器配置 | auto |
| Early Stopping Patience | 50 |
| 预热轮数 | 3 |
| Mosaic | 1.0 |
| 关闭 Mosaic | 最后 10 轮 |
| 水平翻转概率 | 0.5 |
| 随机平移 / 缩放 | 0.1 / 0.5 |
训练同时使用 HSV 色彩扰动、随机平移、随机缩放与水平翻转等数据增强。原始配置中的 lr0=0.01 是传入参数;由于优化器配置为 auto,实际学习率变化以日志中的 lr/pg* 列为准。
6.3 训练产物
训练完成后,项目保留以下主要文件:
best.pt:训练流程保存的最佳权重。last.pt:最后一轮权重。args.yaml:本次训练的参数记录。results.csv:每一轮的损失、检测指标、学习率和耗时。charts/:依据日志生成的离线分析图。
七、训练结果与核心指标
7.1 最后一轮验证指标
根据 train_result/exp/results.csv,第 100 轮的结果如下:
| 指标 | 日志数值 | 百分比 |
|---|---|---|
| Precision | 0.96405 | 96.405% |
| Recall | 0.83904 | 83.904% |
| mAP@0.5 | 0.89352 | 89.352% |
| mAP@0.5:0.95 | 0.58134 | 58.134% |
同一轮的训练 Box Loss 为 0.92121 ,验证 Box Loss 为 1.33606。
7.2 各项指标的最高值
各项峰值的出现轮次并不相同:
| 指标 | 最高值 | 对应轮次 |
|---|---|---|
| Precision | 0.96436 | 第 65 轮 |
| Recall | 0.85120 | 第 78 轮 |
| mAP@0.5 | 0.89457 | 第 86 轮 |
| mAP@0.5:0.95 | 0.58203 | 第 89 轮 |
这张表用于查看单项指标的峰值;上面的末轮表用于查看同一轮完整结果,两者分别呈现。
7.3 结果分析
末轮 Precision 高于 Recall,说明当前模型在检出结果的可靠性方面表现较好,仍有进一步减少漏检的空间。mAP@0.5:0.95 低于 mAP@0.5,则反映出在更严格的定位标准下,目标框精度仍可继续优化。
后续实验可以围绕异常标注清理、输入分辨率、模型规模和小目标特征表达等方向开展对照,结合相同数据划分比较结果。
八、可视化图表说明
以下图片直接选用项目 train_result/exp/charts/ 中已有的训练产物,保留原始曲线和数值。
8.1 训练与验证损失
Box Loss、Class Loss 和 DFL Loss 分别反映目标框回归、类别判断和边界框分布学习的变化。训练与验证曲线共同展示模型在 100 轮训练中的收敛过程。

8.2 检测指标变化
Precision、Recall、mAP@0.5 与 mAP@0.5:0.95 随训练逐渐提升并趋于稳定,图中标出了各项指标的最高值及对应轮次。各项峰值与第七节的日志统计一致。

8.3 Precision--Recall 训练轨迹
每个点对应一轮训练的 Precision 和 Recall,颜色表示训练轮次,起点与终点标出了训练过程中的指标变化。该图是跨训练轮次的 P-R 轨迹,阅读时应区别于固定模型在不同置信度阈值下得到的标准 PR 曲线。

8.4 学习率变化
学习率图反映日志中各参数组的实际调度过程,可以观察预热与后续衰减。实际数值以 CSV 的 lr/pg* 列为准。

8.5 训练结果总览
综合图将损失、学习率、检测指标、P-R 轨迹和指标表集中展示,方便整体回看本次实验。系统中的训练指标页面读取同一份日志,支持逐轮读数与 CSV 导出。

本项目为个人原创项目,配套源码、模型权重、训练资料和项目说明,可用于毕业设计、课程实践、简历展示及个人学习。有项目成品或定制需求,可以通过主页联系作者。