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

news2024/12/28 19:08:33

文章目录

    • 字符串转数组
    • 字符串中的数组转列表
      • 转整数列表
    • 读数据,然后画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()  # 显示

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/579381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能工厂 | 联合汽车电子有限公司汽车驱动科技上海智能工厂

智能制造是我国加快建设制造强国的主攻方向&#xff0c;是上海城市数字化转型的重要抓手。智能工厂是推动智能制造的切入点和突破口&#xff0c;是制造业数字化转型的重要载体&#xff0c;以智能工厂为载体布局新赛道、触发新动能、带动新终端&#xff0c;从而实现制造业高质量…

scanf读取字符数组的注意点

起因&#xff1a;scanf的%c格式可以读取空格和回车 读取中间无空格隔开的二维字符数组时 #include<bits/stdc.h> using namespace std; char mp[10][10]; signed main() {for(int i1;i<3;i){for(int j1;j<3;j){scanf("%c",&mp[i][j]);}getchar();/…

Zookeeper集群 + Kafka集群

Zookeeper 概述 Zookeeper 定义 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 Zookeeper 工作机制 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储和管理大家都关心的…

液体压强、浮力与密度分析

如图所示&#xff0c;将甲、乙两个容器放在水平桌面上&#xff0c;甲、乙两容器的底面积为S甲&#xff0c;S乙&#xff0c;甲容器中盛有密度为p1的液体&#xff0c;乙容器中盛有密度为p2的液体。现将体积相等的A、B两个物体分别放入甲、乙两容器后&#xff0c;物体A悬浮&#x…

学习TypeScript快速入门

&#x1f341; 作者主页&#xff1a;&#x1f496;仙女不下凡&#x1f496; &#x1f341; 前言介绍&#xff1a;以下&#x1f447; 内容是根据“阿宝哥”的教材自学总结&#xff0c;定期更新欢迎持续关注&#xff01; &#x1f341; 学习前提&#xff1a;学习该文章之前需要…

数据在内存中的存储(1)——整形

目录 1、数据类型介绍 1.1、类型的基本归类 整形家族 浮点数家族 指针类型 空类型 构造类型 2、整形在内存中的存储 2.1、原码、反码、补码 2.2、大小端介绍 2.3、有符号与无符号 2.4、练习 例一 例二 例三 例四 例五 1、数据类型介绍 我们先来简单了解一下我们前面所学的基…

【腾讯云Finops Crane集训营】降本增效之 Crane 初体验

1. Crane 初识2. Crane 如何进行成本优化&#xff1f;3. Crane 快速上手体验3.1 安装 Prometheus 和 Grafana3.2 安装 Crane 和 Fadvisor3.3 验证安装是否成功3.4 访问 Dashboard 4. Crane 初体验 - 总结&建议5. 关于腾讯云 Finops Crane 集训营 最近有幸参加了腾讯云 Fino…

新星计划【Java微服务+云原生】赛道开启!

前排提醒&#xff1a;这里是新星计划2023【微服务云原生】学习方向的报名入口&#xff0c;一经报名&#xff0c;不可更换。 ↓↓↓报名入口&#xff1a;新星计划2023【微服务云原生】学习方向报名入口&#xff01;-CSDN社区 一、关于本学习方向导师 博客昵称&#xff1a;鹤冲…

opengl灯光基础:2.1 光照基础知识

光照&#xff1a; 光照以不同的方式影响着我们看到的世界&#xff0c;有时甚至是以很戏剧化的方式。当手电筒照射在物体上时&#xff0c;我们希望物体朝向光线的一侧看起来更亮。我们所居住的地球上的点&#xff0c;在中午朝向太阳时候被照得很亮&#xff0c;但随着地球的自转…

【使用VS开发的第一个QT项目——实现相机功能(包括QT下载、配置、摄像头程序)】

使用VS开发的第一个QT项目 一、QT(WIN10)安装1.首先下载QT(VS有对应的QT)2.安装QT 二、将QT加载到VS中三、QT设置1.在VS"Qt Vs Tools"→"QT Versions"中添加"msvc2017_64"qmake的路径2.在"General"→"QT Designer"中将"…

克里金插值(Kriging)在MATLAB中的实现【优化】

该部分是基于克里金插值&#xff08;Kriging&#xff09;在MATLAB中的实现&#xff08;克里金工具箱&#xff09;&#xff0c;由于在运行过程中有部分问题&#xff0c;基于此做的一些理解优化。 工具箱的下载见上面的链接&#xff0c;其提供了工具箱。 clc clearload(data_kr…

服务(第三十二篇)nginx做缓存服务器

nginx作为缓存服务配置语法 1、proxy_cache_path 配置语法&#xff08;即缓存路径配置语法&#xff09; Syntax&#xff1a;proxy_cache_path path [levelslevels] [use_temp_pathon|off] keys_zonename:size [inactivetime] [max_sizesize] [manager_filesnumber] [manager_s…

python爬虫笔记

Python爬虫笔记 一. Urllib 1. 基础请求 指定url请求返回值解码返回结果的一些操作 import urllib.request as req # 定义一个url url http://www.baidu.com# 发送请求获得相应 res req.urlopen(url)# read返回字节形式的二进制数据,需要用指定编码来解码 content res.r…

Allure测试报告定制全攻略,优化你的Web自动化测试框架!

目录 前言&#xff1a; 1. Allure测试报告简介 2. Web自动化测试框架简介 3. 封装Web自动化框架 3.1 安装Selenium 3.2 封装Selenium 3.3 定制Allure测试报告 3.3.1 适配翻译插件 3.3.2 定制测试报告样式 4. 示例代码 5. 总结 前言&#xff1a; 随着现在Web应用的普…

【特征选择】基于二进制粒子群算法的特征选择方法(PNN概率神经网络分类)【Matlab代码#33】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 特征选择问题2. 二进制粒子群算法3. 概率神经网络&#xff08;PNN&#xff09;分类4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&…

day42_jsp

今日内容 零、 复习昨日 一、JSP 二、EL 三、JSTL 四、MVC 零、 复习昨日 一、JSP 1.0 引言 现有问题 在之前学习Servlet时&#xff0c;服务端通过Servlet响应客户端页面&#xff0c;有什么不足之处&#xff1f; 开发方式麻烦&#xff1a;继承父类、覆盖方法、配置Web.xml或注…

8.3:加强堆的应用

8.3&#xff1a;加强堆的应用 题目要求&#xff1a; 做一个加强堆的题目&#xff0c;给定一个整型数组&#xff0c;int[] arr&#xff1b;和一个布尔类型数组&#xff0c;boolean[] op 两个数组一定等长&#xff0c;假设长度为N&#xff0c;arr[i]表示客户编号&#xff0c;op…

【程序人生】上海城市开发者社区小聚有感

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

shell脚本入门-编写格式以及执行方式

Shell介绍 通过编写shell命令发送给linux内核去执行&#xff0c;操作就是计算机硬件&#xff0c;所以Shell命令是用户操作计算机硬件的桥梁 Shell是命令&#xff0c;类似与windows系统的Dos命令 Shell是一门程序设计语言&#xff0c;shell里面含有变量&#xff0c;函数&#xf…

低代码助力企业数字化转型:构建高效业务系统的新选择

在当今数字化时代&#xff0c;企业数字化转型已经成为业界的热门话题。随着全球各大企业逐渐意识到数字化转型的重要性&#xff0c;越来越多的公司开始采用低代码开发平台作为数字化转型的工具&#xff0c;以低成本高效率构建业务系统&#xff0c;实现数字化转型。 但现实情况是…