关于YOLOv5训练结果results.txt绘制对比图

目录

用两个results.txt在一幅图中画2条对比曲线

用一个results.txt在一幅图中画多条对比曲线:


用两个results.txt在一幅图中画2条对比曲线
# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np


column = ['epoch', 'train_GIOU_loss', 'train_obj_loss', 'train_cls_loss', 'total', 'target', 'img_size', 'precision',
          'recall', 'MAP@0.5', 'F1', 'val_GIOU_loss', 'val_obj_loss', 'val_cls_loss']


def plot_result(result1, result2, title, yl):
    ind = column.index(title)  # 获取索引
    plt.rcParams['font.sans-serif'] = 'Times New Roman'
    plt.figure(figsize=(10, 8), dpi=400)
    x = result1[range(0, 60, 5), 0]
    y1 = result1[range(0, 60, 5), ind]
    y2 = result2[range(0, 60, 5), ind]
    line1 = plt.plot(x, y1, color="#8B4513", linewidth=2, label="yolov5", marker='^')
    line2 = plt.plot(x, y2, color="#90EE90", linewidth=2, label="advanced yolov5", marker='^')
    plt.xticks(range(0, 60, 5), fontsize=14)
    plt.yticks(fontsize=14)
    plt.xlabel('epoch', fontsize=16)
    plt.ylabel(yl, fontsize=16)
    plt.legend(loc="best", fontsize=16, frameon=False)
    plt.savefig('总损失对比图')
    plt.show()


# 获取results文件中的有效列并且新增epoch序号列
def result2matrix(result_dir, epoch_num):
    data = np.genfromtxt(result_dir)
    result = data[0:epoch_num + 1, 2:15]  # 获取数据
    print(f"\n一共{len(result)}个epoches的结果")
    epoch = np.arange(len(result))  # 生成epoch序号
    epoch = epoch.reshape(len(result), 1)
    result = np.hstack((epoch, result))  # 新添一列epoch
    return result


def plot_yolov5_curves(txt_dir1, txt_dir2):
    output1 = result2matrix(txt_dir1, epoch_num=60)
    output2 = result2matrix(txt_dir2, epoch_num=60)
    plot_result(output1, output2, 'total', 'total_loss')



'''
一共11个图,可根据自己要求拓展
'''
if __name__ == '__main__':
    dir1 = "results1.txt"
    dir2 = "results2.txt"
    plot_yolov5_curves(dir1, dir2)
用一个results.txt在一幅图中画多条对比曲线:
# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np


column = ['epoch', 'train_GIOU_loss', 'train_obj_loss', 'train_cls_loss', 'train_landmark_loss', 'total', 'target', 'img_size', 'precision',
          'recall', 'MAP@0.5', 'F1', 'val_GIOU_loss', 'val_obj_loss', 'val_cls_loss']

# 同一幅图中画多条曲线
def plot_result(result1, yl):
    ind1 = column.index('train_GIOU_loss')  # 获取giou索引
    ind2 = column.index('train_obj_loss')  # 获取obj索引索引
    ind3 = column.index('train_cls_loss')  # 获取cls索引
    ind4 = column.index('train_landmark_loss')  # 获取landmark索引
    ind5 = column.index('total')  # 获取total索引
    plt.rcParams['font.sans-serif'] = 'Times New Roman'
    plt.figure(figsize=(10, 8), dpi=400)
    x = result1[range(0, 200, 10), 0]
    # 每条损失曲线对应的y值
    y1 = result1[range(0, 200, 10), ind1]
    y2 = result1[range(0, 200, 10), ind2]
    y3 = result1[range(0, 200, 10), ind3]
    y4 = result1[range(0, 200, 10), ind4]
    y5 = result1[range(0, 200, 10), ind5]

    # 画giou
    line1 = plt.plot(x, y1, color="#6F80BE", linewidth=2, label="CIoU_loss", marker='^')
    # 画obj
    line2 = plt.plot(x, y2, color="#67C2A3", linewidth=2, label="obj_loss", marker='8')
    # 画cls
    line3 = plt.plot(x, y3, color="#FC8A61", linewidth=2, label="cls_loss", marker='s')
    # 画landmark
    line4 = plt.plot(x, y4, color="#E889BD", linewidth=2, label="landmark_loss", marker='D')
    # 画total
    line5 = plt.plot(x, y5, color="#C82423", linewidth=2, label="total_loss", marker='>')

    plt.xticks(range(0, 200, 10), fontsize=14)
    plt.yticks(fontsize=14)
    plt.xlabel('epoch', fontsize=16)
    plt.ylabel(yl, fontsize=16)
    plt.legend(loc="best", fontsize=16, frameon=False)
    plt.savefig('损失对比图')
    plt.show()


# 获取results文件中的有效列并且新增epoch序号列
def result2matrix(result_dir, epoch_num):
    data = np.genfromtxt(result_dir)
    result = data[0:epoch_num + 1, 2:16]  # 获取数据
    print(f"\n一共{len(result)}个epoches的结果")
    epoch = np.arange(len(result))  # 生成epoch序号
    epoch = epoch.reshape(len(result), 1)
    result = np.hstack((epoch, result))  # 新添一列epoch
    return result


def plot_yolov5_curves(txt_dir1):
    output1 = result2matrix(txt_dir1, epoch_num=200)
    plot_result(output1, 'loss')

'''
一共11个图,可根据自己要求拓展
'''
if __name__ == '__main__':
    dir1 = "results.txt"
    plot_yolov5_curves(dir1)


