基于Pandas和Matplotlib实现的模型网络指标对比图工具

★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>


基于Pandas和Matplotlib实现的模型网络指标对比图工具

1、项目背景

最近在梳理手头工作,回顾去年整个虎年,堪称YOLO内卷元年,各路YOLO系列神仙打架,各显神通。

一开始大部分用户做项目做实验还是使用的YOLOv5,然后YOLOv6、YOLOv7、PP-YOLOE+、DAMO-YOLO、RTMDet就接踵而至,

于是就在自己的数据集逐一尝试,好不容易把这些下饺子式的YOLO模型训练完测试完,忙完工作准备回家过年时,YOLOv8又闪电发布,YOLOv6又更新了3.0版本…用户还得跟进继续训练测试,其实很多时候就是重复工作。

此外换模型训练调参也会引入更多的不确定性,而且往往业务数据集大则几十万张图片,重训成本很高,但训完了新的精度不一定更高,速度指标在特定机器环境上也未必可观,参数量、计算量的变化尤其在边缘设备上也不能忽视。

所以在这样的内卷期,作为开发者,或者研究者的我们,应该怎么样去做一个关于不同网络模型结构的性能结果对比呢?

刚好那段时间的契机是,在折腾YOLOv8_Efficient这个项目,拿到了YOLOv8的模型权重,于是就准备开始动手做这么一个工具。

最后处理完的结果,大概是这个样子。
如下图。

2、初步的想法

其实动手做这个项目最初的想法是,希望能够做一个绘制多个神经网络模型性能指标的一个对比图工具,

发现很多论文作者都会选择用python程序来做一个图形绘制,但自己去github上到处找了一圈,也在各个群里问了一遍都没有找到比较合适的工具。

似乎他们都是直接用list存储数据丢到matplotlib里面来做专门的图形绘制,最后还是决定动手去撸一个工具,来满足自己的需求。

3、设计与选型

考虑到开发语言使用的是Python,那么作为主流的Matplotlib库便成为了作为绘制图像的优先选择。

在引入了Matplotlib之后,简单地学习使用了它的一些绘制工具和用法,就开始试着去各个开源repo和YOLO系列的论文下面把主要关心的几个维度给记录下来,然后保存到python的list数组里面去,再传给Matplotlib去绘制图形。但是随之而来的问题是,每个模型系列都包括着不同的分支,且对应着不同的指标参数,同时最终还需要将不同的模型系列下的不同分支也做一个对比,就相当于是不仅要对比不同模型系列的性能指标,还需要将同一模型下的不同分支也做一个对比。例如Yolov5下面就有n、s、m、l、x等多个分支。

因此,结合之前做数据分析处理的经验,意识到可以自己定义数据结构来满足Matplotlib的参数输入,那么如何设计多个模型指标参数的数据结构就成为一个思考的问题,又考虑到多模型多分支的因素,于是建立了下面这张表格。

  • model来区分不同模型
  • branch来区分同一模型下的不同分支
  • msfps以及mAP作为绘图的指标参数
  • maker来区分绘制图例的标识符号
  • 以及用release datedata source作为一个数据来源的记录

将记录完成的数据,整理保存为**.CSV**文件,自然而然的,后面引入了Pandas来做一个数据处理和读取的工具。

至此,这个绘图小工具的设计与选型基本完成。

最后还需要加(亿)一点点小细节!

  • 关于速度的统一,这里需要做fps与ms之间的转换。例如yolov6对于网络模型推理速度的指标为fps,而yolov5的指标则是直接用ms来进行评价。

实现方式是用math来进行转换计算

def fps_to_ms(fps: int) -> int:
    '''
    Convert FPS to a millisecond interval.
    Args:
        fps: Input FPS as integer.
    Returns:
        Interval in milliseconds as integer number.
    '''
    return math.floor((1 / fps) * 1000)
  • 例如标题名称,横轴、纵轴的名称,以及网格等多个变量的定义与需要,都需要进行自定义输入。

