基础学习——读txt数据、字符串转list或数组、画PR曲线、画Loss曲线

系列文章目录

基础学习——关于卷积层的记录
基础学习——nn.Unfold 批量切片、F.conv2d 指定卷积核二维卷积操作、nn.Conv2d卷积层
基础学习——读txt数据、字符串转list或数组、画PR曲线、画Loss曲线



字符串转数组

.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曲线保存路径
# Dog、Cat、Fish、Bird、Pig
name = 'Pig 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()  # 显示

结果如下:
在这里插入图片描述

工程代码链接

https://download.csdn.net/download/weixin_45464524/87835052?spm=1001.2014.3001.5503

猜你喜欢

转载自blog.csdn.net/weixin_45464524/article/details/130905181