示例如下: 

 

<think>好的,我需要帮助用户解决如何将不同YOLO算法的results.txt数据绘制在同一张表上的问题。首先,我得理解用户的需求。他们可能在进行算法对比,想直观地看到不同版本的YOLO训练过程中的指标变化,比如mAP、损失函数等。用户提到了results.txt文件,这些文件通常是在YOLO训练完成后生成的,每个exp目录下有一个,里面记录了训练过程中的各项指标。 接下来,我需要回忆YOLOresults.txt结构。通常,这个文件包含每轮的训练损失、验证损失、mAP等数据,每列对应不同的指标。例如,第一列可能是训练轮数,后面跟着各种损失值和mAP值。用户需要将这些不同算法或不同训练生成的results.txt文件的数据整合到一张上,方便对比。 然后,我得考虑如何实现这一点。用户可能需要使用Python的matplotlib库来绘。首先需要读取各个results.txt文件,提取所需的数据列,然后将这些数据绘制在同一个表中。每个算法对应一条曲线,用不同的颜色或线型区分。 需要注意的是,不同版本的YOLO可能在results.txt中的列顺序或指标名称有所不同,比如YOLOv5YOLOv8可能在列的数量或名称上有差异。因此,用户需要确认每个文件的列对应关系,可能需要手动调整或编写代码自动检测列标题。 另外,用户可能需要处理不同训练轮数的情况。比如有的算法训练了100轮,有的训练了150轮,这时候需要统一x轴的范围,或者在相同轮数范围内比较。或者,用户可能希望将所有数据全部展示,但需要注意对齐。 根据用户提供的引用内容,引用[4]提到可以使用results.csv或result.txt文件绘制mAP对比,并且用户之前可能使用过类似代码生成改进前后的对比。因此,可以参考引用中的代码,可能需要调整路径和数据处理部分,以支持多个文件的读取和绘制。 可能的步骤包括: 1. 收集所有需要对比results.txt文件,确定它们的路径。 2. 使用Python脚本读取每个文件,提取所需的指标数据,比如mAP_0.5。 3. 对每个算法的数据,生成对应的曲线,并标注算法名称。 4. 设置表的标题、坐标轴标签、例等,使表清晰可读。 5. 保存生成的对比。 用户可能需要处理不同文件格式的问题,比如有的文件是空格分隔,有的是制表符分隔,需要正确解析。此外,如果某些文件缺少某些指标,可能需要处理异常情况,比如跳过或填充默认值。 另外,用户可能需要调整代码,以支持不同的指标对比,比如除了mAP_0.5之外,还可能需要对比损失值或其他指标。因此,代码需要具备一定的灵活性,允许用户选择要对比的列。 最后,需要测试代码是否能够正确读取多个文件并生成表,检查数据对齐是否正确,例是否清晰,表是否美观。如果有问题,可能需要调整绘参数,比如线条颜色、样式,表尺寸等。 总结来说,解决这个问题的关键在于正确读取和处理多个results.txt文件的数据,并将它们整合到同一张表中,同时确保表的信息清晰易懂,便于算法性能的对比分析。</think>要绘制多个YOLO算法的`results.txt`数据对比,可按照以下步骤操作: --- ### 一、整理数据文件 1. 将不同YOLO算法生成的`results.txt`文件统一命名(例如`yolov5.txt`、`yolov8.txt`),并放入同一目录 2. 确认每个文件的数据列含义(不同版本YOLO的列顺序可能不同)[^4] --- ### 二、Python代码实现 ```python import matplotlib.pyplot as plt import numpy as np # 配置参数 file_paths = { "YOLOv5": "path/to/yolov5_results.txt", "YOLOv8": "path/to/yolov8_results.txt", "改进YOLO": "path/to/modified_yolo_results.txt" } target_metric = 9 # mAP_0.5通常是第10列(索引9) epoch_col = 0 # 轮次列索引 plt.figure(figsize=(12, 6)) for label, path in file_paths.items(): try: data = np.loadtxt(path) epochs = data[:, epoch_col] metric = data[:, target_metric] plt.plot(epochs, metric, label=label, linewidth=2) except Exception as e: print(f"加载{label}数据失败: {str(e)}") plt.title('不同YOLO算法mAP@0.5对比', fontsize=14, fontweight='bold') plt.xlabel('训练轮次', fontsize=12) plt.ylabel('mAP@0.5', fontsize=12) plt.grid(True, linestyle='--', alpha=0.7) plt.legend(loc='lower right') plt.tight_layout() plt.savefig('yolo_comparison.png', dpi=300) plt.show() ``` --- ### 三、关键说明 1. **列索引确认**: - YOLOv5的`results.txt`列顺序:`epoch | train_loss | val_loss | mAP_0.5 ...`[^4] - 需通过`np.loadtxt`加载后检查列索引 - 建议先用Excel打开文件确认目标指标位置 2. **异常处理**: - 不同版本可能包含不同数量的列 - 使用`try-except`捕获数据格式不一致的情况 3. **可视化优化**: - 使用`linewidth`增加曲线可见性 - 添加网格线提高可读性 - 保存为高分辨率PNG格式(`dpi=300`) --- ### 四、效果扩展 1. 多指标对比:可同时绘制多个指标(如训练损失、验证损失) 2. 数据平滑:添加滑动平均处理噪声数据 ```python window_size = 3 smoothed = np.convolve(metric, np.ones(window_size)/window_size, mode='valid') plt.plot(epochs[window_size-1:], smoothed) ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一鹿向晗99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值