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

YOLO11 基于 DroneVehicle 数据集的无人机车辆目标检测

基于 DroneVehicle 数据集使用 YOLO11 进行无人机视角车辆目标检测。流程涵盖数据集预处理(去白边、改尺寸)、标签格式转换(COCO 转 VOC 转 YOLO)、解决标注框越界坐标问题、划分训练验证集、模型训练及推理测试。实验表明在正射视角下检测效果良好,同时分析了斜视及红外模式下的局限性。

修罗发布于 2026/3/23更新于 2026/10/15103 浏览
YOLO11 基于 DroneVehicle 数据集的无人机车辆目标检测

1、关于 DroneVehicle 数据集介绍

DroneVehicle 数据集是由天津大学收集、标注的大型无人机航拍车辆数据集。 DroneVehicle 数据集由无人机采集的共 56,878 幅图像组成,其中一半为 RGB 图像,其余为红外图像。我们对五个类别进行了带有方向性边界框的丰富标注。其中,汽车 car 在 RGB 图像中有 389,779 个标注,在红外图像中有 428,086 个标注;卡车 truck 在 RGB 图像中有 22,123 个标注,在红外图像中有 25,960 个标注;公交车 bus 在 RGB 图像中有 15,333 个标注,在红外图像中有 16,590 个标注;面包车 van 在 RGB 图像中有 11,935 个标注,在红外图像中有 12,708 个标注;货车 freight_car 在 RGB 图像中有 13,400 个标注,在红外图像中有 17,173 个标注。

2、DroneVehicle 数据集下载

参考官方 GitHub 仓库:https://github.com/VisDrone/DroneVehicle

3、DroneVehicle 数据集处理

在 DroneVehicle 中,为了标注图片边界上的物体,作者在每张图片的上下左右四边设置了宽度为 100 像素的白色边框,这样下载的图片尺寸就是 840 x 712。在训练我们的检测网络时,我们可以进行预处理,去除周围的白色边框,并将图像尺寸改为 640 x 512。

文章配图

处理前后对比。

去除白边代码:

import numpy as np
import cv2
import os
from tqdm import tqdm

def create_file(output_dir_vi, output_dir_ir):
    if not os.path.exists(output_dir_vi):
        os.makedirs(output_dir_vi)
    if not os.path.exists(output_dir_ir):
        os.makedirs(output_dir_ir)
    print(f'Created folder:({output_dir_vi}); ({output_dir_ir})')

def update(input_img_path, output_img_path):
    image = cv2.imread(input_img_path)
    cropped = image[100:612, 100:740] # 裁剪坐标为 [y0:y1, x0:x1]
    cv2.imwrite(output_img_path, cropped)

dataset_dir_vi = r'valimg' # 处理前可见光图片目录
output_dir_vi = r'valimg2' # 处理后可见光图片目录
dataset_dir_ir = r'valimgr' # 处理前红外光图片目录
output_dir_ir = r'valimgr2' # 处理后红外光图片目录

# 检查文件夹是否存在,如果不存在则创建
create_file(output_dir_vi, output_dir_ir)

# 获得需要转化的图片路径并生成目标路径
image_filenames_vi = [(os.path.join(dataset_dir_vi, x), os.path.join(output_dir_vi, x)) for x in os.listdir(dataset_dir_vi)]
image_filenames_ir = [(os.path.join(dataset_dir_ir, x), os.path.join(output_dir_ir, x)) for x in os.listdir(dataset_dir_ir)]

# 转化所有图片
print('Start transforming vision images...')
for path in tqdm(image_filenames_vi):
    update(path[0], path[1])
print('Start transforming infrared images...')
for path in tqdm(image_filenames_ir):
    update(path[0], path[1])

4、制作 Yolo 目标检测需要的数据集文件

4.1、下载 DroneVehicle 的 coco 格式的检测框标签文件

文章配图

4.2、通过标注软件将 coco 格式的标签文件转为 VOC 格式的标签文件

使用 X-AnyLabeling 作为标注工具。

文章配图

4.3、处理 VOC 格式的标签文件并转成 Yolo 格式的标签文件

处理该数据集标签文件时发现部分检测框的位置可能会在图片边缘外面,导致直接转成 YOLO 的时候,会出现负坐标或者大于 1 的坐标值,这样会导致模型训练不了或者存在一定问题,所以对该部分检测框在转换时需进行特殊处理。注意:X-AnyLabeling 也可以直接导出 YOLO 格式标签,但是经测试也没有处理大于 1 的坐标值。

xml2txt.py

import xml.etree.ElementTree as ET
import shutil
import os
import imagesize

# 定义识别目标或类集合
object = 'datasets'

# 根据自定义的数据集名称
if os.path.exists("./%s/labels/" % object):
    shutil.rmtree("./%s/labels/" % object)
os.makedirs("./%s/labels/" % object)
else:
    os.makedirs("./%s/labels/" % object)

sets = ['train', 'val']
# 修改类别 (自定义)
classes = ["car", "truck", "bus", "van", "freight_car"]

