视频演示
大家好,我是Coding茶水间。
今天分享一个实用工具------yolo模型性能曲线的工具。
它可以帮助你在论文写作或模型评估中,轻松对比不同YOLO版本(如YOLOv5、YOLOv8、YOLOv11、YOLOv12)的训练结果曲线。
工具基于PyQt5开发,支持加载多个CSV文件、自定义曲线颜色、修改图例标签、调整坐标轴,并保存高清图片。
这个工具源于日常需求:训练多个YOLO模型后,每个模型都有独立的results.csv文件,包含epoch、loss、precision、recall、mAP等指标。
如果要对比曲线,通常需要手动用Matplotlib或Excel处理,很麻烦。
现在,用这个GUI工具,一键加载、多曲线叠加、个性化调整,超级方便!
工具功能亮点
- 多文件加载:支持批量选择YOLO训练生成的results.csv文件。
- 指标选择:下拉菜单切换显示召回率(Recall)、精准度(Precision)、mAP50、mAP50-95、F1指数,以及训练/验证集的Box Loss、Class Loss、DFL Loss。
- 曲线自定义:为每条曲线设置颜色、修改图例标签(默认用文件名)。
- 图表调整:开启/关闭网格线,编辑X/Y轴标签和标题。
- 保存图片:一键导出PNG高清图,插入论文或报告。
- 跨平台支持:自动适配Windows、macOS、Linux的中文字体显示。
使用步骤
- 运行工具:安装PyQt5、pandas、matplotlib后,执行Python脚本启动GUI。
- 加载文件:点击"加载 CSV 文件",多选YOLO results.csv(例如YOLOv5、YOLOv8等)。
- 设置曲线:在文件列表选中文件,点击"设置曲线颜色"选择颜色;点击"修改图例标签"输入新名称(如"YOLOv5")。
- 选择指标:从下拉框选指标,如"召回率 (Recall)",点击"更新图表"。
- 调整轴标题:输入X轴(如"迭代次数")、Y轴(如"值")、标题(如"召回率对比曲线"),点击"更新坐标轴"。
- 保存:满意后点击"保存图片",导出到本地。
例如,对比YOLOv12和YOLOv8的mAP50-95曲线:加载两个CSV,设不同颜色,选mAP50-95,调整标题为"不同YOLO版本mAP对比",保存插入论文。曲线更直观,突出改进点!
代码实现关键点
工具核心是PyQt5的QMainWindow类,结合Matplotlib的FigureCanvas嵌入绘图。数据用pandas处理CSV。以下是关键代码片段解释
1. 初始化和UI布局
在__init__中设置窗口,自动适配字体(Windows用SimHei,macOS动态查找中文字体,Linux用WenQuanYi Micro Hei),避免中文乱码。
system = platform.system()
if system == 'Windows':
plt.rcParams['font.sans-serif'] = ['SimHei']
# ... 其他系统处理
UI分左侧控制面板(按钮、列表、下拉框)和右侧图表区(画布、输入框)。用QHBoxLayout分栏,stretch控制比例。
2. 文件加载和数据存储
load_files方法用QFileDialog批量选CSV,读入pandas DataFrame。存储在self.data_files字典:键为文件路径,值为(数据, 颜色, 标签)。
data = pd.read_csv(file)
label = os.path.splitext(os.path.basename(file))[0] # 提取文件名作为默认标签
self.data_files[file] = (data, QColor(0, 0, 255), label) # 默认蓝色
文件列表用QListWidget显示,选中项可改颜色/标签。
3. 曲线绘制更新
update_plot清空Figure,创建ax subplot。根据选中指标(如"metrics/recall(B)"),为每个数据绘制plot线。F1指数需计算:F1 = 2 * (P * R) / (P + R)。
metric_key = self.get_metric_key(metric) # 映射中文到列名
if metric_key == "F1":
data["F1"] = 2 * (data["metrics/precision(B)"] * data["metrics/recall(B)"]) / (...)
ax.plot(data["epoch"], data[metric_key], label=label, color=color_hex)
ax.legend() # 添加图例
ax.grid(self.grid_toggle.isChecked()) # 网格开关
颜色从QColor转RGB/hex。update_axis更新xlabel/ylabel/title。
4. 保存和辅助功能
save_image用Figure.savefig导出高清PNG。edit_legend_label用QInputDialog改标签。clear_selection清空数据和列表。
指标映射在get_metric_key字典,便于扩展。
def update_plot(self):
"""更新图表"""
self.figure.clear()
ax = self.figure.add_subplot(111)
metric = self.metric_combo.currentText()
for file, (data, color, label) in self.data_files.items():
print(label)
color_rgb = color.getRgb()[:3]
color_hex = "#{:02x}{:02x}{:02x}".format(*color_rgb)
# 显示当前选中的指标
metric_key = self.get_metric_key(metric)
if metric_key == "F1" and "metrics/precision(B)" in data.columns and "metrics/recall(B)" in data.columns:
data["F1"] = 2 * (data["metrics/precision(B)"] * data["metrics/recall(B)"]) / (
data["metrics/precision(B)"] + data["metrics/recall(B)"])
if metric_key in data.columns:
ax.plot(data["epoch"], data[metric_key], label=label, color=color_hex)
ax.set_xlabel("Epoch")
ax.set_ylabel("Value")
ax.set_title(metric)
ax.legend()
ax.grid(self.grid_toggle.isChecked())
self.canvas.draw()
注意事项
- 依赖:PyQt5, pandas, matplotlib。pip安装即可。
- CSV格式:必须是YOLO Ultralytics生成的results.csv,包含标准列如"epoch"、"metrics/recall(B)"等。
- 扩展:可加更多指标或支持其他框架的CSV。
这个工具大大简化了YOLO多模型对比,节省时间。
也欢迎反馈改进建议,一起优化。
感谢阅读,Coding茶水间下期见!