关于目标检测任务中,YOLO(txt格式)标注文件的可视化

1. 前言

本文是针对yolo标注格式txt文件的可视化脚本介绍

如果是VOC格式的xml文件,参考:关于目标检测任务中,XML(voc格式)标注文件的可视化

代码比较简单, 50行这样 。。。。

下面是代码的目录结构,1.jpeg 是数据图像,1.txt是对应的相对坐标信息和索引类别

result.png 是保存的绘制好边界框的图像

**因为yolo格式的类别是0开始的索引,所以classes文件尤为重要,否则根本不知道数字对应的目标是什么!**这里的classes采用普遍的txt文件展示

Tips: 没有这个classes文件怎么办?

有好几种方法,例如

  1. 写个脚本将训练集所有标签文件 (txt文件)的内容读取出来,把第一列目标类别项提取出来,然后去重,看看索引到多少,根据不同的索引看看原图框住是什么,自己新建个txt文件写上去就行了。
  • 读取所有的训练集,是因为训练集包含全部的检测类别,要不然网络没法识别没有学习到的内容
  1. 或者干脆不要这个了,推理的时候,直接在输出图像上推理数字就行了...

  2. 好吧,第二种确实有点丑,事实上大部分的数据都有这个classes文件,不管是json字典格式还是txt格式,要不然网络训练的时候根本没法定义检测的个数。 大部分的数据还是VOC的居多,也就是xml标注的,只需要将xml标注的classes文件拷贝就行了。要是VOC的也没有classes文件,可以参考这个文章生成:目标检测篇:如何根据xml标注文件生成类别classes的json文件

2. 实现代码

大部分和xml可视化脚本差不多,这里只介绍差异的部分

首先,在读取原始图像的时候,需要保留图像的原始size,因为yolo标签是相对坐标,这个有用

然后加载classes文件,这里是列表,看图片中的注释

在然后,同样的方法打开标注txt文件,这里是列表,按照行存储

注意列表的格式,每个元素(字符串)中间是空格隔开的

接下来,保存单个txt文件所以的信息

  • 上面说了,每个目标存放在列表里,单个目标有五个元素,用空格隔开,所以这里将i用空格切分,赋给相应的五个变量,看蓝色框
  • 因为是字符串形式,所以要进行类型转换,这里的类别需要整形,其余的小数,看黄色框
  • 最后就是坐标变换了,这个很简单,简单的数学计算罢了,需要注意的是,坐标映射还原后,需要改成整型!看黑色框

最后,ob 里面存放的就是这样的

后面就都一样了,不赘述,直接看效果

完美

3. 完整代码

如下:

python 复制代码
import cv2


def txtShow(img,txt,save=True):
    image = cv2.imread(img)
    height,width = image.shape[:2]      # 获取原始图像的高和宽

    # 读取classes类别信息
    with open('./my_yolo_dataset/my_data_label.txt','r') as f:
        classes = f.read().splitlines()
    # ['Leconte', 'Boerner', 'linnaeus', 'armandi', 'coleoptera', 'acuminatus', 'Linnaeus']

    # 读取yolo格式标注的txt信息
    with open(txt,'r') as f:
        labels = f.read().splitlines()
    # ['0 0.403646 0.485491 0.103423 0.110863', '1 0.658482 0.425595 0.09375 0.099702', '2 0.482515 0.603795 0.061756 0.045387', '3 0.594122 0.610863 0.063244 0.052083', '4 0.496652 0.387649 0.064732 0.049107']

    ob = []         # 存放目标信息
    for i in labels:
        cl, x_centre, y_centre, w, h = i.split(' ')

        # 需要将数据类型转换成数字型
        cl, x_centre, y_centre, w, h = int(cl), float(x_centre), float(y_centre), float(w),float(h)
        name = classes[cl]      # 根据classes文件获取真实目标
        xmin = int(x_centre * width - w * width / 2)        # 坐标转换
        ymin = int(y_centre * height - h * height / 2)
        xmax = int(x_centre * width + w * width / 2)
        ymax = int(y_centre * height + h * height / 2)

        tmp = [name, xmin, ymin, xmax, ymax]  # 单个检测框
        ob.append(tmp)

    # 绘制检测框
    for name, x1, y1, x2, y2 in ob:
        cv2.rectangle(image, (x1, y1), (x2, y2), color=(255, 0, 0), thickness=2)  # 绘制矩形框
        cv2.putText(image, name, (x1, y1 - 10), fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                    fontScale=0.5, thickness=1, color=(0, 0, 255))

        # 保存图像
    if save:
        cv2.imwrite('result.png', image)

        # 展示图像
    cv2.imshow('test', image)
    cv2.waitKey()
    cv2.destroyAllWindows()


if __name__=='__main__':
    img_path = './my_yolo_dataset/train/images/1.jpeg'      # 传入图片

    label_path = img_path.replace('images','labels')
    label_path = label_path.replace('.jpeg','.txt')         # 自动获取相应的txt标签文件

    txtShow(img=img_path,txt=label_path,save=True)
相关推荐
DXM05219 小时前
第13期|遥感语义分割模型:U-Net核心原理+遥感落地优势
人工智能·python·深度学习·目标检测·随机森林·机器学习·支持向量机
乐迪信息11 小时前
乐迪信息:港口船舶偏航难监管,AI智能监测实时发出预警提醒
大数据·人工智能·安全·计算机视觉·目标跟踪
ʜᴇɴʀʏ11 小时前
SSVOD 基础知识
人工智能·目标检测·计算机视觉
AI浩11 小时前
用于无人机目标检测的三模态融合 Transformer
目标检测·transformer·无人机
YOLO视觉与编程11 小时前
jetson orin nano烧录jetpack7.2系统
人工智能·深度学习·yolo·目标检测·机器学习
stsdddd14 小时前
YOLO系列目标检测数据集大全【第二十五期】
yolo·目标检测·目标跟踪
西西弗Sisyphus1 天前
YOLO26 自定义损失函数 分类任务自定义损失的接口约定
yolo·yolo26
stsdddd1 天前
YOLO系列目标检测数据集大全【第二十二期】
yolo·目标检测·目标跟踪
王小王-1231 天前
基于 YOLOv8 与 Faster R-CNN 的红外图像行人检测系统设计与实现
yolo·目标检测·cnn·fasterrcnn·红外行人检测
stsdddd1 天前
YOLO系列目标检测数据集大全【第二十三期】
yolo·目标检测·目标跟踪