跳到主要内容
YOLO 无人机目标检测数据集与实战训练教程 | 极客日志
Python AI 算法
YOLO 无人机目标检测数据集与实战训练教程 综述由AI生成 包含 7261 张图片的无人机目标检测数据集,提供 YOLO 和 VOC 格式标注。内容涵盖数据集结构、YOLOv8 模型训练流程(数据导入、分割、格式化、配置及训练命令)以及基于 PySide6 的 Qt 可视化界面实现。通过实战教程展示了从数据准备到模型部署的全过程,适用于禁飞区监控及空中秩序管理场景。
赛博行者 发布于 2026/4/6 更新于 2026/5/20 23 浏览一、数据集介绍
【数据集】无人机检测数据集 7261 张 ,目标检测,包含 YOLO/VOC 格式标注 。
数据集中包含 1 种分类 ,具体分类为:names: ['drone'],为无人机。
数据集图片来自国内外网站、网络爬虫、视频抽帧等;
可用于园区,天空等禁飞区进行无人机设备识别 。
检测场景为园区、工厂、机场等禁飞区 ,可以应用于空中秩序管理,信息安全保密领域等工作 。
1. 数据概述
无人机设备检测的重要性
无人机技术的飞速发展使其应用场景从传统航拍扩展至农业监测、灾害救援、物流运输、环境监测等关键领域。据统计,全球商用无人机年销量持续增长,预计到 2025 年市场规模将突破 5 亿美元。这一趋势对无人机设备的检测能力提出更高要求:需在复杂环境下实现实时、精准的目标识别,以支撑无人机自主导航、避障、任务执行等核心功能。例如,在农业领域,无人机需检测作物病虫害;在灾害救援中,需快速定位受困人员;在物流运输中,需识别货物位置与状态。这些场景均依赖高效的目标检测算法。
基于 YOLO 的无人机设备检测算法
速度与精度平衡 :YOLO 通过单次前向传播完成目标定位与分类,避免了传统两阶段算法(如 Faster R-CNN)的冗余计算。例如,YOLOv4 在 COCO 数据集上达到 43.5% AP(平均精度),同时保持 65 FPS 的推理速度;YOLOv8 进一步优化参数量,在嵌入式设备上实现实时检测。
多尺度特征融合 :针对无人机视角下目标尺度差异大的问题,YOLO 系列引入 FPN(特征金字塔网络)和 PANet(路径聚合网络),通过多尺度特征融合提升小目标检测能力。例如,FBRT-YOLO(AAAI 2025)通过轻量化设计,在航拍数据集上实现 92.3% mAP(平均精度均值),同时满足嵌入式设备的实时性需求。
模型轻量化与部署优化 :为适应无人机有限的计算资源,研究者提出多种轻量化策略。例如,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 个 分类,['drone'];
图片总量:7261 张图片数据;
标注类型:含有Pascal VOC XML 格式和yolo TXT 格式;
5. 训练过程
5.1. 导入训练数据 下载 YOLOv8 项目压缩包,解压在任意本地 workspace 文件夹中。
在ultralytics-main 项目根目录下,创建 data 文件夹,并在 data 文件夹下创建子文件夹:Annotations、images、imageSets、labels ,其中,将pascal VOC 格式的 XML 文件 手动导入到 Annotations 文件夹中,将JPG 格式的图像数据导入到 images 文件夹中,imageSets 和 labels 两个文件夹不导入数据。
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 格式。
这个函数读取一个图像的 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. 执行命令 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
model = YOLO("./best.pt" )
video_path = "./demo.mp4"
cap = cv2.VideoCapture(video_path)
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)
fourcc = cv2.VideoWriter_fourcc(*'mp4v' )
out = cv2.VideoWriter('./outputs.mp4' , fourcc, fps, (frame_width, frame_height))
while cap.isOpened():
success, frame = cap.read()
if success:
results = model.predict(source=frame, save=True , imgsz=640 , conf=0.5 )
results[0 ].names[0 ] = "drone"
out.write(annotated_frame)
cv2.imshow("YOLOv8 Inference" , annotated_frame)
if cv2.waitKey(1 ) & 0xFF == ord ("q" ):
break
else :
break
cap.release()
out.release()
cv2.destroyAllWindows()
也可以直接在命令行窗口或者 Anaconda 终端输入以下命令进行模型预测:
yolo predict model="best.pt" source ='demo.jpg'
二、基于 QT 的目标检测可视化界面
1. 环境配置
pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple
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)
相关免费在线工具 加密/解密文本 使用加密算法(如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