话不多说先上图
原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('替换完成')
写在这里记录一下,防止以后用的时候忘记。