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

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

YOLO11 模型在 DroneVehicle 数据集上的无人机视角车辆目标检测实践。文章介绍了数据集特性与下载方式,详细说明了去除白边、坐标归一化及格式转换(COCO/VOC 转 YOLO)的数据预处理流程。包含训练配置、结果可视化及预测测试环节,并总结了斜视视角与红外检测的局限性及边缘框处理注意事项。

2177283801发布于 2026/3/26更新于 2026/9/1172 浏览
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 格式标签,但是经测试 X-AnyLabeling 也没有处理大于 1 的坐标值。

xml2txt.py

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

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

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

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_name, image_id))
    out_file = open('./%s/labels/%s.txt' % (object_name, image_id), 'w')
    image_file = open('./%s/images/%s.jpg' % (object_name, image_id))
    
    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_name):
        os.makedirs('./%s/labels/' % object_name)
    image_ids = open('./%s/ImageSets/%s.txt' % (object_name, image_set)).read().strip().split()
    list_file = open('./%s/%s.txt' % (object_name, 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、使用训练好的模型进行预测

文章配图

文章配图

第一张图片是 val 验证集中找的,第二张图片是网络上随便找的,检测结果比较理想。

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、总结与注意事项

更多推荐文章

查看全部
  • VsCode 远程开发时 Github Copilot 代码提示失效排查指南
  • JavaWeb 基础:动静态 Web、URL 与 HTTP 协议
  • AI 产品经理数据标注全流程指南
  • CSS 背景样式详解:颜色、图片与定位
  • Flutter 使用 groq_sdk 在 OpenHarmony 上实现 LPU 推理应用
  • OpenClaw 接入 QQ 机器人完整指南
  • ToDesk 内置 ToClaw AI:科技新闻日报自动化实战
  • 大模型工程师学习路线:从基础到上手
  • PX4 与 ROS 集成:Offboard 模式解析及无人机轨迹控制实战
  • MoltBot 接入钉钉 Stream 流式接口配置详解
  • ESP32-S3接入文心一言的语音助手实战
  • OpenClaw 插件开发指南:为 AI 数字员工添加新技能
  • 舔狗转正!我花了三天狂测 Megick Studio,彻底跪了!还当什么舔狗啊!
  • AI 大模型应用开发:从入门到精通的体系化学习路线
  • MySQL 基本查询实战:增删改查与聚合分组详解
  • SpringBoot + Vue 前后端分离:权限、工作流与报表实现
  • 基于 Spring Boot + Vue 的无人机共享管理系统设计与实现
  • 混合知识库搭建:本地 Docker 部署 Neo4j 图数据库与 Milvus 向量库
  • OpenDroneMap 无人机影像处理与地理数据生成指南
  • Stable Diffusion 图生图功能入门详解

相关免费在线工具

  • 加密/解密文本

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