跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

YOLO 无人机目标检测数据集与实战训练教程

包含 7261 张图片的无人机目标检测数据集,提供 YOLO 和 VOC 格式标注。内容涵盖数据集结构、YOLOv8 模型训练流程(数据导入、分割、格式化、配置及训练命令)以及基于 PySide6 的 Qt 可视化界面实现。通过实战教程展示了从数据准备到模型部署的全过程,适用于禁飞区监控及空中秩序管理场景。

赛博行者发布于 2026/4/6更新于 2026/10/17110 浏览
YOLO 无人机目标检测数据集与实战训练教程

一、数据集介绍

【数据集】无人机检测数据集 7261 张,目标检测,包含 YOLO/VOC 格式标注。

数据集中包含 1 种分类,具体分类为:names: ['drone'],为无人机。

数据集图片来自国内外网站、网络爬虫、视频抽帧等;

可用于园区,天空等禁飞区进行无人机设备识别。

检测场景为园区、工厂、机场等禁飞区,可以应用于空中秩序管理,信息安全保密领域等工作。

1. 数据概述

无人机设备检测的重要性

无人机技术的飞速发展使其应用场景从传统航拍扩展至农业监测、灾害救援、物流运输、环境监测等关键领域。据统计,全球商用无人机年销量持续增长,预计到 2025 年市场规模将突破 5 亿美元。这一趋势对无人机设备的检测能力提出更高要求:需在复杂环境下实现实时、精准的目标识别,以支撑无人机自主导航、避障、任务执行等核心功能。例如,在农业领域,无人机需检测作物病虫害;在灾害救援中,需快速定位受困人员;在物流运输中,需识别货物位置与状态。这些场景均依赖高效的目标检测算法。

基于 YOLO 的无人机设备检测算法

  1. 速度与精度平衡:YOLO 通过单次前向传播完成目标定位与分类,避免了传统两阶段算法(如 Faster R-CNN)的冗余计算。例如,YOLOv4 在 COCO 数据集上达到 43.5% AP(平均精度),同时保持 65 FPS 的推理速度;YOLOv8 进一步优化参数量,在嵌入式设备上实现实时检测。
  2. 多尺度特征融合:针对无人机视角下目标尺度差异大的问题,YOLO 系列引入 FPN(特征金字塔网络)和 PANet(路径聚合网络),通过多尺度特征融合提升小目标检测能力。例如,FBRT-YOLO(AAAI 2025)通过轻量化设计,在航拍数据集上实现 92.3% mAP(平均精度均值),同时满足嵌入式设备的实时性需求。
  3. 模型轻量化与部署优化:为适应无人机有限的计算资源,研究者提出多种轻量化策略。例如,YOLO-Drone 通过引入深度可分离卷积和通道剪枝,将模型参数量压缩至 13.5M,在 NVIDIA Jetson TX2 上达到 22 FPS;VRF-DETR(2025)则通过自适应接收场选择机制,在保持高精度的同时降低计算复杂度。

该数据集含有 7261 张图片,包含Pascal VOC XML格式和YOLO TXT格式,用于训练和测试园区、工厂、机场等禁飞区进行无人机设备检测。图片格式为 jpg 格式,标注格式分别为:

YOLO:txt

VOC:xml

数据集均为手工标注,保证标注精确度。

2. 数据集文件结构

