1.绘制脚本
import matplotlib.pyplot as plt
import pandas as pd
def plot_metrics(ax, metric_col_name, y_label, color, modelname):
res_path = pr_csv_dict[modelname]
try:
data = pd.read_csv(res_path)
data.columns = data.columns.str.strip()
epochs = data['epoch'].values
metric_data = data[metric_col_name].values
if len(epochs) > 0 and len(metric_data) > 0:
ax.plot(epochs, metric_data, label=modelname, color=color, linewidth='2')
else:
print(f"No data for {modelname}")
except Exception as e:
print(f"Error reading {modelname}: {e}")
def plot_all_metrics():
global pr_csv_dict
pr_csv_dict = {
'YOLO11n': r'/yolo11/yolo11-1/runs/train/kitti-yolo11n/results.csv',
'YOLO11s': r'/runs/train/kitti-yolo11s/results.csv',
'YOLO11m': r'/runs/train/kitti-yolo11m/results.csv',
'YOLO11l': r'/runs/train/kitti-yolo11l/results.csv',
'YOLO11x': r'/runs/train/kitti-yolo11x/results.csv',
}
colors = {
'YOLO11n': '#8470FF',
'YOLO11s': 'orange',
'YOLO11m': '#BCEE68',
'YOLO11l': '#FF6A6A',
'YOLO11x': '#00BFFF',
}
fig, axs = plt.subplots(1, 3, figsize=(24, 8), tight_layout=True)
plt.rcParams.update({'font.size': 16})
for modelname in pr_csv_dict:
plot_metrics(axs[0], 'metrics/mAP50(B)', 'mAP@0.5', colors[modelname], modelname)
axs[0].set_xlabel('Epoch', fontsize=16)
axs[0].set_ylabel('mAP@0.5', fontsize=16)
axs[0].set_xlim(0, None)
axs[0].set_ylim(0, 1)
axs[0].legend(bbox_to_anchor=(1, 0), loc='lower right')
axs[0].tick_params(width=2, labelsize=16)
for modelname in pr_csv_dict:
plot_metrics(axs[1], 'metrics/mAP50-95(B)', 'mAP@0.95', colors[modelname], modelname)
axs[1].set_xlabel('Epoch', fontsize=16)
axs[1].set_ylabel('mAP@0.5-0.95', fontsize=16)
axs[1].set_xlim(0, None)
axs[1].set_ylim(0, 1)
axs[1].legend(bbox_to_anchor=(1, 0), loc='lower right')
axs[1].tick_params(width=2, labelsize=16)
for modelname in pr_csv_dict:
res_path = pr_csv_dict[modelname]
try:
data = pd.read_csv(res_path)
data.columns = data.columns.str.strip()
epochs = data['epoch'].values
box_loss = data['train/box_loss'].values
cls_loss = data['train/cls_loss'].values
dfl_loss = data['train/dfl_loss'].values
total_loss = box_loss + cls_loss + dfl_loss
if len(epochs) > 0 and len(total_loss) > 0:
axs[2].plot(epochs, total_loss, label=modelname, color=colors[modelname], linewidth='2')
else:
print(f"No data for {modelname}")
except Exception as e:
print(f"Error reading {modelname}: {e}")
axs[2].set_xlabel('Epoch', fontsize=16)
axs[2].set_ylabel('Total loss', fontsize=16)
axs[2].set_xlim(0, None)
axs[2].set_ylim(0, None)
axs[2].legend(bbox_to_anchor=(1, 1), loc='upper right')
axs[2].tick_params(width=2, labelsize=16)
plt.subplots_adjust(wspace=5)
plt.savefig('/images/aa/yolo11-map2.png', dpi=250)
plt.show()
plot_all_metrics()
- 只需修改pr_csv_dict中的名字、路径、颜色对应的名字、保存路径
2.绘制结果

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人