文章目录
- 字符串转数组
- 字符串中的数组转列表
- 转整数列表
- 读数据,然后画PR曲线
- 读取txt数据
- 关于PR曲线
- 代码
- 读数据画Loss曲线
- 读txt数据
- 代码
字符串转数组
.split() 是Python中的一个字符串方法,它可以将一个字符串按照指定的分隔符分割成多个子字符串,并返回一个由这些子字符串组成的列表。例如,如果有一个字符串"hello world",我们可以使用.split()方法将它按照空格分隔成两个子字符串[“hello”, “world”]。如果没有指定分隔符,则默认使用空格作为分隔符。
# 将逗号分隔的字符串转换为数组
data = 'huang,chao,yang'
data = data.split(',')
print(data)
# ---------------------------------------------
# 将空格分隔的字符串转换为数组
data = 'huang,chao,yang'
data = data.split(' ')
print(data)
# ---------------------------------------------
# 将字符串转换为字符数组
data = 'Chaoy'
data = list(data)
print(data)
# ---------------------------------------------
# 将字符串转换为整数数组
data = '1,2,3'
data = list(int(char) for char in data.split(','))
print(data)
# ---------------------------------------------
# 将字符串转换为单元素数组
data = 'Chaoy'
data = [data]
print(data)
字符串中的数组转列表
literal_eval()
from ast import literal_eval
data= '[1,2,3,4]'
data= literal_eval(data)
print(data)
转整数列表
data= '1,2,3'
data= list(int(digit) for digit in data.split(','))
print(data)
读数据,然后画PR曲线
读取txt数据
把类似于这样的数据读出来转为list,然后画图。
首先读txt内容
with open('file.txt', 'r') as f:
content = f.read()
print(content)
data_lines = "results-yolo7.txt" # 数据路径
with open(data_lines, "r") as f: # 读txt文本数据
data = f.readlines()
关于PR曲线
混淆矩阵如表 3 所示:将所有的样本分成四个类型,将正样本检测为正样本是 TP,将正样本检测为反样本是 FN,将反样本检测为正样本是 FP,将反样本检测为反样本是 TN。所有预测正确的样本数总数是 TP 和 TN 之和,所有预测为正样本的样本总数是 TP 和 FP之和。 TP 和 FN 的是所有实际为正的样本。
精确度,指所有正确被预测的正样本占预测为正样本的百分比。
P
r
e
i
c
i
s
i
o
n
=
T
P
/
(
T
P
+
F
P
)
Preicision= TP/(TP+FP)
Preicision=TP/(TP+FP)
召回率,指所有正确被预测的正样本占所有正样本的百分比。
R
e
c
a
l
l
=
T
P
/
(
T
P
+
F
N
)
Recall= TP/(TP+FN)
Recall=TP/(TP+FN)
P-R 曲线是指精确度为纵轴、召回率为横轴作图,得到查准率– 查全率曲线。
AP 是平均准确率, mAP 是所有类的平均准确率之和除以类数。
R 曲线和坐标轴包围的多边形的面积就是每个类别的 AP 值。
PR曲线是指精度(Precision)和召回率(Recall)之间的关系曲线,它是用于评估信息检索系统、文本分类系统等的性能的一种常用方法。在PR曲线中,横轴表示召回率,纵轴表示精度,曲线上每一点的坐标表示在该召回率下的最大精度。通常情况下,PR曲线是一个递增的曲线,表示随着召回率的增加,系统的精度也会相应地增加。在信息检索领域中,PR曲线是评估系统性能的重要指标之一。
代码
代码注释很详细,这里就不解释了。
import numpy as np
from ast import literal_eval
import matplotlib.pyplot as plt
import os
# ----------------------------------------------------------- #
data_lines1 = "input_data/results-yolo5.txt" # 数据路径1
data_lines2 = "input_data/results-yolo7.txt" # 数据路径2
data_lines3 = "input_data/results-yolo8.txt" # 数据路径3
image_path = 'out_data' # PR曲线保存路径
# CorrosionStain、Crack、Efflorescence、ExposedBars、Spallation
name = 'Crack AP ' # 设定那个一个类别的PR曲线 画哪一个 把名称改了就行了 后面的AP不要动
# ----------------------------------------------------------- #
# 数据读取函数
def read_data(data_lines,name):
Precision_all = []
Recall_all = []
with open(data_lines, "r") as f: # 读txt文本数据
data = f.readlines()
for i in range(len(data)): # 遍历每一行
zancun = data[i] # 读第i行
if i < len(data) - 2: # 防止溢出
zancun_p = data[i + 1] # 读第i+1行
zancun_r = data[i + 2] # 读第i+2行
if zancun[9:-1] == name: # 根据名称判断是哪一个类别
Precision = zancun_p[12:] # 把str里的Precision数据取出来
Recall = zancun_r[9:] # 把str里的Recall数据取出来
Precision = literal_eval(Precision) # 字符串转列表
Recall = literal_eval(Recall) # 字符串转列表
for i in range(len(Precision)):
Precision_all.append(float(Precision[i])) # 转float
Recall_all.append(float(Recall[i])) # 转float
return Precision_all,Recall_all
Precision_yolo5,Recall_yolo5 = read_data(data_lines1,name) # 读取数据1
Precision_yolo7,Recall_yolo7 = read_data(data_lines2,name) # 读取数据2
Precision_yolo8,Recall_yolo8 = read_data(data_lines3,name) # 读取数据3
plt.xlabel("Recall") # x轴标签
plt.ylabel("Precision") # y轴标签
plt.title(name) # 图片名字
plt.xlim(0.0,1.0) # x轴量程
plt.ylim(0.0,1.05) # y轴量程
plt.plot(Recall_yolo5,Precision_yolo5,linewidth=2.0,linestyle='-') # 画线1
plt.plot(Recall_yolo7,Precision_yolo7,linewidth=2.0,linestyle='-') # 画线2
plt.plot(Recall_yolo8,Precision_yolo8,linewidth=2.0,linestyle='-') # 画线3
plt.legend(labels=["yolo5","yolo7", "yolo8"], ncol=3) # 设定线的标签
if not os.path.exists(image_path): # 如果image文件夹不存在,则创建
os.mkdir(image_path) # 创建保存图片的文件夹
plt.savefig("{image_path}/{name}.png".format(image_path=image_path,name=name), dpi=300) # 保存PR曲线图片
plt.show() # 显示
结果:
读数据画Loss曲线
读txt数据
读数据 我的Loss数据是这个样子的,有250行也就是250个。
代码
import numpy as np
from ast import literal_eval
import matplotlib.pyplot as plt
import os
data_lines1 = "input_data/epoch_loss-yolo5.txt" # 数据路径1
data_lines2 = "input_data/epoch_loss-yolo7.txt" # 数据路径2
image_path = 'out_data' # Loss曲线保存路径
name = 'epoch_loss ' # 保存图片的名字
def read_data(data_lines): # 读取数据函数
data_all = []
with open(data_lines, "r") as f: # 读txt文本数据
data = f.readlines()
for i in range(len(data)):
data_all.append(float(data[i])) # 转float list
return data_all
yolo5_loss = read_data(data_lines1) # 读数据1
yolo7_loss = read_data(data_lines2) # 读数据2
yolo5_x = np.arange(1,len(yolo5_loss)+1) # 生成对应属于的x值
yolo7_x = np.arange(1,len(yolo7_loss)+1) # 生成对应属于的x值
plt.xlabel("eporch") # x轴标签
plt.ylabel("Loss") # y轴标签
plt.title("Loss curve") # 图片名字
plt.xlim(0.0,300.0) # x轴量程
plt.ylim(0.0,1.05) # y轴量程
plt.plot(yolo5_x,yolo5_loss,linewidth=2.0,linestyle='-') # 画线1
plt.plot(yolo7_x,yolo7_loss,linewidth=2.0,linestyle='-') # 画线2
plt.legend(labels=["yolo5","yolo7"], ncol=3) # 设定线的标签
if not os.path.exists(image_path): # 如果image文件夹不存在,则创建
os.mkdir(image_path) # 创建保存图片的文件夹
plt.savefig("{image_path}/{name}.png".format(image_path=image_path,name=name), dpi=300) # 保存PR曲线图片
plt.show() # 显示
结果如下: