简介

为清晰表示网络改进模块带来的模型开销变化,本文脚本以折线图从网络层数、模型参数量、GFLOPs计算量三个核心维度进行指标对照,通过可视化折线图标注自研模型各项指标相对原版的增减百分比,直观量化结构修改引发的参数与算力波动,客观评估改进方案的开销代价,为后续模型修改网络提供便利

代码

import matplotlib.pyplot as plt
import numpy as np


# 单位:秒/epoch,顺序:原始、对比组1,对比组2,
epoch_time_list = [12.5, 13.2]


# # 模型名称、指标数据(支持n个模型,基准:第0个=原始YOLOv10s)
models = ['YOLOv10s', 'YOLOv10b']
layers = [403,  519]                # 网络层数
params = [8074092,  20466444]        # 总参数量
flops = [24.8,  98.8]                # 计算量 GFLOPs
# 基准值:原始YOLOv10s数据(索引0)
base_layer = layers[0]
base_param = params[0]
base_flop = flops[0]
base_epoch = epoch_time_list[0]

# 解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

numbers=4  #表示有几个图,1:网络层数 ,2 网络层数,总参数量,3

# 创建 1行4列子图(加入训练时间)
fig, axs = plt.subplots(1, numbers, figsize=(26, 5))
x = np.arange(len(models))  # x坐标:0~4五个模型
line_color = '#2E86AB'
marker_color = '#A23B72'
# 上下留白缩放系数,y轴整体放大范围,数据居中
scale_low = 0.92
scale_high = 1.09

# -------------------------- 1. 网络层数 折线图+百分比标注 --------------------------
ax = axs[0]
ax.plot(x, layers, color=line_color, marker='o', ms=8, mfc=marker_color, label='网络层数')
ax.set_title('网络层数(相对原始变化百分比)', fontsize=14, fontweight='bold')
ax.set_ylabel('层数', fontsize=12)
ax.set_xticks(x)
ax.set_xticklabels(models, rotation=12)
# 动态扩充y轴范围,数据居中
min_l, max_l = min(layers), max(layers)
ax.set_ylim(min_l * scale_low, max_l * scale_high)
# 逐个标注:数值 + 变化百分比,减小文字偏移,避免出框
for idx, val in enumerate(layers):
    change_rate = (val - base_layer) / base_layer * 100
    text_str = f'{val}\n({change_rate:+.2f}%)'
    ax.text(idx, val + 1.0, text_str, ha='center', va='bottom', fontsize=9)
ax.grid(axis='y', alpha=0.3)

# -------------------------- 2. 总参数量 折线图+百分比标注 --------------------------
ax = axs[1]
ax.plot(x, params, color=line_color, marker='o', ms=8, mfc=marker_color, label='参数量')
ax.set_title('总参数量(相对原始变化百分比)', fontsize=14, fontweight='bold')
ax.set_ylabel('参数量', fontsize=12)
ax.set_xticks(x)
ax.set_xticklabels(models, rotation=12)
min_p, max_p = min(params), max(params)
ax.set_ylim(min_p * scale_low, max_p * scale_high)
for idx, val in enumerate(params):
    change_rate = (val - base_param) / base_param * 100
    text_str = f'{val:,}\n({change_rate:+.2f}%)'
    ax.text(idx, val + 60000, text_str, ha='center', va='bottom', fontsize=8)
ax.grid(axis='y', alpha=0.3)

# -------------------------- 3. GFLOPs计算量 折线图+百分比标注 --------------------------
ax = axs[2]
ax.plot(x, flops, color=line_color, marker='o', ms=8, mfc=marker_color, label='GFLOPs')
ax.set_title('计算量GFLOPs(相对原始变化百分比)', fontsize=14, fontweight='bold')
ax.set_ylabel('GFLOPs', fontsize=12)
ax.set_xticks(x)
ax.set_xticklabels(models, rotation=12)
min_f, max_f = min(flops), max(flops)
ax.set_ylim(min_f * scale_low, max_f * scale_high)
for idx, val in enumerate(flops):
    change_rate = (val - base_flop) / base_flop * 100
    text_str = f'{val:.1f}\n({change_rate:+.2f}%)'
    ax.text(idx, val + 0.15, text_str, ha='center', va='bottom', fontsize=10)
ax.grid(axis='y', alpha=0.3)

# -------------------------- 4. 单轮训练时间 折线图+百分比标注 --------------------------
ax = axs[3]
ax.plot(x, epoch_time_list, color=line_color, marker='o', ms=8, mfc=marker_color)
ax.set_title('单轮训练时间(秒/epoch)(相对原始变化百分比)', fontsize=14, fontweight='bold')
ax.set_ylabel('秒/epoch', fontsize=12)
ax.set_xticks(x)
ax.set_xticklabels(models, rotation=12)
min_e, max_e = min(epoch_time_list), max(epoch_time_list)
ax.set_ylim(min_e * scale_low, max_e * scale_high)
for idx, val in enumerate(epoch_time_list):
    change_rate = (val - base_epoch)/base_epoch*100
    text_str = f'{val:.1f}s\n({change_rate:+.2f}%)'
    ax.text(idx, val+0.18, text_str, ha='center', va='bottom', fontsize=10)
ax.grid(axis='y', alpha=0.3)

# 总标题+排版
plt.suptitle('YOLOv10各改进模型指标对比折线图(标注相对原始增减百分比)', fontsize=18, fontweight='bold', y=1.03)
plt.tight_layout()

# 保存高清图片
plt.savefig('yolo_v10_折线指标对比.png', dpi=300, bbox_inches='tight')
plt.show()

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