基于Matplotlib的模型性能可视化工作

news2024/11/17 3:00:30

一、项目简介

本项目是科技考古墓葬识别工作的中间过程,因为需要大量复用所以另起一章好了。

主要涉及到数据读取、数据可视化和少量的数据处理过程。

二、相关知识

  • Pandas
  • Matplotlib

三、实验过程

1. 数据探索性分析

1.1 准备工作–导入模块
import pandas as pd
import os
import numpy as np 
import matplotlib.pyplot as plt
1.2 数据预处理

我们首先构建一个色彩映射表,这个表将由一组自定义的颜色条构成,并且对应一个索引值,以便我们按照强度自定义生成绘图颜色。

可以在网址 上对你想要的颜色生成色度条。

colorMap=dict(zip(range(len(ModelMap),-1,-1),[
     "#d16ba5",
    "#c777b9", 
    "#ba83ca", 
    "#aa8fd8", 
    "#9a9ae1", 
    "#8aa7ec",
    "#79b3f4",
    "#69bff8",
    "#52cffe",
    "#41dfff", 
    "#46eefa", 
    "#5ffbf1"
]))

这个优势在于手动调整,不想怎么做可以使用各种可视化模块里自带的色彩映射cmap

然后就是将训练的模型信息输入到一个字典中,这里k,v值分别是模型名称、(模型参数量,模型平均精度)。

ModelMap={
    "YOLOv5-n":[1.9,0.7],
    "YOLOv5-s":[7.2,0.782],
    "YOLOv5-m":[21.2,0.777],
    "YOLOv5-l":[46.5,0.746],
    "YOLOv5-x":[86.7,0.768],
    "YOLOv8-n":[3.2,0.764],
    "YOLOv8-s":[11.2,0.813],
    "YOLOv8-m":[25.9,0.7],
    "YOLOv8-l":[43.7,0.7],
    "YOLOv8-x":[68.2,0.7]
}

我们想要将模型参数量从小到大排布,以便确定最优性能,那么可以使用sort方法进行排序:

newSort=list(ModelMap.items())
newSort.sort(key=lambda x:x[1][1],reverse=True)

这里面的reverse=True表示降序排序,这里等于是以模型的精度进行排序。注意lambda表达式,:前表示输入,后表示返回值。

结果应该如下所示。

[('YOLOv8-s', [11.2, 0.813]),
 ('YOLOv5-s', [7.2, 0.782]),
 ('YOLOv5-m', [21.2, 0.777]),
 ('YOLOv5-x', [86.7, 0.768]),
 ('YOLOv8-n', [3.2, 0.764]),
 ('YOLOv5-l', [46.5, 0.746]),
 ('YOLOv5-n', [1.9, 0.7]),
 ('YOLOv8-m', [25.9, 0.7]),
 ('YOLOv8-l', [43.7, 0.7]),
 ('YOLOv8-x', [68.2, 0.7])]

2. 可视化

为了更加直观的比较模型性能,我们选择采用二维散点图进行绘制。在此过程中,采用不同的颜色和尺寸可以让结果更加清晰直观。因此,我们选择了颜色和尺度两个额外维度,辅助可视化过程。

首先是获取尺度信息,这里采用的归一化缩放,为了让数据区间更加美观,选择采用np.clip(n,a,b)方法将数据区间变成(a,b),并执行相应的放缩。

def getScale(x,k=9.5):
    return np.clip(((x-min(y))/(max(y)-min(y))),0.15,0.95)*k
2.1 绘制散点图

还记得我们之前构建的自定义色度条吗,现在我们将结合色度条和尺度信息来绘制散点图。

# 首先是设置好 Figure 大小
# 在matplotlib中,绘图将基于 figure canvas axis 进行
plt.figure(figsize=(16,8))

for i,(k,v) in enumerate(newSort):
	# label 表示标签
	# s表示尺寸信息
	# c表示色彩信息
	# alpha表示透明度通道信息
	plt.scatter(v[0],v[1],c=colorMap[i],label=k,s=getScale(v[1])**2*np.pi,alpha=1)