drone/**

——test/

————Annotations/

————images/

————labels/

——train/

————Annotations/

————images/

————labels/

——valid/

————Annotations/

————images/

————labels/

——data.yaml

  • 该数据集已划分训练集样本,分别是:test目录(测试集)、train目录(训练集)、valid目录(验证集);
  • Annotations 文件夹为 Pascal VOC 格式的XML 文件;
  • images 文件夹为jpg 格式的数据样本;
  • labels 文件夹是 YOLO 格式的TXT 文件;
  • data.yaml 是数据集配置文件,包含无人机设备检测的目标分类和加载路径。

文章配图

文章配图

文章配图

文章配图

文章配图

Annotations 目录下的xml 文件内容如下:

<annotation> <folder></folder> <filename>1536_jpg.rf.3ef7ae8ebe34a87c77ebbbeaf3747c85.jpg</filename> <path>1536_jpg.rf.3ef7ae8ebe34a87c77ebbbeaf3747c85.jpg</path> <source> <database>drone</database> </source> <size> <width>640</width> <height>640</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>drone</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <occluded>0</occluded> <bndbox> <xmin>238</xmin> <xmax>308</xmax> <ymin>320</ymin> <ymax>382</ymax> </bndbox> </object> </annotation>

3. 数据集适用范围

  • 目标检测场景,监控摄像头识别
  • yolo 训练模型或其他模型
  • 园区、工厂、机场等禁飞区
  • 可以用于空中秩序管理,信息安全保密领域等工作

4. 数据集标注结果

文章配图

文章配图

文章配图

文章配图

4.1. 数据集内容
  1. 多角度场景:监控摄像头视角;
  2. 标注内容:1 个分类,['drone'];
  3. 图片总量:7261 张图片数据;
  4. 标注类型:含有Pascal VOC XML格式和yolo TXT格式;

5. 训练过程

5.1. 导入训练数据

下载 YOLOv8 项目压缩包,解压在任意本地 workspace 文件夹中。

下载 YOLOv8 预训练模型,导入到ultralytics-main项目根目录下。

文章配图

在ultralytics-main项目根目录下,创建 data 文件夹,并在 data 文件夹下创建子文件夹:Annotations、images、imageSets、labels,其中,将pascal VOC 格式的 XML 文件手动导入到 Annotations 文件夹中,将JPG格式的图像数据导入到 images 文件夹中,imageSets 和 labels 两个文件夹不导入数据。

data 目录结构如下:

data/

——Annotations/ //存放 xml 文件

——images/ //存放 jpg 图像

——imageSets/

——labels/

整体项目结构如下所示:

文章配图

5.2. 数据分割

首先在 ultralytics-main 目录下创建一个 split_train_val.py 文件,运行文件之后会在 imageSets 文件夹下将数据集划分为训练集 train.txt、验证集 val.txt、测试集 test.txt,里面存放的就是用于训练、验证、测试的图片名称。

import os
import random

trainval_percent = 0.9
train_percent = 0.9
xmlfilepath = 'data/Annotations'
txtsavepath = 'data/ImageSets'
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list_ = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_, tv)
train = random.sample(trainval, tr)
ftrainval = open('data/ImageSets/trainval.txt', 'w')
ftest = open('data/ImageSets/test.txt', 'w')
ftrain = open('data/ImageSets/train.txt', 'w')
fval = open('data/ImageSets/val.txt', 'w')
for i in list_:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
    if i in train:
        ftrain.write(name)
    else:
        fval.write(name)
else:
    ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
5.3. 数据集格式化处理

在 ultralytics-main 目录下创建一个 voc_label.py 文件,用于处理图像标注数据,将其从 XML 格式(通常用于 Pascal VOC 数据集)转换为 YOLO 格式。

convert_annotation 函数

  • 这个函数读取一个图像的 XML 标注文件,将其转换为 YOLO 格式的文本文件。
  • 它打开 XML 文件,解析树结构,提取图像的宽度和高度。
  • 然后,它遍历每个目标对象(object),检查其类别是否在 classes 列表中,并忽略标注为困难(difficult)的对象。
  • 对于每个有效的对象,它提取边界框坐标,进行必要的越界修正,然后调用 convert 函数将坐标转换为 YOLO 格式。
  • 最后,它将类别 ID 和归一化后的边界框坐标写入一个新的文本文件。
import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val', 'test']
classes = ['drone'] # 根据标签名称填写类别
abs_path = os.getcwd()
print(abs_path)

def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return x, y, w, h

def convert_annotation(image_id):
    in_file = open('data/Annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('data/labels/%s.txt' % (image_id), 'w')
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        b1, b2, b3, b4 = b
        # 标注越界修正
        if b2 > w: b2 = w
        if b4 > h: b4 = h
        b = (b1, b2, b3, b4)
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
    wd = getcwd()
    for image_set in sets:
        if not os.path.exists('data/labels/'):
            os.makedirs('data/labels/')
        image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()
        list_file = open('data/%s.txt' % (image_set), 'w')
        for image_id in image_ids:
            list_file.write(abs_path + '/data/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
        list_file.close()
5.4. 修改数据集配置文件

在 ultralytics-main 目录下创建一个 drone.yaml 文件

train: data/train.txt
val: data/val.txt
test: data/test.txt
nc: 1
names: ['drone']
5.5. 执行命令

执行 train.py

model = YOLO('yolov8s.pt')
results = model.train(data='drone.yaml', epochs=200, imgsz=640, batch=16, workers=0, device=0)

也可以在终端执行下述命令:

yolo train data=drone.yaml model=yolov8s.pt epochs=200 imgsz=640 batch=16 workers=0 device=0
5.6. 模型预测

你可以选择新建 predict.py 预测脚本文件,输入视频流或者图像进行预测。

代码如下:

import cv2
from ultralytics import YOLO

# Load the YOLOv8 model
model = YOLO("./best.pt") # 自定义预测模型加载路径

# Open the video file
video_path = "./demo.mp4" # 自定义预测视频路径
cap = cv2.VideoCapture(video_path)

# Get the video properties
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # Be sure to use lower case
out = cv2.VideoWriter('./outputs.mp4', fourcc, fps, (frame_width, frame_height)) # 自定义输出视频路径

# Loop through the video frames
while cap.isOpened():
    # Read a frame from the video
    success, frame = cap.read()
    if success:
        # Run YOLOv8 inference on the frame
        results = model.predict(source=frame, save=True, imgsz=640, conf=0.5)
        results[0].names[0] = "drone" # Visualize the results on the frame annotated_frame = results[0].plot()
        # Write the annotated frame to the output file
        out.write(annotated_frame)
        # Display the annotated frame (optional)
        cv2.imshow("YOLOv8 Inference", annotated_frame)
        # Break the loop if 'q' is pressed
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break

# Release the video capture and writer objects
cap.release()
out.release()
cv2.destroyAllWindows()

也可以直接在命令行窗口或者 Anaconda 终端输入以下命令进行模型预测:

yolo predict model="best.pt" source='demo.jpg'

二、基于 QT 的目标检测可视化界面

1. 环境配置

# 安装 torch 环境
pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安装 PySide6 依赖项
pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安装 opencv-python 依赖项
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

2. 使用说明

文章配图

界面功能介绍:

  • 原视频/图片区:上半部分左边区域为原视频/图片展示区;
  • 检测区:上半部分右边区域为检测结果输出展示区;
  • 文本框:打印输出操作日志,其中告警以 json 格式输出,包含标签框的坐标,标签名称等;
  • 加载模型:下拉框绑定本地文件路径,按钮加载路径下的模型文件;
  • 置信度阈值:自定义检测区的置信度阈值,可以通过滑动条的方式设置;
  • 文件上传:选择目标文件,包含JPG 格式和 MP4 格式;
  • 开始检测:执行检测程序;
  • 停止:终止检测程序;

3. 预测效果展示

3.1. 图片检测

文章配图

切换置信度再次执行:

文章配图

上图左下区域可以看到json 格式的告警信息,用于反馈实际作业中的管理系统,为管理员提供决策支持。

3.2. 视频检测

文章配图

3.3. 日志文本框

文章配图

4. 前端代码

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_gui()
        self.model = None
        self.timer = QtCore.QTimer()
        self.timer1 = QtCore.QTimer()
        self.cap = None
        self.video = None
        self.file_path = None
        self.base_name = None
        self.timer1.timeout.connect(self.video_show)

    def init_gui(self):
        self.folder_path = "model_file" # 自定义修改:设置文件夹路径
        self.setFixedSize(1300, 650)
        self.setWindowTitle('目标检测') # 自定义修改:设置窗口名称
        self.setWindowIcon(QIcon("111.jpg")) # 自定义修改:设置窗口图标
        central_widget = QtWidgets.QWidget(self)
        self.setCentralWidget(central_widget)
        main_layout = QtWidgets.QVBoxLayout(central_widget)
        # 界面上半部分:视频框
        topLayout = QtWidgets.QHBoxLayout()
        self.oriVideoLabel = QtWidgets.QLabel(self)
        # 界面下半部分:输出框 和 按钮
        groupBox = QtWidgets.QGroupBox(self)
        groupBox.setStyleSheet('QGroupBox {border: 0px solid #D7E2F9;}')
        bottomLayout = QtWidgets.QHBoxLayout(groupBox)
        main_layout.addWidget(groupBox)
        btnLayout = QtWidgets.QHBoxLayout()
        btn1Layout = QtWidgets.QVBoxLayout()
        btn2Layout = QtWidgets.QVBoxLayout()
        btn3Layout = QtWidgets.QVBoxLayout()
        # 创建日志打印文本框
        self.outputField = QtWidgets.QTextBrowser()
        self.outputField.setFixedSize(530, 180)
        self.outputField.setStyleSheet('font-size: 13px; font-family: "Microsoft YaHei"; background-color: #f0f0f0; border: 2px solid #ccc; border-radius: 10px;')
        self.detectlabel = QtWidgets.QLabel(self)
        self.oriVideoLabel.setFixedSize(530, 400)
        self.detectlabel.setFixedSize(530, 400)
        self.oriVideoLabel.setStyleSheet('border: 2px solid #ccc; border-radius: 10px; margin-top:75px;')
        self.detectlabel.setStyleSheet('border: 2px solid #ccc; border-radius: 10px; margin-top: 75px;')
        topLayout.addWidget(self.oriVideoLabel)
        topLayout.addWidget(self.detectlabel)
        main_layout.addLayout(topLayout)

目录

  1. 一、数据集介绍
  2. 1. 数据概述
  3. 2. 数据集文件结构
  4. 3. 数据集适用范围
  5. 4. 数据集标注结果
  6. 4.1. 数据集内容
  7. 5. 训练过程
  8. 5.1. 导入训练数据
  9. 5.2. 数据分割
  10. 5.3. 数据集格式化处理
  11. 5.4. 修改数据集配置文件
  12. 5.5. 执行命令
  13. 5.6. 模型预测
  14. Load the YOLOv8 model
  15. Open the video file
  16. Get the video properties
  17. Define the codec and create VideoWriter object
  18. Loop through the video frames
  19. Release the video capture and writer objects
  20. 二、基于 QT 的目标检测可视化界面
  21. 1. 环境配置
  22. 安装 torch 环境
  23. 安装 PySide6 依赖项
  24. 安装 opencv-python 依赖项
  25. 2. 使用说明
  26. 3. 预测效果展示
  27. 3.1. 图片检测
  28. 3.2. 视频检测
  29. 3.3. 日志文本框
  30. 4. 前端代码

更多推荐文章

查看全部
  • GitLab 个人访问令牌(Token)获取指南
  • IntelliJ IDEA 中安装 Python xlrd 模块
  • Python+AI 零基础入门指南:从语法到实操的完整路径
  • 火山引擎豆包 API 注册与密钥申请步骤
  • Java 线程池概念与工作原理详解
  • 前端拖拽排序实现详解:从原理到实践
  • FPGA 模块助力现代工厂高速数据采集与实时处理
  • AI-Goofish-Monitor:基于 Playwright 和 AI 的闲鱼商品监控工具
  • ClawX:基于 OpenClaw 的桌面版 AI 助手部署指南
  • 如何卸载 WSL2 中安装的 Ubuntu 22.04
  • MySQL 索引原理:B+ 树结构与实战优化
  • WebView 并发初始化竞争风险分析
  • OpenClaw 对接飞书机器人:插件安装与回调配置踩坑指南
  • Win11 安装 Node.js 后 npm install 报错:禁止运行脚本修复方案
  • 基于 EasyDSS 的无人机视频推流直播技术方案
  • Claude AI 母公司更新服务条款:中国地区及公司受限访问
  • OpenClaw:开源AI智能体框架的技术架构与部署实践
  • ROS 机器人开发实战:Linux 终端命令与基础环境搭建指南
  • Linux 系统部署 OpenClaw 并接入 QQ 机器人
  • Stable Diffusion WebUI 无障碍改造:键盘导航与屏幕阅读器适配

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online