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

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

详细阐述了基于 YOLO11 模型利用 DroneVehicle 数据集进行无人机视角车辆目标检测的完整流程。内容涵盖数据集特性介绍、图像预处理(去白边、改尺寸)、标签格式转换(COCO 至 YOLO 并修正越界坐标)、训练集划分策略以及模型训练过程。最后展示了训练结果、验证集可视化及预测效果,并分析了不同视角下的性能局限。

月亮邮递员发布于 2026/4/6更新于 2026/7/842 浏览
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 数据集下载

官方仓库地址: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 = '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)) # xml 文件
    out_file = open('./%s/labels/%s.txt' % (object, image_id), 'w') # txt 文件
    image_file = open('./%s/images/%s.jpg' % (object, image_id)) # pic 文件
    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. 使用训练好的模型进行预测

文章配图

文章配图

第一张图片是 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. 4.4. 按上述步骤处理 train、val、test 三个数据集文件
  14. 5. 在 Yolo11 网络中训练
  15. 6. 使用训练好的模型进行预测
  16. 7. 结语及注意事项
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 大模型微调实战:LLaMA-Factory 快速上手
  • C++ 多态机制详解:从概念到实战
  • 区块链安全与共识机制深度解析
  • Java 面试题及答案汇总
  • 数据结构详解:图的存储结构与经典算法解析
  • Java 环境搭建与首个 Hello World 程序实战
  • AI 绘画关键词网站效率提升实战:从数据预处理到模型加速
  • 图解大模型构建:从 NLP 演进到 GPT 实战指南
  • AIGC 个性化与定制化内容生成:技术与应用
  • Java 9 至 Java 25 语言演进与核心技术革新解析
  • 使用 VarHandle 实现内存安全的无锁数据结构
  • SpringBoot 整合 Neo4j 图数据库实战指南
  • C++ 标准库 string 类详解:接口、原理与模拟实现
  • 10 篇大模型(LLM)优秀论文精选:Meta AI、浙大、清华等前沿成果
  • C++ 多态:从概念到虚函数表底层原理
  • Python 接入 IPIDEA API 实现 eBay 商品数据全自动化采集
  • Git 分布式版本控制:安装、配置与实战指南
  • Python 实现 AI 绘画用户评价自动分类与分析报告生成
  • 多线程程序崩溃原因:C++ 同步机制常见陷阱与解决方案
  • Java 并发编程:ForkJoin 分而治之框架

相关免费在线工具

  • 加密/解密文本

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