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

news/2024/11/15 7:33:10/

文章目录

    • 字符串转数组
    • 字符串中的数组转列表
      • 转整数列表
    • 读数据,然后画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_evaldata= '[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]))  # 转floatRecall_all.append(float(Recall[i]))        # 转floatreturn Precision_all,Recall_allPrecision_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)  # 读取数据3plt.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='-')  # 画线3plt.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 osdata_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 listreturn data_allyolo5_loss = read_data(data_lines1)         # 读数据1
yolo7_loss = read_data(data_lines2)         # 读数据2yolo5_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='-')  # 画线2plt.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()  # 显示

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


http://www.ppmy.cn/news/98284.html

相关文章

认识Tomcat

hi,大家好,今天为大家带来Tomcat的相关知识 &#x1f36d;1.Tomcat是什么 &#x1f36d;2.Tomcat的下载安装 &#x1f36d;3.Tomcat的目录结构 &#x1f36d;4.启动Tomcat &#x1f36d;5.部署博客系统到Tomcat &#x1f349;1.Tomcat是什么 我们之前也已经学了http,http…

数据结构入门(C语言版)图的概念和功能函数实现

图的概念和功能函数实现 前言1.图的定义和术语1.1 定义1.2 常用术语 2.图的存储结构2.1 图的数组(邻接矩阵)存储表示2.2 图的邻接表存储表示 3.图的遍历3.1 深度优先搜索3.2 广度优先搜索3.3 示例 4.连通网的最小生成树4.1 克鲁斯卡尔(Kruskal)算法4.2 普里姆(Prim)算法 5.图的…

【算法题】1726. 同积元组

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你一个由 不同 正整数组成的数组…

【软件分析/静态分析】学习笔记02——中间表示Intermediate Representation

&#x1f517; 课程链接&#xff1a;李樾老师和谭天老师的&#xff1a;南京大学《软件分析》课程02&#xff08;Intermediate Representation&#xff09;_哔哩哔哩_bilibili 目录 第二章 Intermediate Representation 2.1 编译器与静态分析器的关系(Compilers & Static …

js的BOM对象中的window、location使用

说明&#xff1a;BOM的全称是Browser Object Model&#xff0c;浏览器对象模型&#xff0c;有Window&#xff08;浏览器窗口&#xff09;、Navigator&#xff08;浏览器&#xff09;、Screen&#xff08;屏幕&#xff09;、History&#xff08;历史记录&#xff09;和Location&…

【软件开发】Redis 理论篇(一)

Redis 理论篇&#xff08;一&#xff09; 一、概述 1.什么是 Redis&#xff1f; Redis 是一个使用 C 语言写成的&#xff0c;开源的高性能 Key-Value 非关系缓存数据库。它支持存储的 Value 类型相对更多&#xff0c;包括 string&#xff08;字符串&#xff09;、list&#x…

使用【Python+Appium】实现自动化测试

一、环境准备 1.脚本语言&#xff1a;Python3.x IDE&#xff1a;安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境&#xff0c;path添加E:\Software\Android_SDK\platform-tools 4.安装Appium for windows&#xff0c;官网地址 Redirecting 点击下载按钮会到GitHub的…

【Linux】线程详解之线程互斥与同步

文章目录 Linux线程互斥一、进程线程间的互斥相关概念1.临界资源和临界区2.互斥和原子性 二、互斥量mutex1.抢票程序是否引入互斥量现象观察2.抢票程序原理分析3.互斥量的接口4. 加锁后的程序5.互斥量原理探究 可重入VS线程安全一、概念1.线程安全2.重入 二、常见的线程不安全的…