python批量转换yolov5中detect.py生成的txt为指定的txt格式

  • Post author:
  • Post category:python


话不多说先上图


原txt文件格式为yolov5中的detect.py生成的txt文件格式(左侧为待转txt格式)

转换后生成我所需要的txt文件格式(右侧为转换好的txt格式)

(这里

注意

:左图的txt每一行分别代表:

<cls><左上角x><左上角y><右下角x><右下角y><conf>


并非detect标准的cls+xywh+conf格式

,这是因为我在detet.py中做了如下改动,相当于就是放弃将xyxy转成xywh,这样生成的txt文件就是上方左图的样子)

可以看出,需要转的部分有以下几点:

1、将用数字表示的cls全部替换成类别名,比如1替换成echinus等等。

2、将所有数字间的空格替换成“,”。

3、将最后表示conf的数据保留两位小数。

直接上代码:

#yolov5的detect生成的labels转成水下比赛的要求的labels格式

import os
path=r'C:/Users/GXUFE-204/Desktop/test/labels'#转换前txt保存的文件夹
save=r'C:/Users/GXUFE-204/Desktop/test/txt'#转换后txt保存的文件夹

for item in os.listdir(path):#遍历文件夹里的文件
    path_item=os.path.join(path,item)
    path_item2 = os.path.join(save, item)#保存的路径
    a = []
    with open(path_item,'r') as f1,open(path_item2,"a")as f2:
        for line in f1:
            a.append(line)

        for i in a:
            if ' ' in str(i):#遍历每一行
                b = str(i).replace(' ', ',')#这个b啊就是个字符串来的,空格换成“,”
                char = '.'
                pos = b.find(char) #小数点在字符串中所在的位置
                con=b[0:pos+3]  #置信度两位小数,还是个字符串
                #print(con)
                zz=con+"\n"
                #print(zz)

                m = list(zz)#替换每一行的第一个数字,换成对应类别的英文
                if m[0]=='0':
                    m[0]='holothurian'
                if m[0]=='1':
                    m[0]='echinus'
                if m[0]=='2':
                    m[0]='scallop'
                if m[0]=='3':
                    m[0]='starfish'
                b =''.join(m)


                print(b)
                f2.write("%s" % (b))
        print('替换完成')


写在这里记录一下,防止以后用的时候忘记。



版权声明:本文为coulson原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。