VisDrone2018-DET-toolkit-master工具包用法以及踩坑记录(基于TPH-YOLOv5在VisDrone2019数据集上的测试)

文章介绍了VisDrone2019无人机视觉目标检测数据集,包括其规模、多样性以及使用VisDrone2018-DET-toolkit-master工具包的要求。作者分享了使用改进的YOLOv5模型进行测试的过程,特别是如何将YOLO格式的标签转换为VisDrone所需的格式。在标签转换中遇到的问题,如空txt文件、AP值过低等,以及相应的解决方案也被详细讨论。
摘要由CSDN通过智能技术生成

 1、VisDrone2019数据集介绍

        VisDrone2019数据集由天津大学机器学习和数据挖掘实验室AISKYEYE团队收集。基准数据集包括288个视频片段,由261908帧和10209幅静态图像组成,由各种无人机摄像头捕获,覆盖范围广泛,包括位置(来自中国相隔数千公里的14个不同城市)、环境(城市和农村)、物体(行人、车辆、自行车、等)和密度(稀疏和拥挤的场景)。请注意,数据集是在不同的场景、不同的天气和光照条件下使用不同的无人机平台(即不同型号的无人机)收集的。

        在官网上下载的数据集格式如图,其中训练集有6471张图片,验证集有548张图片,测试集使用第二个test-dev的1610张图片,因为这个测试集有真值标签,可以用我们的测试结果在matlab上使用VisDrone2018-DET-toolkit-master工具包测试AP。

2,TPH-YOLOv5对VisDrone2019-DET-test-dev数据集测试

        我使用的是改进的YOLOv5模型进行训练与测试,其他模型也是一样的。具体网络的下载,环境的配置,模型的训练等等都不是本文的重点,如果有需要我将会把代码链接公布大家自取。

        首先在TPH-YOLOv5的detect.py文件下测试VisDrone2019-DET-test-dev数据集,针对每一个图片会生成一个YOLO格式的标签txt文件,如图:

        共有1610个txt文件,每个文件里面都有其识别的目标类别、归一化的位置参数和置信度

(object_category, x_norm, y_norm, w_norm, h_norm, score)。但是在VisDrone2018-DET-toolkit-master工具包中要求输入的txt格式与网络生成的txt格式不一样,这一步要自行转换,否则无法完成工具包测评。工具包给的格式为:

<bbox_left>,<bbox_top>,<bbox_width>,<bbox_height>,<score>,<object_category>,<truncation>,<occlusion>

         所以重点的是将YOLO格式的标签转化为VisDrone格式的标签。我是基于python自己写了一个代码,下面粘贴出来方便大家使用,改个文件路径即可。

import os
from PIL import Image

# 定义转换函数
def yolo_to_visdrone(yolo_label, img_width, img_height):
    # 分离yolo标签内容
    object_category, x_norm, y_norm, w_norm, h_norm, score = yolo_label.split()

    # 将归一化坐标转换为绝对坐标
    bbox_left = int((float(x_norm) - float(w_norm) / 2) * img_width)
    bbox_top = int((float(y_norm) - float(h_norm) / 2) * img_height)
    bbox_right = int((float(x_norm) + float(w_norm) / 2) * img_width)
    bbox_bottom = int((float(y_norm) + float(h_norm) / 2) * img_height)
    bbox_width = bbox_right - bbox_left
    bbox_height = bbox_bottom - bbox_top

    # 生成visdrone格式标签
    visdrone_label = f"{bbox_left},{bbox_top},{bbox_width},{bbox_height},{score},{int(object_category)+1},0,0"

    return visdrone_label


# 定义原始txt文件夹路径、存放转换后txt文件的文件夹路径和图片宽高
original_folder_path = "C:/Users/19648/Desktop/tph-yolov51-main/tph-yolov5-main/runs/val/v5l-xs7/labels"  # 原始txt文件夹路径
converted_folder_path = "C:/Users/19648/Desktop/tph-yolov51-main/tph-yolov5-main/datasets/VisDrone/VisDrone2019-DET-test-dev/annotations2"  # 转换后txt文件的文件夹路径
# 遍历原始txt文件夹下的所有txt文件并转换
for file_name in os.listdir(original_folder_path):
    if file_name.endswith(".txt"):
        # 从图片文件中提取图片尺寸
        image_name = os.path.splitext(file_name)[0]
        image_path = os.path.join("C:/Users/19648/Desktop/tph-yolov51-main/tph-yolov5-main/runs/detect/exp11", image_name + ".jpg")
        with Image.open(image_path) as img:
            img_width, img_height = img.size

        with open(os.path.join(original_folder_path, file_name), "r") as f:
            lines = f.readlines()
        visdrone_lines = []
        for line in lines:
            visdrone_line = yolo_to_visdrone(line.strip(), img_width, img_height)
            visdrone_lines.append(visdrone_line)
        with open(os.path.join(converted_folder_path, file_name), "w") as f:
            f.write("\n".join(visdrone_lines))

3,问题分析

        接下来到了踩坑环节,是一些细节性的问题,往往细节决定成败,请大家有问题详细阅读这一部分。

(1)先解决visdrone官网上有人问的一个问题,就是格式都已经转好了但是运行matlab评测工具包还是报错,显示索引超出数组边界。

问题分析:出现这个问题是因为在某一张图片目标检测过程中没有检测到物体,那么其txt文件中就没有目标信息,就是一个空txt,matlab在处理空表格时就会出现这样的错误。

解决办法:通过matlab代码的调试,检查是哪一张图片没有检测到,如果少的话,不影响AP计算的前提下用真值标签替换(此法最简单,但是有一点作弊的意思),或者就是优化检测算法,让其最好可以检测到物体。

(2)将转好格式的预测标签和真值标签放进工具包进行评测AP值过低。

分析原因:AP值太低那就是我们转换标签时出现了问题,因为数据集中的图片大小不一致,在由归一化的参数转回到绝对参数时需要有乘图片的长和宽的操作,参考上面标签转换代码,下面也专门截取了一段。

 # 从图片文件中提取图片尺寸
        image_name = os.path.splitext(file_name)[0]
        image_path = os.path.join("C:/Users/19648/Desktop/tph-yolov51-main/tph-yolov5-main/runs/detect/exp11", image_name + ".jpg")
        with Image.open(image_path) as img:
            img_width, img_height = img.size

 解决办法:我们在回归真实的目标框时必须逐个图片进行读入去查看其长和宽如何进行回归,不能自认为数据集图像大小是一致的而给定了一个长和宽的固定值,这一点也易错。

(3)在matlab工具包中其十类的目标计数是从1-10的,而YOLO检测出来时从0-9的,所以在转换标签时,需要在YOLO格式的标签基础上加1,才能和工具包格式匹配,如图:

 # 生成visdrone格式标签
    visdrone_label = f"{bbox_left},{bbox_top},{bbox_width},{bbox_height},{score},{int(object_category)+1},0,0"

这里给object_category参数加了1,就使得二者保持一致了。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值