Python更改YOLOv5、v7、v8,实现调用val.py或者test.py后生成pr.csv,然后再整合绘制到一张图上(使用matplotlib绘制)

1. 前提 + 效果图

  • 不错的链接:YOLOV7训练模型分析

  • 关于map的绘图、loss绘图,可参考:根据YOLOv5、v8、v7训练后生成的result文件用matplotlib进行绘图

  • v5、v8调用val.py,v7调用test.py(作用都是一样的,都是用已训练好权重对测试集进行验证,然后打印出一系列指标)

-实现效果:就是将运行val.py/test.py后生成的PR_curve.png中最粗的蓝线整合到同一张图中

在这里插入图片描述

同理,可以实现F1_curve.png绘图

在这里插入图片描述

2. 更改步骤

2.1 得到PR_curve.csv和F1_curve.csv

2.1.1 YOLOv7的更改

2.1.1.1 得到PR_curve.csv

utils/metrics.py中,按住Ctrl+F搜索def plot_pr_curve定位过去,然后如图做更改:

在这里插入图片描述

# Plots ----------------------------------------------------------------------------------------------------------------def plot_pr_curve(px, py, ap, save_dir='pr_curve.png', names=()):# Precision-recall curvefig, ax = plt.subplots(1, 1, figsize=(9, 6), tight_layout=True)py = np.stack(py, axis=1)# lwd edit: 将结果保存在csv中pr_dict = dict()    # lwd editpr_dict['px'] = px.tolist() # lwd editif 0 < len(names) < 21:  # display per-class legend if < 21 classesfor i, y in enumerate(py.T):ax.plot(px, y, linewidth=1, label=f'{names[i]} {ap[i, 0]:.3f}')  # plot(recall, precision)pr_dict[names[i]] = y.tolist()  # lwd editelse:ax.plot(px, py, linewidth=1, color='grey')  # plot(recall, precision)ax.plot(px, py.mean(1), linewidth=3, color='blue', label='all classes %.3f mAP@0.5' % ap[:, 0].mean())# ------------------- lwd edit ---------------------- #pr_dict['all'] = py.mean(1).tolist()import pandas as pddataformat = pd.DataFrame(pr_dict)save_csvpath = save_dir.cwd() / (str(save_dir).replace('.png', '.csv')) # 定义csv文件的保存位置dataformat.to_csv(save_csvpath, sep=',')# ---------------------------------------------------- #ax.set_xlabel('Recall')ax.set_ylabel('Precision')ax.set_xlim(0, 1)ax.set_ylim(0, 1)plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left")fig.savefig(Path(save_dir), dpi=250)

生成的表格数据,共1000行数据:(PR、F1的表格长得差不多,就是数据内容不同,表头相同,行数相同)

在这里插入图片描述

2.2.1.2 得到F1_curve.csv

utils/metrics.py中,按住Ctrl+F搜索def plot_mc_curve定位过去,然后如图做更改:

在这里插入图片描述

ps: 因为在utils/metrics.py中的def ap_per_class中会 3 次调用plot_mc_curve,分别绘制F1_curve.png、P_curve.png、R_curve.png,而我只想在F1_curve.png的时候把F1值给提出来,所以我在下图代码中231处进行判断是否是在绘制F1_curve.png,不是的话运行之后就不会生成F1_curve.csv

def plot_mc_curve(px, py, save_dir='mc_curve.png', names=(), xlabel='Confidence', ylabel='Metric'):# Metric-confidence curvefig, ax = plt.subplots(1, 1, figsize=(9, 6), tight_layout=True)# -----------------lwd edit: 将结果保存在csv中--------------- ## 判断是不是绘制F1_curve曲线flag = Falseif str(save_dir).endswith('F1_curve.png'):flag = Truepr_dict = dict()    # lwd editpr_dict['px'] = px.tolist() # lwd edit# --------------------------------------------------------- #if 0 < len(names) < 21:  # display per-class legend if < 21 classesfor i, y in enumerate(py):ax.plot(px, y, linewidth=1, label=f'{names[i]}')  # plot(confidence, metric)if flag:pr_dict[names[i]] = y.tolist()  # lwd editelse:ax.plot(px, py.T, linewidth=1, color='grey')  # plot(confidence, metric)y = py.mean(0)ax.plot(px, y, linewidth=3, color='blue', label=f'all classes {y.max():.2f} at {px[y.argmax()]:.3f}')# ------------------- lwd edit ---------------------- #if flag:pr_dict['all'] = y.tolist()import pandas as pddataformat = pd.DataFrame(pr_dict)save_csvpath = save_dir.cwd() / (str(save_dir).replace('.png', '.csv')) # 定义csv文件的保存位置dataformat.to_csv(save_csvpath, sep=',')# ---------------------------------------------------- #ax.set_xlabel(xlabel)ax.set_ylabel(ylabel)ax.set_xlim(0, 1)ax.set_ylim(0, 1)plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left")fig.savefig(Path(save_dir), dpi=250)

