关于目标检测任务中,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)
相关推荐
思通数据5 小时前
AI与OCR:数字档案馆图像扫描与文字识别技术实现与项目案例
大数据·人工智能·目标检测·计算机视觉·自然语言处理·数据挖掘·ocr
思通数据11 小时前
语音识别如何赋能医疗行业:AI技术应用与场景剖析
人工智能·目标检测·机器学习·计算机视觉·自然语言处理·数据挖掘·语音识别
LNTON羚通16 小时前
摄像机视频分析软件下载LiteAIServer视频智能分析软件抖动检测的技术实现
目标检测·音视频·监控·视频监控
红色的山茶花1 天前
YOLOv6-4.0部分代码阅读笔记-engine.py
笔记·yolo
小哥谈2 天前
注意力机制篇 | YOLO11改进 | 即插即用的高效多尺度注意力模块EMA
人工智能·深度学习·神经网络·yolo·目标检测·机器学习·计算机视觉
思通数科AI全行业智能NLP系统2 天前
智慧城市路面垃圾识别系统产品介绍方案
人工智能·深度学习·目标检测·计算机视觉·目标跟踪·自然语言处理·数据挖掘
静静AI学堂2 天前
Yolo11改进策略:上采样改进|CARAFE,轻量级上采样|即插即用|附改进方法+代码
人工智能·yolo·目标跟踪
小张贼嚣张2 天前
yolov8涨点系列之引入CBAM注意力机制
yolo·目标检测
LNTON羚通2 天前
视频智能分析平台LiteAIServer算法定制工业排污检测算法:科技赋能环保监管
大数据·科技·算法·目标检测·音视频·监控
辛勤的程序猿3 天前
YOLO即插即用---CPCA
yolo