目前支持修改和调整的参数如下,数据格式可以参考上面的介绍。

def parse_opt(known=False):
    parser = argparse.ArgumentParser(description="Quick use model-metrics-plot")
    parser.add_argument('-c', '--csv', default='data/Pytorch_models_data.csv', help="csv path")
    parser.add_argument('-n', '--fig_path', default='output/plot_metrics.jpg', help="figure path")
    parser.add_argument('-p', '--plot_type', default='line', help="i.e line, bar, scatter")
    parser.add_argument('-t', '--title_name', default='MS COCO Object Detection', help="title name")
    parser.add_argument('-x', '--xlabel_name', default='PyTorch FP16 RTX3080(ms/img)', help="xlabel name")
    parser.add_argument('-y', '--ylabel_name', default='COCO Mask AP val', help="ylabel name")
    parser.add_argument('-g', '--is_grid', default=False, help="is grid")
    parser.add_argument('-f', '--font_size', default=10, help="font_size")
    parser.add_argument('-v', '--value_type', default='mAP', help="value type,i.e mAP, FPS, ms")
    parser.add_argument('-r', '--colors', default='#0000FF', help="colors")

    return parser.parse_known_args()[0] if known else parser.parse_args()

于是开始了漫长的调试与测试…

但是仅能绘制模型的速度和精度显然是不够,同时绘制折线图也有一定的局限性。
于是又引入了条形图,来辅助绘制单个指标参数的模型性能对比。

终于在某个周末的早上,把所有的数据和实例都跑通了。

目前代码已开源在Github,链接为:https://github.com/isLinXu/model-metrics-plot

4、动手体验

上面讲了那么多有的没的废话,talk is cheap,show me the code,不妨直接来动手实操一下。

目前数据已上传到本项目的work目录下,可自行参考修改或创建自己的数据表。

项目代码也开源到github上了,直接clone下来即可。

本来是打算上传到pypi的源仓库,让大家直接pip install来安装使用的,后面发现想到的比较好的名字全部都被注册占用了。

于是没办法,大家还是直接软链接的形式来安装使用吧。

最后,大家觉得好用的话,欢迎给本项目打Star和forks,谢谢大家的支持。

4.1配置安装

4.1.1 克隆仓库

