【YOLO系列PR、F1绘图】更改v5、v7、v8(附v8训练、验证方式),实现调用val.py或者test.py后生成pr.csv,然后再整合绘制到一张图上(使用matplotlib绘制)

目录

  • 1. 前提 + 效果图
  • 2. 更改步骤
    • 2.1 得到PR_curve.csv和F1_curve.csv
      • 2.1.1 YOLOv7的更改
        • 2.1.1.1 得到PR_curve.csv
        • 2.2.1.2 得到F1_curve.csv
      • 2.1.2 YOLOv5的更改(v6.1版本)
      • 2.1.3 YOLOv8的更改(附训练、验证方式)
    • 2.2 绘制PR曲线

1. 前提 + 效果图

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

  • 关于map的绘图、loss绘图,可参考:【YOLO系列result中的map、loss、pr绘图】根据v5、v8、v7训练后生成的result文件用matplotlib进行绘图

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

  • 实现效果:就是将运行val.py/test.py后生成的PR_curve.png最粗的蓝线整合到同一张图中(注意:本代码最重要的作用是将验证时得到的一系列P、R值给提出来,所以绘图就比较潦草,直接用的matplotlib画的,如果要用于论文中的绘图,一般使用origin

在这里插入图片描述

  • 同理,可以实现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 curve
    fig, ax = plt.subplots(1, 1, figsize=(9, 6), tight_layout=True)
    py = np.stack(py, axis=1)

    # lwd edit: 将结果保存在csv中
    pr_dict = dict()    # lwd edit
    pr_dict['px'] = px.tolist() # lwd edit

    if 0 < len(names) < 21:  # display per-class legend if < 21 classes
        for 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 edit
    else:
        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 pd
    dataformat = 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.pngP_curve.pngR_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 curve
    fig, ax = plt.subplots(1, 1, figsize=(9, 6), tight_layout=True)

    # -----------------lwd edit: 将结果保存在csv中--------------- #
    # 判断是不是绘制F1_curve曲线
    flag = False
    if str(save_dir).endswith('F1_curve.png'):
        flag = True
        pr_dict = dict()    # lwd edit
        pr_dict['px'] = px.tolist() # lwd edit
    # --------------------------------------------------------- #

    if 0 < len(names) < 21:  # display per-class legend if < 21 classes
        for 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 edit
    else:
        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 pd
        dataformat = 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 YOLO

model = 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')  # 参数和训练用到的一样

在这里插入图片描述

  1. 暂存一下我训练设置的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',
    }

    # 绘制pr
    fig, 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()   # 绘制PR
    plot_F1()   # 绘制F1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在CSDN创作了6个月,我收获了什么?文末送书~

作者主页&#xff1a;阿玥的小东东主页&#xff01; 正在学习&#xff1a;python和C/C 期待大家的关注哦 目录 一次很好的机会&#xff0c;让我开始了CSDN之旅 首先来看看我的几位领路人 创作动力 1W粉丝 在CSDN我收获了什么&#xff1f; 很高的展现量 认证创作者身份 社…

Linux 网络操作命令FTP

FTP命令 引言 文件传输协议&#xff08;FTP&#xff09;是一种用于在网络上进行文件传输的协议。在Linux系统中&#xff0c;FTP可以作为一个非常有用的工具来上传、下载和管理文件。本文将介绍如何在Linux系统中安装FTP服务器&#xff0c;以及如何使用FTP客户端进行文件传输。…

RabbitMQ进阶学习

在之前的练习作业中&#xff0c;我们改造了余额支付功能&#xff0c;在支付成功后利用RabbitMQ通知交易服务&#xff0c;更新业务订单状态为已支付。 但是大家思考一下&#xff0c;如果这里MQ通知失败&#xff0c;支付服务中支付流水显示支付成功&#xff0c;而交易服务中的订…

充电器进阶,原边恒流,单片机控制小电流(预充电)的方案

前言 很多充电器&#xff0c;为了能控制电流输出&#xff0c;也就是充电时需要有小电流、大电流的情况&#xff0c;都会用副边及单片机进行控制&#xff0c;但因为是副边控制&#xff0c;需要一个比较器、一个二极管、若干电阻、若干电容&#xff0c;整体BOM成本可能多了三毛钱…

VUE 项目 自动按需导入

你是否有这样的苦恼&#xff0c;每个.vue都需要导入所需的vue各个方法 unplugin-auto-import 库 Vite、Webpack和Rollup的按需自动导入API 本章提供Vite、Webpack中使用说明 1. 安装 npm i -D unplugin-auto-import 2. config.js 配置文件内追加配置 2.1 Vite // vite.conf…

用Nest实现对数据库的增删改查~

概述 为了与 SQL和 NoSQL 数据库集成&#xff0c;Nest 提供了 nestjs/typeorm 包。Nest 使用TypeORM是因为它是 TypeScript 中最成熟的对象关系映射器( ORM )。因为它是用 TypeScript 编写的&#xff0c;所以可以很好地与 Nest 框架集成。 TypeORM 提供了对许多关系数据库的支…

