成功解决运行YOLOX训练日志文件数据画图报错
ValueError: x and y must have same first dimension, but have shapes (100,) and (0,)

在运行YOLOX使用的代码时报错

该代码参考的是这位博主的,链接和实现的效果如下:https://blog.csdn.net/weixin_45679938/article/details/122380063

我添加了自己想要的代码后报错

这位博主给出的代码中只读取了COCO数据集上APM和APL的值,并没有画出APS的值,于是我便照葫芦画瓢添加了读取APS的代码,但是报错了。

import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
import numpy as np
fi_1 = open('YOLOX_outputs/outputs/coco_s_train_log.txt','r', encoding='utf-8')#,encoding='utf-8')  # ################################ 1、修改路径
epoch_nums = 100  # ###################### 2、修改对应自己的训练总epoch数(对应下面x坐标)
lines = fi_1.readlines()
list_AP = []
list_AP50 = []
list_AP75 = []
list_APS = []
list_APM = []
list_APL = []
list_AR100 = []
for line in lines:
    if 'Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ]' in line:
        # print(line[-6:])
        list_AP.append(float(line[-6:]))
    elif 'Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ]' in line:
        # print(line[-6:])
        list_AP50.append(float(line[-6:]))
    elif 'Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ]' in line:
        # print(line[-6:])
        list_AP75.append(float(line[-6:]))
    elif 'Average Precision  (AP) @[ IoU=0.50:0.95 | area=small | maxDets=100 ]' in line:
        # print(line[-6:])
        list_APS.append(float(line[-6:]))
    elif 'Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ]' in line:
        # print(line[-6:])
        list_APM.append(float(line[-6:]))
    elif 'Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ]' in line:
        # print(line[-6:])
        list_APL.append(float(line[-6:]))
    elif 'Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ]' in line:
        # print(line[-6:])
        list_AR100.append(float(line[-6:]))
print(list_AP)
print(list_AP50)
print(list_AP75)
print(list_APS)
print(list_APM)
print(list_APL)
print(list_AR100)
plt.rc('font', family='Times New Roman', size=13)  # 全局中英文为字体“罗马字体”
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
x = np.arange(0, epoch_nums, 1) ######################################### 对应自己epoch
plt.plot(x, list_AP, label="AP(IOU=0.5:0.95)")
plt.plot(x, list_AP50, label="AP(IOU=0.5)")
plt.plot(x, list_AP75, label="AP(IOU=0.75)")
plt.plot(x, list_APS, label="AP(small)")
plt.plot(x, list_APM, label="AP(medium)")
plt.plot(x, list_APL, label="AP(Large)")
plt.plot(x, list_AR100, label="AR(maxDets=100)")
plt.xlabel("Epoch")
plt.xlim(0, epoch_nums) #################################################### 同上
x_major_locator = MultipleLocator(5)  # 把x轴的刻度间隔设置为10,并存在变量里 ############################### 设置坐标轴间隔
ax = plt.gca()
ax.xaxis.set_major_locator(x_major_locator)
plt.grid(True)
plt.legend(loc="lower right")
plt.show()

报错信息在这里插入图片描述

这是在读取YOLOX模型的训练日志,报出的错误。

解决方法

经过对代码的解读,于是发现了问题,博主从.txt日志文件中读取数据然后存入列表中,并且是通过if else语句中的“Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ]”这一段信息与txt中相同的内容来识别读取的。如果内容一致则读取,并存放到相应的列表中。所以这段内容一定要与txt日志文件中的内容保持一致,才能成功读取。我发现我添加的读取APS的代码就是因为代码中的这段识别信息与txt中的没有保持一致,所以没有读取成功,也就是说得到的APS列表中是空的。
这是报错的代码:在这里插入图片描述
这是txt日志文件中某个epoch训练完成后得到的信息:在这里插入图片描述
对比两段信息,就会发现“small”前面少了一个空格,两段识别的信息不一致,所以APS列表中的值当然就为空,执行画图的时候就会报错。

这个代码作图的x轴表示的训练的epoch=100,y轴表示的是每个类别的数据值。读取失败的APS列表是空的,所以就读取到了0个值,而我们作图需要的是100个APS的值,所以就报错了。报错“x和y必须具有相同的第一维度,但具有形状(100)和(0)”,所以作图失败。

成功运行结果展示

在这里插入图片描述
运行成功之后就会得到所有我们需要的数据值,然后对每个数据依次进行画图操作,救可以得到右上角图的效果。

问题成功解决!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