yolov5 数据集训练报错

在yolov5训练过程种报错,yaml基本上都改了,还是出错 yolov5 4.0版本


Using 8 dataloader workers
Logging results to runs\train\exp8
Starting training for 3 epochs...

     Epoch   gpu_mem       box       obj       cls     total   targets  img_size
       0/2        0G    0.1159   0.02669         0    0.1426       106       640: 100%|██| 1/1 [00:43<00:00, 43.92s/it]
               Class      Images     Targets           P           R      mAP@.5  mAP@.5:.95: 100%|█| 1/1 [00:03<00:00,
                 all           9           0           0           0           0           0

     Epoch   gpu_mem       box       obj       cls     total   targets  img_size
       1/2        0G    0.1154    0.0262         0    0.1416       107       640: 100%|██| 1/1 [00:41<00:00, 41.11s/it]
               Class      Images     Targets           P           R      mAP@.5  mAP@.5:.95: 100%|█| 1/1 [00:03<00:00,
                 all           9           0           0           0           0           0

     Epoch   gpu_mem       box       obj       cls     total   targets  img_size
       2/2        0G    0.1144   0.02634         0    0.1407       110       640: 100%|██| 1/1 [00:42<00:00, 42.92s/it]
               Class      Images     Targets           P           R      mAP@.5  mAP@.5:.95:   0%| | 0/1 [00:02<?, ?it
Traceback (most recent call last):
  File "train.py", line 519, in <module>
    train(hyp, opt, device, tb_writer, wandb)
  File "train.py", line 342, in train
    results, maps, times = test.test(opt.data,
  File "C:\Users\Lenovo\Desktop\yolov5-4.0\test.py", line 181, in test
    confusion_matrix.process_batch(pred, torch.cat((labels[:, 0:1], tbox), 1))
  File "C:\Users\Lenovo\Desktop\yolov5-4.0\utils\metrics.py", line 148, in process_batch
    self.matrix[gc, self.nc] += 1  # background FP
IndexError: index 15 is out of bounds for axis 0 with size 2



img


该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据报错信息来看,您的问题是出现了 IndexError 异常,说明出现了数组索引越界的问题。根据具体信息来看,utils\metrics.py 文件中第 148 行代码出现了问题,具体来说是 self.matrix[gc, self.nc] += 1,其中 gc 的值是 15,但是 self.matrix 的第一维度只有 2 个元素,因此索引越界了。
-
建议您检查一下 utils\metrics.py 文件,看看这个文件中 self.matrix 数组的定义和初始化是否正确,是否与您的实际情况相符。如果是,那么可能需要调试一下代码,找出为什么 gc 的值会出现 15,以及为什么 self.nc 的值会超出数组索引范围。

如果您已经尝试修改了YAML文件但仍然遇到问题,则可能需要检查以下几个方面:

  1. 数据集路径是否正确:请确保数据集路径在YAML文件中正确设置,并且文件路径和文件名均正确。
  2. 训练配置是否合适:您需要根据您的数据集调整训练配置,例如学习率、批次大小等。如果配置不合适可能会导致训练过程出现问题。
  3. GPU是否正常运行:请检查GPU是否正常运行,并且与YAML文件中的GPU设置一致。
  4. 是否使用正确的Yolo版本:请确保您使用的Yolo版本与您的YAML文件中的版本相同。

如果以上几点都已经检查过了,还是出现错误,可以考虑调试代码或寻求更详细的错误信息。

该回答引用ChatGPT

这个错误表明,在 confusion_matrix.process_batch() 函数中出现了索引错误。具体来说,该错误指出您的代码正在尝试在 self.matrix 数组的第一维上使用索引 15,而该维的长度只有 2,因此超出了数组的范围。


这个错误通常意味着您的模型输出与您的数据集不兼容。请检查您的数据集的类别数量和您的模型输出的类别数量是否匹配。特别是,您应该确保模型输出中的类别数量(包括背景类)与数据集中的类别数量相同。


如果您已经检查了数据集和模型输出,并且确定它们匹配,那么可能是由于其他问题导致的。在这种情况下,您可能需要进一步调试代码,以查找出问题所在。您可以尝试添加调试输出或使用调试器来帮助诊断问题。

参考GPT和自己的思路,根据报错信息可以看出是在计算 confusion matrix 时出现了 IndexError,即某个索引超出了数组的范围。具体来说,错误是在 utils/metrics.py 文件的 process_batch 函数中的第 148 行产生的,由于输入数据出现了意料之外的值,导致数组越界。

在这个问题中,IndexError: index 15 is out of bounds for axis 0 with size 2 说明 self.matrix 的第一维长度为 2,但是在计算 confusion matrix 时要更新的索引却是 15,超出了数组的范围。因此,这可能与训练数据中存在不合法的标签有关。

建议检查训练数据的标签是否正确,确保每个标签的类别索引不超过模型允许的最大值。也可以查看模型的配置文件,确认模型允许的类别数是否正确配置。
你可以修改 utils/metrics.py 文件中的 ConfusionMatrix 类,将 self.matrix 的第一维度大小修改为需要的值。具体来说,可以将如下代码:

self.matrix = np.zeros((self.nc + 1, self.nc + 1), dtype=int)  # confusion matrix

修改为:

self.matrix = np.zeros((16, 16), dtype=int)  # confusion matrix

其中 16 是类别数加 1,因为还需要一个背景类别。修改后,重新运行训练脚本,应该可以解决这个问题。

你好,我参考了ChatGPT作如下解答,希望能帮你解决这个问题。
这个错误通常是由于YAML文件中指定的类别数目与训练数据中实际的类别数目不匹配引起的。你可以检查以下几个方面:

  1. 检查你的YAML文件中 nc 参数的数值是否正确,该参数表示类别的数量。确保它与你的数据集中实际的类别数量相同。

  2. 确认你的训练数据中的每个标注框是否都指定了正确的类别。如果有标注框没有指定类别,或者指定的类别与你在YAML文件中指定的类别不匹配,那么训练过程就会出现错误。

  3. 确认你的YAML文件中的类别名称是否正确。如果类别名称与训练数据中标注框的类别名称不匹配,训练过程也会出现错误。

如果你已经检查过上述几个方面,但问题仍然存在,你可以尝试更新YoloV5的版本或者参考YoloV5的官方文档,寻找可能的解决方案。

该回答引用ChatGPT

可以看到训练已经完成了三个 epochs,但在测试阶段出现了一个错误。

错误信息显示在 metrics.py 文件中的 process_batch 函数中,发生了一个索引错误,它指出索引 15 超出了数组的大小 2。这表明您的数据集中有 15 个类别,但您的模型只识别 2 个类别。

这个问题可能是由于以下原因导致的:

1、检查您的数据集注释文件中的类别数是否正确。

2、检查您的 YAML 文件中的类别数是否正确。

3、检查您的模型配置文件中的类别数是否正确。

IndexError: index 15 is out of bounds for axis 0 with size 2
IndexError:索引15超出大小为2的轴0的范围
根据报错含义,以及借鉴他人分析实例,主要去检查:代码中是索引错了, 还是数组长度定义错了。
链接:https://blog.csdn.net/weixin_44493244/article/details/105968388

索引超出了列表的长度。
eg1:

import numpy as np
a = np.empty(1)
print(a[1])

IndexError: index 1 is out of bounds for axis 0 with size 1

1
2
3
4
eg2:

import numpy as np
a = np.empty(3)
print(a[5])

IndexError: index 5 is out of bounds for axis 0 with size 3

1
2
3
4
解决方法:
检查是自己的索引错了, 还是数组长度定义错了。
————————————————
版权声明:本文为CSDN博主「sweettea~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sweet_tea_/article/details/128514919