!git clone https://github.com/isLinXu/model-metrics-plot.git
正克隆到 'model-metrics-plot'...
remote: Enumerating objects: 242, done.[K
remote: Counting objects: 100% (17/17), done.[K
remote: Compressing objects: 100% (14/14), done.[K
remote: Total 242 (delta 5), reused 13 (delta 3), pack-reused 225[K
接收对象中: 100% (242/242), 2.98 MiB | 1.65 MiB/s, 完成.
处理 delta 中: 100% (108/108), 完成.
检查连接... 完成。
%cd model-metrics-plot
/home/aistudio/model-metrics-plot
!ls
configs  LICENSE  mmplot_test.py  README.md	    setup.cfg
data	 main.py  output	  README.zh-CN.md   setup.py
img	 mmplot   plots		  requirements.txt  utils

4.1.2 依赖安装

!pip install -e .
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Obtaining file:///home/aistudio/model-metrics-plot
  Preparing metadata (setup.py) ... [?25ldone
[?25hInstalling collected packages: mmplot
  Running setup.py develop for mmplot
Successfully installed mmplot-0.1.7

[1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m A new release of pip available: [0m[31;49m22.1.2[0m[39;49m -> [0m[32;49m23.0.1[0m
[1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m To update, run: [0m[32;49mpip install --upgrade pip[0m

ll --upgrade pip[0m

!pip install omegaconf

4.2 测试使用

4.2.1 引入mmplot库

import mmplot

4.2.2 绘制多模型指标折线对比图

import pandas 
csv_path = '/home/aistudio/work/PaddleYOLO_model_data.csv'
df = pandas.read_csv(csv_path)
df
modelbranchmsfpsmAPmaker
0YOLOv5n2.6-128.0.
1YOLOv5s3.2-137.6.
2YOLOv5m5.2-145.4.
3YOLOv5l7.9-148.9.
4YOLOv5x13.7-150.6.
5YOLOv6n1.3-136.1.
6YOLOv6t2.1-140.7.
7YOLOv6s2.6-143.4.
8YOLOv6m5.0-149.0.
9YOLOv6l7.9-151.0.
10YOLOv6l-silu9.6-151.7.
11YOLOv7l7.4-151.0.
12YOLOv7x12.2-153.0.
13YOLOv8n2.4-137.3.
14YOLOv8s3.4-144.9.
15YOLOv8m6.5-150.2.
16YOLOv8l10.0-152.8.
17YOLOv8x15.1-153.8.
18YOLOXs3.0-140.4.
19YOLOXm5.8-146.9.
20YOLOXl9.3-150.1.
21YOLOXx16.6-151.8.
22RTMDett2.8-140.9.
23RTMDets3.3-144.5.
24RTMDetm6.4-149.1.
25RTMDetl10.2-151.2.
26RTMDetx18.0-152.6.
27PP-YOLOE+s2.9-143.7*
28PP-YOLOE+m6.0-149.8*
29PP-YOLOE+l8.7-152.9*
30PP-YOLOE+x14.9-154.7*
%matplotlib inline
from mmplot.plots import plot_metrics
from mmplot.utils.dataloader import pd_read_csv

if __name__ == '__main__':
    csv_path = '/home/aistudio/work/PaddleYOLO_model_data.csv'
    fig_path = 'plot_metrics.jpg'
    df = pd_read_csv(csv_path)
    plot_metrics(df, fig_path)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CYktgbwe-1677392126014)(main_files/main_18_0.png)]

4.2.3 绘制多模型指标条形对比图

import pandas 
csv_path = '/home/aistudio/work/MMYOLO_model_data.csv'
df = pandas.read_csv(csv_path)
df
modelbranchmsfpsmAP
0YOLOv5n-1-128.0
1YOLOv5s-1-137.7
2YOLOv5m-1-145.3
3YOLOv5l-1-148.8
4YOLOv6n-1-136.2
5YOLOv6t-1-141.0
6YOLOv6s-1-144.0
7YOLOv6m-1-148.4
8YOLOv6l-1-151.0
9YOLOv7tiny-1-137.5
10YOLOv7l-1-150.9
11YOLOv8x-1-152.8
12PP-YOLOEs-1-143.5
13PP-YOLOEm-1-149.5
14PP-YOLOEl-1-152.6
15PP-YOLOEx-1-154.2
%matplotlib inline
from mmplot.utils.dataloader import pd_read_csv
from plots.bar_chart_plot import bar_chart_plot
from plots.line_metrics_plots import plot_metrics
if __name__ == '__main__':
    csv_path = '/home/aistudio/work/MMYOLO_model_data.csv'
    fig_path = 'plot_line_metrics.jpg'
    title_name = 'MS COCO Object Detection'
    xlabel_name = 'PyTorch FP16 RTX3080(ms/img)'
    colors = '#0000FF'
    value_type = 'mAP'
    is_grid = False
    df = pd_read_csv(csv_path)
    bar_chart_plot(df, fig_path, value_type, title_name, xlabel_name, colors, is_grid)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uRqW0WM0-1677392126015)(main_files/main_21_0.png)]

5、总结

自己造轮子是一件很折腾,但也很有意思的事情。

可以培养自己除了开发之外,关于产品和用户角度的一些思维。

关于这个工具,后续也会引入和支持更多的绘图方式来辅助算法选型和科研需要。

最后,也在PFCC的推荐下,给PaddleYOLO和PaddleDetection提交了相应的PR,目前已被合入,后面又做了微调。

6、个人介绍

  • 林旭 某小厂算法架构师
  • AICA六期班学员
  • 飞桨PFCC成员
  • 飞桨PPDE
  • Github主页:https://github.com/isLinXu
  • AI Studio主页:https://aistudio.baidu.com/aistudio/personalcenter/thirdview/777989
  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果要写一个python基于运动员赛事数据的大数据分析系统,包括可视化分析和爬虫,我会这样做: 1. 首先,我会收集相关的运动员赛事数据。这些数据可能来自各种来源,例如官方网站、第三方数据提供商、社交媒体等。我会使用爬虫技术来提取这些数据。 2. 然后,我会将这些数据存储在数据库中,方便后续的分析。 3. 接下来,我会使用数据分析工具(如pandas、numpy等)对数据进行清洗、预处理、特征工程等工作。 4. 之后,我会使用可视化工具(如matplotlib、seaborn等)对数据进行可视化分析,并使用统计分析方法对数据进行深入分析。 5. 最后,我会将分析结果汇总成报告或者展示在网站上。 希望这些信息能帮到你! ### 回答2: 如果需要编写一个基于运动员赛事数据的大数据分析系统,包括可视化分析和爬虫,我会采取以下步骤: 1. 数据采集和存储:利用爬虫技术从可靠的数据源(例如官方比赛网站)中获取所需的运动员赛事数据,并将数据存储到数据库中。我可以使用Python中的第三方库(如BeautifulSoup、Scrapy等)来实现爬虫功能,并使用适当的数据库(如MySQL、MongoDB等)来存储数据。 2. 数据清洗和预处理:对于从网页中爬取的数据,可能会存在重复、格式不统一或缺失的情况。因此,我将使用Python的各种数据处理库(如Pandas、NumPy等)来进行数据清洗和预处理,包括去除重复值、填充缺失值、处理异常数据等。 3. 数据分析和可视化:使用Python的各种数据分析和可视化库(如Matplotlib、Seaborn等)对清洗后的数据进行分析和可视化。我可以使用这些库来生成各种表和可视化工具,如折线、柱状、热力等,以展示不同运动员在不同赛事中的表现,并进行比较和分析。 4. 用户界面和交互:为了让用户能够方便地使用该系统,我将使用Python的Web框架(如Django、Flask等)构建一个用户界面和交互系统。通过该系统,用户可以选择不同的运动员、赛事和分析指标,并实时获取对应的分析结果和可视化表。 总结:以上是我设计一个基于运动员赛事数据的大数据分析系统的基本步骤。通过合理使用Python的爬虫、数据处理、数据分析和可视化库,以及构建适当的用户界面和交互系统,我可以为用户提供一个功能强大且易于使用的大数据分析工具。 ### 回答3: 要构建一个基于运动员赛事数据的大数据分析系统,包括可视化分析和爬虫,可以按照以下步骤进行: 1. 设计数据库模型:根据需要分析的数据,设计数据库表结构,包括运动员信息、比赛数据、统计指标等。 2. 数据爬取:编写爬虫程序,从网上获取相关赛事数据。可以使用Python中的库,如BeautifulSoup、Scrapy等进行数据爬取。 3. 数据处理与清洗:对爬取到的数据进行处理和清洗,去除重复数据、缺失值等,确保数据质量。 4. 数据存储:将清洗后的数据存储到数据库中,可以选择关系型数据库如MySQL、SQLite等,或者使用非关系型数据库如MongoDB等进行存储。 5. 数据分析与可视化:使用Python中的数据分析库,如Pandas和NumPy进行数据分析,通过统计分析、指标计算等方法,得出需要的数据分析结果。 6. 制作可视化表:使用Python中的可视化库,如Matplotlib、Seaborn、Plotly等,将分析结果以表的形式进行可视化展示,以便更直观地观察和分析数据。 7. 系统实现与展示:将数据分析与可视化的代码集成到一个系统中,可以使用Web框架如Django或Flask进行系统开发,提供用户界面供用户进行数据查询、可视化展示等操作。 总结而言,构建一个基于运动员赛事数据的大数据分析系统,需要完成数据爬取、数据处理与清洗、数据存储、数据分析与计算、可视化表绘制等多个环节,并将其集成到一个系统中,为用户提供数据查询和可视化展示的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值