Python读取txt文件画Loss曲线图---txt文件转xls文件---xls文件转txt文件--xml文件转txt文件
任务1- 读取.txt文件画折线图(曲线图)
任务2- 将.txt文件转换成.xls(excel)文件
任务3- 将.xls(excel)文件转换成.txt文件
任务4- 读取.txt文件画折线图(曲线图)
任务5- xml格式的数据集标签文件转.txt文件
任务6- 读取两个.txt文件画折线图(曲线图)
最近在做目标检测的任务,但是由于自己训练的损失函数不是自己想要的,但是自己的程序在训练的时候每个EpochEpochEpoch都会生成一个模型的损失数值,所以想根据这些数值自己画图。
任务1:根据txttxttxt文件内的数值,生成损失曲线。
txttxttxt文件内的数据样例如下图所示:
因为我的模型训练了150次,所以这样的数据有150个,且只有一列。直接在代码里详细叙述:
#导入必须的包
import matplotlib.pyplot as plt
import numpy as np
#----------- 打开txt文件 ----------
file = open('YOLOV4.txt')
#----------- 逐行读取文件内的数据 ------------
data = file.readlines()
#----------- 根据自己的需要查看data的内容 ---------
#print(data)
'''
txt文件的数值为y轴的数据
所以x要根据y的个数有序生成
'''
#------ x轴数据有序生成150个(根据自己的横坐标范围自己修改范围) ----
x = np.arange(0,150)
#---------- 新建一个空的列表,用于存储上一步逐行读取的data ------------
y = []
#---------- 用循环的方式添加进列表 -----------
for num in data:#------split用于将每一行数据用逗号分割成多个对象-----#------取分割后的第0列,转换成float格式后添加到列表中-------y.append(float(num.split(',')[0]))
#--------------- 输出图 ----------------------
#--------- 可以理解为在图上加载x和y的数据 label为关于x和y曲线的标签------------
pic = plt.plot(x,y,label='Yolov4')
#--------- x轴的小标题 -------------
plt.xlabel('Epoch')
#--------- y轴的小标题 -------------
plt.ylabel('Loss')
#--------- 整个图的标题 ----------
plt.title('yolov4-loss')
plt.legend()
plt.show()
代码关于画图的每个细节写的很详细,下面生成的折线图。
任务2- 将.txt文件转换成.xls(excel)文件
需要的同学直接复制代码,代码中注释了你需要修改的地方。
import xlwt
def txt_xls(filename, xlsname):try:f = open(filename, 'r', encoding='utf-8')xls = xlwt.Workbook()sheet = xls.add_sheet('sheet1', cell_overwrite_ok=True)x = 0while True:# 按行循环,读取文本文件line = f.readline()if not line:breakfor i in range(len(line.split('\t'))):item = line.split('\t')[i]sheet.write(x, i, item)x += 1f.close()# 保存xls文件xls.save(xlsname) except:raise
'''
下面的地址中就是自己根据自己的需要修改的地方
为什么看上去没有路径呢?因为我是把txt文件和运行的此程序放在了同一个文件夹中
所以生成的.xls文件也在同级文件下,也就是他们在同一个文件夹中
如果你没放在一起,建议使用E://Path//...
'''
if __name__ == "__main__":#---------- 需要转化的.txt文件 -----------filename = "YOLOV4.txt" #---------- 转换后的.xls文件名 -----------xlsname = "YOLOV4.xls" # 保存及命名txt_xls(filename, xlsname)
任务3- 将.xls(excel)文件转换成.txt文件
将.xls.xls.xls文件转换成.txt.txt.txt文件。
python
import pandas as pd
#---------- 如果你的.xls文件开了多个窗口文件(sheet1,sheet2,sheet3....)使用下面的代码 -----------
#df = pd.read_excel('YOLOV4.xls', sheet_name='Sheet1',header=None)
#---------- 如果你的.xls文件没有开多个窗口(没有sheet1,sheet2,sheet3....)试用下面的代码
data = pd.read_excel('YOLOV4.xls', sheet_name='Sheet1',header=None)
print('正在读取将.xls文件内容')
#---------- 写入txt文件,seq表示逗号分隔 --------------
data.to_csv('YOLOV4.txt', header=None, sep=',', index=False)
print('.xls文件转换成.txt文件成功')
任务4- 读取.txt文件画折线图(曲线图)
该任务算是任务一的进阶版,通过文件数据的转换,我的.txt.txt.txt文件的内容不再是一列,而是两列,第一列为序号,第二列为数值,基于此种情况,读取.txt.txt.txt文件,将其以折线图(曲线图)表示出来。
下图是我现在.txt.txt.txt数据的图例。
可以发现和任务一数据唯一不同就是多了一列的序列号,下面的是基于任务一改进的,就是改了几行,修改后的内容以注释的形式保存。话不多说直接代码中详细介绍:
#导入必须的包
import matplotlib.pyplot as plt
import numpy as np
#----------- 打开txt文件 ----------
file = open('file2.txt')
#----------- 逐行读取文件内的数据 ------------
data = file.readlines()
#----------- 根据自己的需要查看data的内容 ---------
#print(data)
'''
txt文件的数值为y轴的数据
所以x要根据y的个数有序生成
'''
#------ x轴数据有序生成150个(根据自己的横坐标范围自己修改范围) ----
#x = np.arange(0,150)
#---------- 新建一个空的列表,用于存储上一步逐行读取的data ------------
x = []
y = []
#---------- 用循环的方式添加进列表 -----------
for num in data:#------split用于将每一行数据用逗号分割成多个对象-----#------x读取data数据的第一列(也就是序列号)x.append(float(num.split(',')[0]))#------取分割后的第0列,转换成float格式后添加到列表中-------#------y读取data数据的第二列(也就是数值)y.append(float(num.split(',')[1]))
#--------------- 输出图 ----------------------
#--------- 可以理解为在图上加载x和y的数据 label为关于x和y曲线的标签------------
pic = plt.plot(x,y,label='Yolov4')
#--------- x轴的小标题 -------------
plt.xlabel('Epoch')
#--------- y轴的小标题 -------------
plt.ylabel('Loss')
#--------- 整个图的标题 ----------
plt.title('yolov4-loss')
plt.legend()
plt.show()
下面是得到的折线图(曲线图),和任务一得到的一模一样。
任务5- xml格式的数据集标签文件转.txt文件
在做目标检测任务时,我们手工打的标签往往都是.xml的文件,但是对于很多的网络,标签文件都需要.txt的文件,所以需要将.xml文件转换成模型需要的.txt文件,直接下面的代码可以转换:
#------------------------------- successful ----------------------------------
import os
import xml.etree.ElementTree as ET
from decimal import Decimal
#------------------------- xml文件夹路径 ----------------------------
dirpath = 'E:\\pycharm\\py_shiyancode\\LYD-Champion-Function\\xml_origan'
#---------------------- 转换后的txt文件夹路径 ----------------------
newdir = 'E:\\pycharm\\py_shiyancode\\LYD-Champion-Function\\txt' if not os.path.exists(newdir):os.makedirs(newdir)
for fp in os.listdir(dirpath):root = ET.parse(os.path.join(dirpath, fp)).getroot()xmin, ymin, xmax, ymax = 0, 0, 0, 0sz = root.find('size')width = float(sz[0].text)height = float(sz[1].text)filename = root.find('filename').textprint(fp)with open(os.path.join(newdir, fp.split('.')[0] + '.txt'), 'a+') as f:for child in root.findall('object'): # 找到图片中的所有框sub = child.find('bndbox') # 找到框的标注值并进行读取sub_label = child.find('name')xmin = float(sub[0].text)ymin = float(sub[1].text)xmax = float(sub[2].text)ymax = float(sub[3].text)try: # 转换成yolov的标签格式,需要归一化到(0-1)的范围内x_center = Decimal(str(round(float((xmin + xmax) / (2 * width)), 6))).quantize(Decimal('0.000000'))y_center = Decimal(str(round(float((ymin + ymax) / (2 * height)), 6))).quantize(Decimal('0.000000'))w = Decimal(str(round(float((xmax - xmin) / width), 6))).quantize(Decimal('0.000000'))h = Decimal(str(round(float((ymax - ymin) / height), 6))).quantize(Decimal('0.000000'))print(str(x_center) + ' ' + str(y_center) + ' ' + str(w) + ' ' + str(h))# 读取需要的标签if sub_label.text == 'armor':f.write(' '.join([str(0), str(x_center), str(y_center), str(w), str(h) + '\n']))except ZeroDivisionError:print(filename, '的 width有问题')
任务6- 读取两个.txt文件画折线图(曲线图)
由于技术有限,只能使用最笨的方式读取每个文本的数据,然后再逐个遍历文本中的内容,将其添加进入列表内,然后画图,方法不是最优的,但是结果没问题。由于我没有之前的损失函数的文件了,所以自己手动添加进入文件几个数,作为教程。
这里需要注意:
- 如果你的txttxttxt文本数据内只有一列,且这一列就是你要绘制图的yyy数值,则只需要将以下代码中的y1y1y1直接读取第000列就可以了,y2y2y2也同理,读取第000列(1默认为第2例)。至于xxx,你只需要根据y的个数生成1−−len(y1)1--len(y1)1−−len(y1)的数就可以画图了。(下面就是txttxttxt文本数据内的内容,仅作为参考)
- 保持y1y1y1的个数与y2y2y2的个数一致,不然会超出xxx坐标的范围
import matplotlib.pyplot as pltif __name__== '__main__':# ----------- 打开txt文件(路径一定要修改成自己的路径) ----------file1 = open('./dataloader_experience/1.txt')file2 = open('./dataloader_experience/2.txt')# ----------- 逐行读取文件内的数据 ------------data1 = file1.readlines()data2 = file2.readlines()# ----------- 根据自己的需要查看data的内容 ---------# print(data)'''txt文件的数值为y轴的数据所以x要根据y的个数有序生成'''# ------ x轴数据有序生成150个(根据自己的横坐标范围自己修改范围) ----# x = np.arange(0,150)# ---------- 新建一个空的列表,用于存储上一步逐行读取的data ------------x1 = []y1 = []y2 = []# ---------- 用循环的方式添加进列表 -----------for num1 in data1:# ------split用于将每一行数据用逗号分割成多个对象-----# ------x读取data数据的第一列(也就是序列号)#-------建议以float类型添加,因为得到的损失值,一般都为小数x1.append(float(num1.split(',')[0]))# ------取分割后的第0列,转换成float格式后添加到列表中-------# ------y读取data数据的第二列(也就是数值)y1.append(float(num1.split(',')[1]))for num2 in data2:y2.append(float(num2.split(',')[1]))# --------------- 输出图 ----------------------# --------- 可以理解为在图上加载x和y的数据 label为关于x和y曲线的标签------------# 根据需求变换线的格式和颜色plt.plot(x1, y1,label= 'yolov4_loss2')plt.plot(x1, y2, color='red', linestyle='--',label = 'yolov4_loss1')# --------- x轴的小标题 -------------plt.xlabel('Epoch')# --------- y轴的小标题 -------------plt.ylabel('Loss')# --------- 整个图的标题 ----------plt.title('yolov4-loss')plt.legend()plt.show()
结果图如下
总结:
- 如果你的数据是.txt.txt.txt文件,数据只有一列,那么任务一就可以解决你的问题
- 如果你有.xls.xls.xls格式的文件,你可以通过任务三将其转换成.txt.txt.txt文件,然后通过任务一或者四解决你的问题
- 如果你将.txt.txt.txt文件转换成.xls.xls.xls文件,任务二可以解决你的问题
- 如果你将.xml.xml.xml文件转换成.txt.txt.txt文件,任务五可以解决你的问题
如果对您有用,不妨点个赞吧
Python读取txt文件画Loss曲线图---txt文件转xls文件---xls文件转txt文件--xml文件转txt文件相关推荐
- python绘制蝴蝶_python画蝴蝶曲线图的实例
蝴蝶曲线是由Temple H·Fay发现的可用极坐标函数表示的蝴蝶曲线. 由于此曲线优美, 因此就想把它作为博客favicon.ico,这里我使用pytho matplotlib.pyplot包来绘制 ...
- python读取csv数据画直方图_用csv文件作为inpu在python中绘制直方图
我有一个csv文件,其中包含两列,第一列是水果名,第二列是计数,我需要绘制直方图使用这个csv作为输入到下面的代码.我怎样才能做到.我只需要显示前20个条目,其中水果名称将是x轴,计数将是y轴从整个c ...
- python读取csv数据画直方图_用python绘制直方图
其实,学习数据分析,excel可以完成绝大多数的工作,只是课程中@tiger是用python做的,而且最近自己也在学习编程,所以就挑战一下新东西,学学用python做作业,感谢@余欣 的教程,让我一个 ...
- python读取csv数据画直方图_Python数据可视化(Pygal、svg、csv、Bar、Line)
一.pygal(图表类型Bar) 将使用Python可视化包Pygal来生成可缩放的矢量图形文件 pygal官方文档:[www.pygal.org/en/stable/](http://www.pyg ...
- python读取csv数据画直方图_python 中直方图绘制
一.直方图绘制参数详解 1.plt.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom= ...
- 使用python读取excel进行处理,并将结果存储在新的excel
使用python读取excel进行处理,并将结果存储在新的excel 生活所需,领导安排整理出一些文件,整了一个小时才几个快累趴了,手也快抽筋了.网上都说python可以很简单的处理办公文件,想让py ...
- python读取数据画三维图_Python实现读取txt文件并画三维图
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- python删除重复值所在的行数_使用python读取txt文件的内容,并删除重复的行数方法...
注意,本文代码是使用在txt文档上,同时txt文档中的内容每一行代表的是图片的名字. #coding:utf-8 import shutil readDir = "原文件绝对路经" ...
- python读取txt文件并画图
1,使用python读取txt文件 已知txt文件内容如下: 0 01 12 43 94 165 256 36 请以第一列为x轴,第二列为y轴画图 步骤如下: 1)使用readlines读取文件 2) ...
最新文章
- struts 页面取值问题
- linux挂载一个新的硬盘
- 1.7 Character类
- windows下python虚拟环境virtualenv安装和使用(亲测)
- 2015山东春考计算机分数排名,2015-2017年山东春季高考分数线.docx
- 选轻量应用服务器or云服务器ECS?一图帮你彻底区分
- (34)System Verilog类的多对象详解
- 基于JAVA+SpringBoot+Mybatis+MYSQL的足球联赛管理系统
- 完工任务不允许更改需求
- Shanda EZ Mini
- 数据分类分级指南数据服务分类类目表
- 软件质量应该如何保证?针对不同情况,项目各部门人员应如何保证软件质量?
- TP5.0Composer安装phpQuery
- excel透视表——制作动态饼图
- 数据中台在企业数字化转型中的践行(下篇)
- 数据中心为什么需要大二层网络
- ubuntu计算机名用户名,修改ubuntu的用户名(注意用户名和主机名的区别)
- 计算机怎么升级64位操作系统,32位系统怎么升级64位系统
- 从此开始,改头换面,重新做人
- 500错误及服务器内部错误