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

1、关于DroneVehicle数据集介绍

DroneVenicle数据集是由天津大学收集、标注的大型无人机航拍车辆数据集。
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 = '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)
    # f = open(in_file.name,encoding="utf-8")
    # tree = ET.parse(f)
    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+8980*0.2=3265个数据验证集。
2)将train训练集的17990个数据和test测试集8980个数据的80%的数据作为我的训练集,即17990+8980*0.8=25174个数据训练集。
3)整理我的训练集和验证集

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

5、在Yolo11网络中训练

我选择了yolo11s的网络权重进行模型训练,训练100个epoch结果如下:

可以看到训练结果还不错。

验证集上标签可视化:

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

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

7、结语及注意事项

虽然从训练结果上看效果还不错,但是仅针对于该种无人机航拍视角下,如果是斜视视角则效果较差。其次红外光下的检测效果目前还没测过,以及可见光和红外光融合检测效果也未经测试。

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

 

 

YOLOv5是一个基于深度学习的目标检测算法,在训练时可以用于识别和定位无人机(Drone)车辆。在使用YOLOv5训练Drone Vehicle的任务中,我们需要采取以下步骤: 1. 数据收集:为了训练一个准确的Drone Vehicle检测器,我们需要收集大量的包含无人机车辆的图像和视频数据。这些数据应该包括各种场景和角度下的无人机车辆,以便模型可以学习不同背景和环境中的识别能力。 2. 数据标注:收集到的数据需要进行标注,以便告诉模型每个图像中的无人机车辆的位置和类别。标注可以通过绘制框来实现,其中包含无人机车辆的边界框,并分配一个唯一的类别标签。 3. 模型配置:在训练之前,我们需要配置YOLOv5模型。这包括选择适当的网络架构和参数设置,以及设置训练数据集和验证数据集的路径。 4. 训练网络:使用配置好的模型和标注数据,我们可以开始训练网络。在训练期间,YOLOv5将通过反向传播算法不断优化网络权重,使其能够更好地识别和定位无人机车辆。 5. 模型评估:训练完成后,我们需要对模型进行评估以确定其性能。这可以通过使用已标注的测试数据集来计算模型的准确率、召回率和F1得分等指标来完成。 6. 模型优化:如果模型的性能不尽人意,我们可以通过调整网络的超参数、增加训练数据量或使用数据增强等技术来进一步优化模型。 总体而言,使用YOLOv5训练Drone Vehicle的过程涉及数据收集、标注、模型配置、训练、评估和优化等步骤。通过不断迭代和调整,我们可以得到一个准确且高效的无人机车辆检测器。
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值