# 添加行列标签
plt.ylabel("AP")
plt.xlabel("Parameters (M)")

# 在右上显示图例
plt.legend(loc='upper right')
# 设置标题
plt.title("AP-Params of different Model structures")

# 设置 xaxis 范围
plt.xlim(0,120)
# 设置格网信息
plt.grid(alpha=0.1,linestyle="--")

for i,j in zip(x,y):
	# 标记,用的是annotate 方法
	# plt.annotate(text,loc,xytext,textcoords,ha)
	# 常用参数 text表示文本信息 loc表示坐标点位置
	# xytext表示文本偏移量 textcoords表示文本以什么为坐标
	# ha表示文本显示位置,一般这组参数可以不动,即
	
	# xytext=(0,10),textcoords="offset points",ha='center'
    plt.annotate("%s"%j,(i,j),xytext=(0,10),textcoords="offset points",ha='center')
plt.savefig(r"new.jpg")
    
plt.show()

在这里插入图片描述

此时图像如图所示,为了将同一类模型归类,我们还可以采用折线图进行辅助。

2.2 绘制折线图
for i,j in ModelMap.values():
    x.append(i)
    y.append(j)

plt.plot(x[:5],y[:5],label="YOLO-v5",linestyle=':',alpha=0.5)
plt.plot(x[5:],y[5:],label="YOLO-v8",linestyle=':',alpha=0.5)

结果如图所示:

在这里插入图片描述

2.3 绘制模型过程性参数

在本阶段,我们需要做的需求为: 将训练过程中的精度、召回率以及mAP:0.5,mAP:0.5:0.95进行可视化。

可简要拆解为以下过程:

  • 读取相关csv文件
  • 构建文件映射,并且将每30epoch进行平均
  • 基于matplotlib绘制
  • 基于pyecharts进行绘制

为了方便读取csv文件,我们可以用os.listdir方式快速获取某一路径下的所有子文件,这个方法常常结合寻找后缀来用,譬如:

[i for i in os.listdir(path) if i.endswith('.csv')]

这里我们有两个大文件夹,先获取其路径:

yolov5=r"C:\Users\Administrator\Desktop\Train_Res\YOLO_V5"
yolov8=r"C:\Users\Administrator\Desktop\Train_Res\YOLO_V8"

然后构建csv文件列表:

data_list=[os.path.join(yolov5,i) for i in os.listdir(yolov5) if i.endswith('.csv')]+[os.path.join(yolov8,i) for i in os.listdir(yolov8) if i.endswith('.csv')]

与上述方法相同,当路径较多时,可写成迭代器形式。

接下来就是确定模型名称+csv文件了,用的是pd.read_csv,这里如果出现中文,可能需要加上pd.read_csv(encoding="utf-8")

dataMap={}
for i in data_list:
    fir,sec=i.find("_V")+2,i.find(".c")-1
    dataMap[f"yolov{i[fir]}_{i[sec]}"]=pd.read_csv(i)

注意这样的写法不具有泛用性,甚至改个位置就会报错,但是确实很快

查看我们的结果:

dataMap.keys()

# dict_keys(['yolov5_l', 'yolov5_m', 'yolov5_s', 'yolov5_x', 'yolov8_n', 'yolov8_s'])

已经拿到数据了,然后就是看看读取到的结果咋样:

dataMap['yolov5_x'].head()

在这里插入图片描述

成功。

下面来构造数据,由于有些模型采用了剪枝,在100epoches不收敛的情况下自动终止训练,所以数据的长度不一致。我们可以取其中最短的进行分析,不过这里用了360epoches。

请注意,确定你的模型在区间 U ( δ ) U(\delta) U(δ)内是陷入了局部最优解的,否则没有比较意义。

x=[i for i in range(0,360,15)]
# 获取列名
col=dataMap['yolov5_x'].columns