2.1.2 YOLOv5的更改(v6.1版本)

utils/metrics.py中做与YOLOv7同样的更改

2.1.3 YOLOv8的更改(附训练、验证方式)
ultralytics-main\ultralytics\yolo\utils\metrics.py中做与YOLOv7同样的更改

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

因为有同学说按照这方式,v8中没有生成csv文件,那可以采取一下我的验证方式,看看能不能生成csv文件

  • 🍀强烈打call的博客:YoloV8的python启动
  • 注意:下面设定的值是对ultralytics\yolo\cfg\default.yaml中相应参数进行的更改,例如data、imgsz、batch...,还有很多参数可以看文件里面的注释
1.以下是我参考博客并自行设定了一些值的val_test.py及运行结果

-验证测试集的时候,这几个值最好都这么设定:split='test', batch=1, conf=0.001, iou=0.5,因为split='test'表示对测试集test进行验证(默认是对验证集val进行验证),batch=1, conf=0.001, iou=0.5是目标检测中约定俗成的

# 参考博客:https://blog.csdn.net/ljlqwer/article/details/129175087
from ultralytics import YOLOmodel = YOLO("/opt/data/private/user_LWD/train_result/yolov8s/yolov8s-best.pt")  # 权重地址results = model.val(data="ultralytics/datasets/RDD.yaml", imgsz=640, split='test', batch=1, conf=0.001, iou=0.5, name='yolov8s-from-ultralytics-main-bs1', optimizer='Adam')  # 参数和训练用到的一样

在这里插入图片描述

2.暂存一下我训练设置的train_test.py
from ultralytics import YOLO
# 参考的链接:https://blog.csdn.net/ljlqwer/article/details/129175087# 这里如果需要预权重就写你的权重文件地址,没有预权重写cfg地址,写一个就够了
# model = YOLO("yolov8n.pt")  
model = YOLO("ultralytics/models/v8/yolov8s.yaml")  model.train(data="ultralytics/datasets/RDD.yaml", epochs=300, imgsz=640, batch=32, name='yolov8s-from-ultralytics-main', optimizer='Adam')

2.2 绘制PR曲线

按照2.1得到v7、v5、v8验证后的PR_curve.csv、F1_curve.csv后,在两个函数的csv_dict中指明相应的csv位置,即可运行得到整合图(可见博客最上面的效果图)

