在Python3.8环境下用OpenMV对yolo数据集进行数据增强-镜面转换时,打算直接批量修改镜像前txt里的某值作为镜像后的labels。但发现有bug的风险,于是把代码移植到Python控制台。上图看出将字符串转化成float后再转化成str有出错的风险。除非用中间值传递。博主通过控制float精度并四舍五入解决,附上菜鸟代码
import os
path = './labels_aftermirror/test/'
for file in os.listdir(path):
f = open(path + file, 'r+')
temp = f.readlines()
needx = [] # 存储截取后的每一块小数据
for line in temp:
needx.extend(line.split()) # ['序号','中心点x坐标', '中心点y坐标', 'x相对长度', 'y相对长度']
for n in range(7): # 此值应大于一张image中目标的最大数量
if len(temp) > n:
m = n*5 - 4
needx[m] = str('{:.6f}'.format(1 - float(needx[m]))) # 若无精度限制,则可能报错
f.seek(0)
f.truncate()
i = 1
for data in needx:
f.write(data + ' ')
if i % 5 == 0: # 每五个值留出空行
f.write('\n')
i = i + 1
needx.clear()
del n
f.close()
其他:博主误把输出时的data+' '写成data+'\0',导致转化后的txt格式虽然看上去无误,但在调用cv2可视化代码时出现could not convert string to float,无法读取\x00。后来尝试将txt中空格删除并重打后发现可以读取。即txt文件中的‘ ’不一定是真的空格。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)