由于有多组参数需要比较,出于复用性考虑,我们采用函数的方式进行绘制:

def plotValue(idx,reset=None,ws=15):
    plt.figure(figsize=(20,8))
    for k,v in dataMap.items():
        v=v.iloc[:,idx]
        # 此时的平滑窗口是15
        plt.plot(x,[sum(v[i*ws:i*ws+ws])/ws for i in range(360//ws)],label=k)
    plt.xlabel("epoches")
    ylab=col[idx] if not reset else reset
    plt.ylabel(ylab)
    plt.title(f"{ylab} variation of different models")
    plt.legend()
    return plt

调整参数ws 即可获得在不同大小的滑动窗口下的平均值。reset 支持自己改名称,这都没啥

来看看结果:

plotValue(4,"Precision").show()
plotValue(5,"Recall").show()
plotValue(6,"mAP_0.5").show()
plotValue(7,"mAP_0.5:0.95").show()

在这里插入图片描述

看一个就好了。

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

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

相关文章

考研入门55问---基础知识篇

考研入门55问---基础知识篇 01 >什么是研究生入学考试? 研究生是指大专和本科之后的深造课程。以研究生为最高学历, 研究生毕业后,也可称研究生,含义为研究生学历的人。在中国大陆地区,普通民众一般也将硕士毕业生称…

JavaSE基础小知识Ⅱ(很容易错!!!)

1. 变量被final修饰后不能再指向其他对象,但可以重写 如果是引用变量被final修饰,那么的确如此; 基本变量不能重写 2. 下列代码的输出结果是? public class Test {static {int x 5; }static int x,y; public static void ma…

conan2 基础入门(01)-介绍

conan2 基础入门(01)-介绍 文章目录 conan2 基础入门(01)-介绍⭐什么是conan官网Why use Conan? ⭐使用现状版本情况个人知名开源企业 ⭐ConanCenter包中心github ⭐说明文档END ⭐什么是conan 官网 官网:Conan 2.0: C and C Open Source Package Manager 一句话来…

【Linux:lesson1】的基本指令

🎁个人主页:我们的五年 🔍系列专栏:Linux课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🚗打开Xshell,登陆root…

个人网站快速搭建手册:低成本,高效率,轻松发布

​🌈个人主页:前端青山 🔥系列专栏:React篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来-快速构建个人站|博客|系统,低成本发布上线 目录 前言 博主主页搭建案例 虚拟主机|服务器|域名 使用免费二级…

python实现九宫格图片切割

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.分析 一.前言 朋友圈九宫格是一种在社交媒体上展示图片或内容的常见布局方式,特别是在微信朋友圈中非常流行。这种布局由九个相同大小的格子组成,通常用于展示一组相关的图片或内容。&…

线程知识点

一、线程 1.定义 线程:是一个进程并发执行多种任务的机制。 串行:多个任务有序执行,一个任务执行完毕后,再去执行下一个任务 并发:多个任务在单个CPU上运行,同一个时间片上只能运行一个任务,c…

数据的均匀化分割算法(网格划分法、四叉树法(含C++代码))

数据的均匀化分割主要是指在分割过程中尽可能均匀地将数据点分布在各个子区域中,以保持数据分布的平衡和优化数据结构的性能。以下是几种可以实现数据均匀化分割的方法: 一. 网格划分法 1. 基本概念 虽然传统的网格划分法不是动态调整的,但通…

软件验收计划书-验收规程(Word原件)

编写软件验收计划是软件开发过程中的一个关键步骤,其重要性体现在以下几个方面: 明确验收标准:软件验收计划详细列出了验收的标准、测试方法、测试环境等,确保所有相关人员对验收的期望和要求有清晰的认识。这有助于避免在验收阶段…

Ansible---自动化运维工具

一、Ansible概述 1.1 Ansible简介 Ansible是一款自动化运维工具,通过ssh对目标主机进行配置、应用部署、任务执行、编排调度等操作。它简化了复杂的环境管理和自动化任务,提高了工作效率和一致性,同时,Ansible的剧本(playbooks)…

centos7.9升级4.19内核

centos默认的内核版本是3.10 通过命令 uname -a 输出系统的详细信息 在部署k8s集群时使用默认的3.10版本的内核,容易出各种奇奇怪怪的问题、可以理解为docker和k8s与该内核版本不兼容,所以在部署k8s集群时,务必要升级内核,这里…

【论文笔记 | 异步联邦】FedSA

FedSA:一种处理 non-IID 数据 的 过时感知 异步联邦算法 1. 论文信息 FedSA:A staleness-aware asynchronous Federated Learning algorithm with non-IID data,Future Generation Computer Systems,2021.7,ccfc 是…

即插即用篇 | YOLOv8引入局部自注意力 HaloAttention | 为参数高效的视觉主干网络扩展局部自注意力

本改进已集成到 YOLOv8-Magic 框架。 我们提出了Axial Transformers,这是一个基于自注意力的自回归模型,用于图像和其他组织为高维张量的数据。现有的自回归模型要么因高维数据的计算资源需求过大而受到限制,要么为了减少资源需求而在分布表达性或实现的便捷性上做出妥协。相…

05-10 周五 FastBuild 容器启动引起超时问题定位与解决

05-10 周五 FastBuild 容器启动超时问题 时间版本修改人描述2024年5月11日16:45:33V0.1宋全恒新建文档2024年5月11日22:37:21V1.0宋全恒完成解决方案的撰写,包括问题分析,docker命令 简介 关于FastBuild的优化,已经撰写了多个博客&#xff0…

C#知识|无边框的WinForm窗体,如何拖动位置?

哈喽,你好啊,我是雷工! 上一节时练习做了一个简单的登录窗体界面,为了美观设置成了无边框, 当运行起来,发现无边框的窗体无法用鼠标拖动位置, 本节记录通过添加代码实现无边框窗体实现移动&…

IDEA创建springboot项目时不能选择java 8或者java 11等等版本的问题,解决方案

文章目录 1. Project JDK 和 Java 的区别2. 没有 java 8 或 java 11 等版本2.1 方案一2.2 方案二2.3 方案三 1. Project JDK 和 Java 的区别 我们在利用 idea 创建 spring boot 项目时,会有以上两个选项,这两个选项有什么区别? 答&#xff…

二、jacoco代码覆盖率工具

jacoco代码覆盖率工具 一、jacoco介绍二、常见的java代码覆盖率工具三、为什么选择jacoco四、jacoco的特点五、Jacoco 支持的覆盖率指标六、那些暂未支持的覆盖率指标七、jacoco技术原理八、Jacoco 下载与配置九、jacoco主要文件十、jacoco使用流程 一、jacoco介绍 JaCoCo 是一…

【GESP】2023年12月图形化二级 -- 小杨报数

小杨报数 【题目描述】 小杨需要从 1 1 1到 N N N报数。在报数过程中,小杨希望跳过 M M M的倍数。例如,如果 N 5 N5 N5, M 2 M2 M2,那么小杨就需要依次报出 1 1 1, 3 3 3, 5 5 5。 默认小猫角色和白色背…

LED液晶显示屏(LCD/TFT)抗干扰太阳光模拟器

LED&液晶显示屏(LCD/TFT)抗干扰太阳光模拟器:解决驾驶员视线问题 在驾车过程中,太阳光的干扰是一个常见的问题。特别是在高速公路等需要高度集中注意力的情况下,太阳光的干扰会严重影响驾驶员的视线,增加驾驶风险。为了解决这…

eNSP中小型园区网络拓扑搭建(上)

→b站直通车,感谢大佬← →eNSP中小型园区网络拓扑搭建(下)← 不带配置命令的拓扑图已上传~ 项目背景: 某公司准备新建一张网络供企业办公使用。写字楼共3层,一层会客大厅、二层行政部及市场部、三层研发部。一层设…