[mapa, perda, pr, desenho F1 no resultado da série YOLO] use matplotlib para desenhar o arquivo de resultado gerado após o treinamento de acordo com v5, v8, v7

1. Renderização

insira a descrição da imagem aqui

2. Conheça o conteúdo do resultado

2.1 Resultado do YOLOv7.txt

0/299      14.7G         0.07522         0.009375          0.02266          0.1073                    58            640           0.0002958    0.1458   0.0002676     4.469e-05          0.1005          0.01098       0.02545
训练轮数   GPU消耗     train/box_loss   train/obj_loss    train/cls_loss  train/total_loss     本轮中数据中目标数量   输入图片大小         P          R         mAP@.5     mAP@.5:.95        val/Box_loss  val/obj_loss   val/cls_loss

insira a descrição da imagem aqui

2.2 YOLOv5 | YOLOv8 result.csv (cada coluna tem o mesmo significado)

O significado de cada coluna é o mesmo , provavelmente porque o mesmo autor escreveu o código, então o conteúdo salvo de result.csv não mudou

YOLOv5

insira a descrição da imagem aqui

YOLOv8

insira a descrição da imagem aqui

3. Código (somente mapa e perda)

  • O que precisa ser alterado : apenas o conteúdo, cada linha representa eresult_dict模型名称该模型训练得到的result文件地址
  • Ambos v5 e v8 estão csvno formato e v7 está txtno formato
  • Pontos-chave a serem observados : No código a seguir 关于下标的注释位置, os subscritos são todos 0incrementados do início para a direita
  • plt.savefig("mAP50.png", dpi=600)# dpi pode ser definido como 300/600/900, o que significa salvar como uma imagem vetorial de alta definição
  • data = pd.read_csv(res_path, usecols=[6]).values.ravel()Indica que depois de ler csvo arquivo, pegue apenas o 6valor da coluna subscrita valuese ravel()achate o valor em uma matriz unidimensional (se você quiser desenhar result.csv/result.txtoutros valores, basta alterar o subscrito correspondente diretamente. Por exemplo, se você quiser desenhar train/box_loss, Em seguida, 绘制map50altere 6 para 1 e altere 10 para 2)
  • plt.plot(x, data, label=modelname, linewidth='1')# A espessura da linha é definida como 1
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

if __name__ == '__main__':
    # 列出待获取数据内容的文件位置
    # v5、v8都是csv格式的,v7是txt格式的
    result_dict = {
    
    
        'YOLOv5m': r'C:\Users\dadandan\Desktop\workspace_temp\NeimengA_train_resultcsv\yolov5m\results.csv',
        'YOLOv7': r'C:\Users\dadandan\Desktop\workspace_temp\NeimengA_train_resultcsv\yolov7\results.txt',
        'YOLOv7-tiny': r'C:\Users\dadandan\Desktop\workspace_temp\NeimengA_train_resultcsv\yolov7-tiny\results.txt',
        'YOLOv7-tiny-large': r'C:\Users\dadandan\Desktop\workspace_temp\NeimengA_train_resultcsv\yolov7-tiny-large\results.txt',
        'YOLOv7-tiny-PConv': r'C:\Users\dadandan\Desktop\workspace_temp\NeimengA_train_resultcsv\yolov7-tiny-PConv\results.txt',
        'YOLOv7-tiny-GhostNetv2': r'C:\Users\dadandan\Desktop\workspace_temp\NeimengA_train_resultcsv\yolov7-tiny-GhostNetv2\results.txt',
        # 'YOLOv8s': r'C:\Users\dadandan\Desktop\workspace_temp\NeimengA_train_resultcsv\yolov8s\results.csv',
        'YOLOv7-tiny-large-GhostNetv2': r'C:\Users\dadandan\Desktop\workspace_temp\NeimengA_train_resultcsv\yolov7-tiny-large-GhostNetv2\results.txt',
        'YOLOv7-GhostNetv2': r'C:\Users\dadandan\Desktop\workspace_temp\NeimengA_train_resultcsv\yolov7-GhostNetv2\results.txt',
        'YOLOv7-FasterNet': r'C:\Users\dadandan\Desktop\workspace_temp\NeimengA_train_resultcsv\yolov7-FasterNet\results.txt'
    }

    # 绘制map50
    for modelname in result_dict:
        res_path = result_dict[modelname]
        ext = res_path.split('.')[-1]
        if ext == 'csv':
            data = pd.read_csv(res_path, usecols=[6]).values.ravel()    # 6是指map50的下标(每行从0开始向右数)
        else:   # 文件后缀是txt
            with open(res_path, 'r') as f:
                datalist = f.readlines()
                data = []
                for d in datalist:
                    data.append(float(d.strip().split()[10]))   # 10是指map50的下标(每行从0开始向右数)
                data = np.array(data)
        x = range(len(data))
        plt.plot(x, data, label=modelname, linewidth='1')   # 线条粗细设为1

    # 添加x轴和y轴标签
    plt.xlabel('Epochs')
    plt.ylabel('[email protected]')
    plt.legend()
    plt.grid()
    # 显示图像
    plt.savefig("mAP50.png", dpi=600)   # dpi可设为300/600/900,表示存为更高清的矢量图
    plt.show()


    # 绘制map50-95
    for modelname in result_dict:
        res_path = result_dict[modelname]
        ext = res_path.split('.')[-1]
        if ext == 'csv':
            data = pd.read_csv(res_path, usecols=[7]).values.ravel()    # 7是指map50-95的下标(每行从0开始向右数)
        else:
            with open(res_path, 'r') as f:
                datalist = f.readlines()
                data = []
                for d in datalist:
                    data.append(float(d.strip().split()[11]))   # 11是指map50-95的下标(每行从0开始向右数)
                data = np.array(data)
        x = range(len(data))
        plt.plot(x, data, label=modelname, linewidth='1')

    # 添加x轴和y轴标签
    plt.xlabel('Epochs')
    plt.ylabel('[email protected]:0.95')
    plt.legend()
    plt.grid()
    # 显示图像
    plt.savefig("mAP50-95.png", dpi=600)
    plt.show()

    # 绘制训练的总loss
    for modelname in result_dict:
        res_path = result_dict[modelname]
        ext = res_path.split('.')[-1]
        if ext == 'csv':
            box_loss = pd.read_csv(res_path, usecols=[1]).values.ravel()
            obj_loss = pd.read_csv(res_path, usecols=[2]).values.ravel()
            cls_loss = pd.read_csv(res_path, usecols=[3]).values.ravel()
            data = np.round(box_loss + obj_loss + cls_loss, 5)    # 3个loss相加并且保留小数点后5位(与v7一致)

        else:
            with open(res_path, 'r') as f:
                datalist = f.readlines()
                data = []
                for d in datalist:
                    data.append(float(d.strip().split()[5]))
                data = np.array(data)
        x = range(len(data))
        plt.plot(x, data, label=modelname, linewidth='1')

    # 添加x轴和y轴标签
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.legend()
    plt.grid()
    # 显示图像
    plt.savefig("loss.png", dpi=600)
    plt.show()

4. Para desenhar PR e F1, consulte este artigo

Acho que você gosta

Origin blog.csdn.net/LWD19981223/article/details/130017781#comments_27795997
Recomendado
Clasificación