def convert(size, box):
    # 坐标信息归一化至 0-1
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    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('./%s/xml/%s.xml' % (object, image_id))
    out_file = open('./%s/labels/%s.txt' % (object, image_id), 'w')
    image_file = open('./%s/images/%s.jpg' % (object, image_id))
    print("in_file," , in_file)
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    # 这里的 width 和 height 在 Autolabelimg 下自动标注可能会被修改,需替换成图片的真实宽高
    # w = int(size.find('width').text)
    # h = int(size.find('height').text)
    w, h = imagesize.get(image_file.name)
    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')
        xmin = float(xmlbox.find('xmin').text)
        xmin = xmin if xmin >= 0 else 0.0 # 左上角 x 坐标如果小于 0 都化成 0
        xmax = float(xmlbox.find('xmax').text)
        xmax = xmax if xmax <= w else float(w) # 右下角 x 坐标如果大于图片宽度了都为图片宽度值
        ymin = float(xmlbox.find('ymin').text)
        ymin = ymin if ymin >= 0 else 0.0 # 左上角 y 坐标如果小于 0 都化成 0
        ymax = float(xmlbox.find('ymax').text)
        ymax = ymax if ymax <= h else float(h) # 右下角 y 坐标如果大于图片高度了都为图片高度值
        b = (xmin, xmax, ymin, ymax)
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

for image_set in sets:
    if not os.path.exists('./%s/labels/' % object):
        os.makedirs('./%s/labels/' % object)
    image_ids = open('./%s/ImageSets/%s.txt' % (object, image_set)).read().strip().split()
    list_file = open('./%s/%s.txt' % (object, image_set), 'w')
    for image_id in image_ids:
        list_file.write('./images/%s.jpg\n' % (image_id))
    convert_annotation(image_id)
    list_file.close()

4.4、按上述步骤处理 train、val、test 三个数据集文件

本文仅处理可见光部分的数据集,红外光数据集处理跟该处理方式相同。 数据处理策略: 1)因为不需要测试集,所以将 val 验证集的 1469 个数据和 test 测试集 8980 个数据的 20% 的数据作为验证集,即 1469+89800.2=3265 个数据验证集。 2)将 train 训练集的 17990 个数据和 test 测试集 8980 个数据的 80% 的数据作为训练集,即 17990+89800.8=25174 个数据训练集。 3)整理训练集和验证集

文章配图

此时数据集已是 YOLO 格式,可以直接训练。

5、在 Yolo11 网络中训练

选用 YOLO11s 的网络权重进行模型训练,训练 100 个 epoch 结果如下:

文章配图

可以看到训练结果表现良好。

验证集上标签可视化:

文章配图

6、使用训练好的模型进行预测

文章配图

文章配图

第一张来自验证集,第二张为网络公开图片,检测结果比较理想。

7、总结与注意事项

尽管训练结果显示效果良好,但是仅适用于正射航拍视角,如果是斜视视角则效果较差。其次红外光下的检测效果目前还没测过,以及可见光和红外光融合检测效果也未经测试。

需要注意的点:处理白边、处理在图片边缘外的检测框问题。

目录

  1. 1、关于 DroneVehicle 数据集介绍
  2. 2、DroneVehicle 数据集下载
  3. 3、DroneVehicle 数据集处理
  4. 检查文件夹是否存在,如果不存在则创建
  5. 获得需要转化的图片路径并生成目标路径
  6. 转化所有图片
  7. 4、制作 Yolo 目标检测需要的数据集文件
  8. 4.1、下载 DroneVehicle 的 coco 格式的检测框标签文件
  9. 4.2、通过标注软件将 coco 格式的标签文件转为 VOC 格式的标签文件
  10. 4.3、处理 VOC 格式的标签文件并转成 Yolo 格式的标签文件
  11. 定义识别目标或类集合
  12. 根据自定义的数据集名称
  13. 修改类别 (自定义)
  14. 4.4、按上述步骤处理 train、val、test 三个数据集文件
  15. 5、在 Yolo11 网络中训练
  16. 6、使用训练好的模型进行预测
  17. 7、总结与注意事项

更多推荐文章

查看全部
  • 2026 年高校论文 AI 率新规:哪些学校明确 AIGC 检测要求
  • 2026 年测试工程师必备的 10 款免费开源 AI 工具
  • AI 语音合成新趋势:大模型驱动的自然韵律生成
  • 从盲行到跑酷:深度视觉如何赋予足式机器人极限运动能力
  • 基于空间注意力机制的神经网络 SANN 设计与实现
  • 基于 LlamaFactory 微调 Qwen3.5-4B 模型指南
  • MalformedStreamException 异常原因及 WebKitFormBoundary 边界机制解析
  • C++ STL 详解:手写 String 类实现
  • Python 从入门到精通的学习计划与进阶指南
  • Ubuntu 下 C 语言串口通信开发指南
  • 长亭 Xray Web 漏洞扫描器使用指南
  • Python 核心基础十分钟速览
  • Web3.0 开发实践:核心概念与技术架构
  • Web 用户状态管理:Cookie 与 Session 原理及区别
  • Telegram 中文搜索机器人@letstgbot 技术原理与开发实践
  • 2026 年 3 月 18 日 AI 行业前沿:算力竞赛、智能体落地与产业新范式
  • CentOS 使用国内镜像安装 nvm 与 Node.js 指南
  • C 语言 swap 函数底层原理:值传递与引用传递的汇编解析
  • Axure 制作 AI 自动对话机器人原型教程
  • GitHub 代码搜索实战:工具推荐与高级语法详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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