手搓一个可以自动化对比yolo模型性能曲线的工具

视频演示

手搓一个可以自动化对比yolo模型性能曲线的工具


大家好,我是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的中文字体显示。

使用步骤

  1. 运行工具:安装PyQt5、pandas、matplotlib后,执行Python脚本启动GUI。
  2. 加载文件:点击"加载 CSV 文件",多选YOLO results.csv(例如YOLOv5、YOLOv8等)。
  3. 设置曲线:在文件列表选中文件,点击"设置曲线颜色"选择颜色;点击"修改图例标签"输入新名称(如"YOLOv5")。
  4. 选择指标:从下拉框选指标,如"召回率 (Recall)",点击"更新图表"。
  5. 调整轴标题:输入X轴(如"迭代次数")、Y轴(如"值")、标题(如"召回率对比曲线"),点击"更新坐标轴"。
  6. 保存:满意后点击"保存图片",导出到本地。

例如,对比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茶水间下期见!