import matplotlib.pyplot as plt
import pandas as pd# 绘制PR
def plot_PR():pr_csv_dict = {'YOLOv5m': r'F:\ChromeDown\yolov5-6.1-pruning-autodl\yolov5-6.1-pruning-autodl\runs\val\exp\PR_curve.csv','YOLOv7': r'G:\pycharmprojects\yolov7-distillation\runs\test\exp\PR_curve.csv','YOLOv7-tiny': r'G:\pycharmprojects\yolov7-distillation\runs\test\exp2\PR_curve.csv','YOLOv8s': r'G:\pycharmprojects\ultralytics-main\runs\detect\yolov8s-from-ultralytics-main-bs111\PR_curve.csv',}# 绘制prfig, ax = plt.subplots(1, 1, figsize=(8, 6), tight_layout=True)for modelname in pr_csv_dict:res_path = pr_csv_dict[modelname]x = pd.read_csv(res_path, usecols=[1]).values.ravel()data = pd.read_csv(res_path, usecols=[6]).values.ravel()ax.plot(x, data, label=modelname, linewidth='2')# 添加x轴和y轴标签ax.set_xlabel('Recall')ax.set_ylabel('Precision')ax.set_xlim(0, 1)ax.set_ylim(0, 1)plt.legend(bbox_to_anchor=(1.04, 1), loc='upper left')plt.grid()  # 显示网格线# 显示图像fig.savefig("pr.png", dpi=250)plt.show()# 绘制F1
def plot_F1():f1_csv_dict = {'YOLOv5m': r'F:\ChromeDown\yolov5-6.1-pruning-autodl\yolov5-6.1-pruning-autodl\runs\val\exp\F1_curve.csv','YOLOv7': r'G:\pycharmprojects\yolov7-distillation\runs\test\exp5\F1_curve.csv','YOLOv7-tiny': r'G:\pycharmprojects\yolov7-distillation\runs\test\exp4\F1_curve.csv','YOLOv8s': r'G:\pycharmprojects\ultralytics-main\runs\detect\yolov8s-from-ultralytics-main-bs111\F1_curve.csv'}fig, ax = plt.subplots(1, 1, figsize=(8, 6), tight_layout=True)for modelname in f1_csv_dict:res_path = f1_csv_dict[modelname]x = pd.read_csv(res_path, usecols=[1]).values.ravel()data = pd.read_csv(res_path, usecols=[6]).values.ravel()ax.plot(x, data, label=modelname, linewidth='2')# 添加x轴和y轴标签ax.set_xlabel('Confidence')ax.set_ylabel('F1')ax.set_xlim(0, 1)ax.set_ylim(0, 1)plt.legend(bbox_to_anchor=(1.04, 1), loc='upper left')plt.grid()  # 显示网格线# 显示图像fig.savefig("F1.png", dpi=250)plt.show()if __name__ == '__main__':plot_PR()   # 绘制PRplot_F1()   # 绘制F1

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

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

相关文章

基于Linux的网络防火墙设计方法

摘要 随着Internet的迅速发展&#xff0c;网络越来越成为了人们日常生活不可或缺的一部分&#xff0c;而随之引出的网络安全问题也越来越突出&#xff0c;成为人们不得不关注的问题。 为了在一个不安全的网际环境中构造出一个相对安全的环境&#xff0c;保证子网环境下的计算机…

行业分析:2023年木炭行业市场需求及发展前景

木炭是一种燃料名称。是木材或木质原料经过不完全燃烧&#xff0c;或者在隔绝空气的条件下热解&#xff0c;所残留的深褐色或黑色多孔固体燃料。木炭产品主要分为白炭、黑炭、活性炭、机制炭等四大类。 木炭是保持木材原来构造和孔内残留焦油的不纯的无定形碳。中国商代的青铜器…

【每日OJ —— 101. 对称二叉树】

每日OJ —— 101. 对称二叉树 1.题目&#xff1a;101. 对称二叉树2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;101. 对称二叉树 2.解法 2.1.算法讲解 1.该题是判断二叉树是否对称&#xff0c;关键在于&#xff0c;左子树等于右子树&#xff0c;而所给的…

Java手写字典树(Trie树),实现敏感词过滤

1.简介 字典树&#xff1a;也叫做前缀树&#xff0c;是一种高效的存储、配对字符串的数据结构&#xff0c;存储过程如下&#xff1a; 假设我们有单词&#xff1a;app、apple、cat。如果存在链表中&#xff1a; ["app"、"apple"、"api"、"…

Linux 文件查找

1 文件查找 在文件系统上查找符合条件的文件 文件查找&#xff1a;locate&#xff0c;find 1.1 locate 工作特点&#xff1a; 格式&#xff1a; Usage: locate [OPTION]... [PATTERN]...常用选项&#xff1a; -i &#xff1a;不区分大小写的搜索 -n N &#xff1a;只列举前…

python程序将部分文件复制到指定目录

geotools-28.2中的lib一共有264个jar包&#xff0c;但我只想将部分100个左右jar包引导我的环境中&#xff0c;那个就需要从目录中找出想要的那100个jar&#xff0c;手动挑选太费时间&#xff0c;我简单的写了个小脚本来实现。 我将想要的jar文件名和路径存放到txt中&#xff0…

Python编程的经典示例及应用

前言 Python作为一种简洁而强大的编程语言&#xff0c;提供了许多经典示例以展示其语言特性和功能。在本文中&#xff0c;我们将探讨一些经典的Python示例&#xff0c;并展示它们在实际应用中的价值。通过这些示例&#xff0c;读者可以深入了解Python的灵活性和易用性&#xff…

js选中起始时间使用标准时间毫秒值计算一年后的当前少一天的日期(并考虑闰年)

