import os
def create_mapping_dic(mapping_txt): # 保存裁剪图片在原图中的位置,用于 save_recognize_result 的映射
mapping_dic = {}
txt = open(mapping_txt, 'r').readlines()
for info in txt:
info = info.split() # info = [图片编号, x左上, y左上, x右下, y右下]
photo_name = info[0]
x1 = int(float(info[1]))
y1 = int(float(info[2]))
x2 = int(float(info[3]))
y2 = int(float(info[4]))
mapping_dic[photo_name] = (x1, y1, x2, y2)
return mapping_dic
def save_recognize_result(detect_dir, detect_file_name, number, recognize_dir, mapping_dic, thresh = 0.20):
'''
detect_dir: 保存 识别一个数字的位置的 txt 文本 的目录的地址
detect_file_name: valid 出来的 txt 文本的前缀
number: 识别什么数字
recognize_dir: 经映射后的原图数字位置
thresh: 只显示置信度大于阈值的识别结果
mapping_dic: 保存裁剪图片对应原图的位置信息,构造映射
'''
detect_txt = os.path.join(detect_dir, detect_file_name + str(number) + '.txt') # valid 出来的 txt 文本的地址
txt = open(detect_txt, 'r').readlines()
for info in txt:
info = info.split() # info = [图片编号, 置信值, x左上, y左上, x右下, y右下]
ground_truth = float(info[1])
if ground_truth > thresh: # 只裁剪出检测时置信度大于阈值的识别物体
photo_name = info[0]
x0, y0, _, _ = mapping_dic[photo_name]
recognize_txt = photo_name[:-2] + '.txt'
recognize_txt_path = os.path.join(recognize_dir, recognize_txt)
if recognize_txt not in os.listdir(recognize_dir):
txt_write = open(recognize_txt_path, 'w') # 若文本不存在,先创建新文本,然后写入
else:
txt_write = open(recognize_txt_path, 'a') # 追加模式,写入而不覆盖原内容
x1 = x0 + int(float(info[2]))
y1 = y0 + int(float(info[3]))
x2 = x0 + int(float(info[4]))
y2 = y0 + int(float(info[5]))
recognize_result = [number, x1, y1, x2, y2]
recognize_result = [str(x) for x in recognize_result]
recognize_string = ' '.join(recognize_result)
txt_write.write(recognize_string)
txt_write.write('\n')
print('successfully save the info of recognizing number ' + str(number) + ' !')
mapping_dic = create_mapping_dic('mapping.txt')
for number in range(10): #十个数字依次识别
save_recognize_result('valid', 'comp4_det_test_', number, 'recognize_txt', mapping_dic, thresh = 0.20)
注意点
file = open(file_name, 'a')
表示追加模式,循环结构,写入时可以不覆盖原内容,’w’ 则会覆盖原内容
但是 ‘a’ 不会创建新文本,所以循环的第一次需要 ‘w’,或先创建好空白的文本