YOLOv5训练后的result.txt 文件,如下图所示
倒数第7列至倒数第4列是每次迭代后相应的Precision、Recall、mAP@0.5、mAP@0.5:0.95
可使用如下代码将其提取出来,并做成折线图。
import matplotlib.pyplot as plt
def openreadtxt(file_name):
data = []
file = open(file_name, 'r', encoding='utf-8') # 打开文件
file_data = file.readlines() # 读取所有行
for row in file_data:
tmp_list = row.split(' ') # 按‘,’切分每行的数据
# tmp_list[-1] = tmp_list[-1].replace('\n',',') #去掉换行符
data.append(tmp_list) # 将每行数据插入data中
return data
if __name__ == "__main__":
data = openreadtxt('results.txt') #原始数据
b = 0
data1 = []
data1 = data #原始数据副本
a = data[0][0] #txt文件中的杂乱数据
for z in range(0,len(data1)): #删除原始数据中的杂乱数据,只留下有效的数字数据
b = 0
for i in range(0, len(data1[z])):
if(data1[z][i]==a):
b = b + 1
for i in range(0,b):
data1[z].remove(a)
y1 = 0
y2 = 0
y_precision = []
y_recall = []
for i in range(0,len(data1)): #将percision和recall转换为浮点数格式并放到指定数组里面,用于后序画图
y_recall.append(1)
y_precision.append(1)
y_precision[i] = float(data1[i][8])
y_recall[i] = float(data1[i][9])
y1 = y1 + y_precision[i]
y2 = y2 + y_recall[i]
y_precision_ag = y1/len(data1)
y_recall_ag = y2/len(data1)
# print(y_precision_ag)
# print(y_recall_ag)
x = [] # x轴坐标
for i in range(0, len(data1)):
x.append(1)
x[i] = i
plt.plot(x, y_recall, 'b--', alpha=0.5, linewidth=1, label='recall') # 'bo-'表示蓝色实线,数据点实心原点标注
## plot中参数的含义分别是横轴值,纵轴值,线的形状('s'方块,'o'实心圆点,'*'五角星 ...,颜色,透明度,线的宽度和标签 ,
plt.legend() # 显示上面的label
plt.xlabel('epochs') # x_label
plt.ylabel('recall') # y_label
# plt.ylim(-1,1)#仅设置y轴坐标范围
plt.show()
最后呈现的折线图