js选中起始时间使用标准时间毫秒值计算一年后的当前少一天的日期 实际代码里面带入默认日期’20230301’这个特殊日期&#xff0c;因为下一年的当前日期少一天为闰年的2月会有29天&#xff0c;使用特殊值校验代码效果图 HTML部分代码 <el-button click"chengTime()&q…

C# WPF上位机开发(带配置文件的倒计时软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们写了倒计时软件&#xff0c;但是不知道大家有没有发现&#xff0c;这个软件起始有一个缺点&#xff0c;那就是倒计时的起始时间都是硬编码…

Spring Security 自定义异常失效?源码分析与解决方案

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

分享73个节日PPT,总有一款适合您

分享73个节日PPT&#xff0c;总有一款适合您 73个节日PPT下载 链接&#xff1a;https://pan.baidu.com/s/1FG9Y-9yR31Y-fs3zxKI4Pg?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

LeetCode | 572. 另一棵树的子树

LeetCode | 572. 另一棵树的子树 OJ链接 我们需要判断两棵二叉树是否相同&#xff0c;如果再判断的的时候不同我们就直接返回false&#xff0c;否则就返回true然后再检查左子树和右子树里面是否存在subRoot子树~~ bool isSameTree(struct TreeNode* q, struct TreeNode* p) {…

C语言从入门到实战——常用内存函数的了解和模拟实现

常用内存函数的了解和实现 前言1. memcpy使用和模拟实现2. memmove使用和模拟实现3. memset函数的使用4. memcmp函数的使用 前言 内存函数&#xff08;memory functions&#xff09;指的是控制计算机内存操作的函数 1. memcpy使用和模拟实现 void * memcpy ( void * destinat…

uniapp:如何使用uCharts

目录 第一章 前言 第二章 安装插件uCharts 第三章 使用uCharts 第四章 注意 第一章 前言 需求&#xff1a;这是很久之前的一个项目的需求了&#xff0c;当时我刚接触app&#xff0c;有这么一个需求&#xff0c;在uniapp写的app项目中做一些图表统计&#xff0c;最开始以为…

EasyRecovery2024激活码秘钥

EasyRecovery从&#xff08;易恢复2024&#xff09;支持恢复不同存储介质数据&#xff0c;在Windows中恢复受损和删除文件,以及能检索数据格式化或损坏卷&#xff0c;甚至还可以从初始化磁盘。同时&#xff0c;你只需要最简单的操作就可以恢复数据文件&#xff0c;如&#xff1…

在java中如何解决in unnamed module @0x602ff1d9得问题

在日常得java开发中&#xff0c;点击maven得编译得时候会出现&#xff1a;class lombok.javac.apt.LombokProcessor (in unnamed module 0x58313b33) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module…

Vue3实现滚动到容器底部时发送请求,加载新数据

问题来源 在项目中出现了需要在容器滚动到底部时&#xff0c;加载新的数据的需求&#xff0c;以下是解决的方案笔记 解决 画了个流程图&#xff1a; 如图&#xff0c;先添加一个动态加载的图标&#xff0c;还有全部数据载完的《到底啦...》 大概这么个样子&#xff0c;之后呢…

PMP备考必看|浅谈PMP证书的价值,PMP考试详细全流程

作为已经在项目管理领域摸爬滚打五年的资深项目经理&#xff0c;我可以诚实的告诉大家&#xff0c;在项目管理领域拥有丰富项目管理经验的人都知道&#xff0c;很多公司在发布招聘信息时都会要求申请者持有PMP证书&#xff0c;这些证书在项目经理岗位的要求中经常出现。 在实际…

【PyTorch】softmax回归

文章目录 1. 模型与代码实现1.1. 模型1.2. 代码实现 2. Q&A 1. 模型与代码实现 1.1. 模型 背景 在分类问题中&#xff0c;模型的输出层是全连接层&#xff0c;每个类别对应一个输出。我们希望模型的输出 y ^ j \hat{y}_j y^​j​可以视为属于类 j j j的概率&#xff0c;然…

ArcGIS提示当前许可不支持影像服务器

1、问题&#xff1a; 在用ArcGIS上处理影像栅格数据时&#xff08;比如栅格数据集裁剪、镶嵌数据集构建镶嵌线等&#xff09;经常会出现。 无法启动配置 RasterComander.ImageServer <详信息 在计算机XXXXX上创建服务器对象实例失败 当前许可不支持影像服务器。 ArcGIS提示当…