问题总结笔记

1.向量旋转 问题&#xff1a; 将一个向量旋转90 方法&#xff1a;旋转矩阵 FVector FrontDir EndMousePoint - Point; FrontDir.Normalize(); FVector Left FVector(-FrontDir.Y, FrontDir.X, 0); Verties.Add(Point Left * (WallWedith / 2)); Verties.Add(FVector(Vertie…

C语言 | Leetcode C语言题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; int searchInsert(int* nums, int numsSize, int target) {int left 0, right numsSize - 1, ans numsSize;while (left < right) {int mid ((right - left) >> 1) left;if (target < nums[mid]) {ans mid;right mid - …

Ubuntu Server 20.04 LTS 64bit安装ftp服务

1.安装vsftpd sudo apt install vsftpd2.配置vsftpd sudo vim /etc/vsftpd.conf write_enableYES # 启用任何形式的FTP写入命令&#xff0c;即可以修改文件local_umask022 # 本地用户创建文件的 umask 值&#xff0c;默认是被注释的connect_from_port_20YES # 针对 PORT 类型…

01_Nginx

文章目录 NginxNginx的核心功能Nginx的优势Nginx常用指令Nginx配置文件Nginx的核心功能&#xff1a;反向代理 Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子…

《大话西游2》本人收集的十二个单机版游戏,有详细的视频架设教程,云盘下载

《大话西游2》是一款经典的大型多人在线角色扮演游戏&#xff0c;也是一款国风经典的游戏。 有能力的可以架设个外网&#xff0c;让大家一起玩。 《大话西游2》本人收集的十二个单机版游戏&#xff0c;有详细的视频架设教程&#xff0c;值得收藏 下载地址&#xff1a; 链接&…

色彩空间转换在AI去衣技术中的应用与探索

在人工智能&#xff08;AI&#xff09;的广阔领域中&#xff0c;图像处理和计算机视觉技术一直占据着举足轻重的地位。其中&#xff0c;AI去衣技术作为一种新兴的图像处理技术&#xff0c;近年来受到了广泛关注。在AI去衣的实现过程中&#xff0c;色彩空间转换技术发挥着至关重…

信息系统项目管理师0057:运维管理(4信息系统管理—4.2管理要点—4.2.2运维管理)

点击查看专栏目录 文章目录 4.2.2运维管理1.能力模型2.智能运维4.2.2运维管理 IT运维是组织IT服务中关键的一种类型。随着组织IT建设的不断深入和完善,信息系统运维已经成为了各行各业各组织管理者和IT团队普遍关注的问题。IT运维是指采用IT手段及方法,依据服务对象提出的服务…

visionpro_对比工具_CogPatInspectTool

CogPatInspectTool CogPatInspectTool工具使用PatMax检测缺陷(缺陷被定义为运行期间图像中超出正常预期的图像差别的任何变化)&#xff0c;缺陷可能是物体遗失&#xff08;阻塞&#xff09;或者多余&#xff08;杂乱&#xff09;, 原理是通过PMAlign工具实现,用训练图片和当前…

Github账号注册

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

轮转数组(Leedcode)的题目

题目&#xff1a;给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步…

【快速上手ESP32(基于ESP-IDFVSCode)】09-Flash存储

ESP32中的Flash 关于ESP32中的Flash&#xff0c;我们需要再回顾一下命名规则。 我用的是立创开发板设计的板子&#xff0c;芯片型号是ESP32S3R8N8&#xff0c;因此可以知道我这块板子有8MB的Flash&#xff0c;大家可以参照着命名规则看看自己有多大的Flash容量。 操作Flash …

洗地机哪个牌子质量最好?这四款公认值得买,总有一款适合你

如今&#xff0c;洗地机在我们家庭清洁中&#xff0c;已经很常见了&#xff0c;它可以让我们快速的完成地面清洁的工作&#xff0c;无需我们手动去清洗滚布&#xff0c;大大的节省了我们清洁时间&#xff0c;给我们腾出来了更多时间去享受生活。但是目前&#xff0c;可供选择的…

通过WHM面板重启服务器

看到一位用户反馈他购买了Hostease的独立服务器带cPanel面板的&#xff0c;但是该用户想要重启服务器&#xff0c;通过cPanel面板进行操做管理重启&#xff0c;但是没有找到具体位置&#xff0c;因此留言寻求帮助&#xff0c;具体的操做步骤如下&#xff1a; 1.登录到WHM面板 2…

Oracle中的 plsql语法

01-plsql 为什么要plsql 复杂的业务逻辑 可以使用 编程语言实现 sql无法实现 plsql也可以实现复杂的业务逻辑 为不直接使用编程语言 而是学习plsql plsql会比直接使用 编程语言 速度更快 基本语法&#xff1a; [declare --声明变量 变量名 变量类型 ] begin --代码逻辑 …