关于数据集格式可以看我的上一篇博客。
PIDnet自己的数据集制作好后,当开始训练有可能会报错(我发现好多人都会有这个错)
RuntimeError: weight tensor should be defined either for all or no classes
或者是
IndexError: index -1 is out of bounds for dimension 0 with size 0
当我们去网上搜索的时候,一般会说pred
张量的大小为 0,这意味着在尝试访问 pred
张量中的元素时,代码试图访问一个无效的索引。
具体来看,我们有几个要查看的地方:
一、类别数问题
我们要确保权重张量的大小与类别数一致,假如你有 10 个类别,那么权重张量的形状应该是 [10]
。在PV.py文件下找到下面这段代码,更改里面的类别数,假如说只有一类(不包括背景),那么就是{0:0,1:1},如果是两类(不包括背景),那就是{0:0,1:1,2:2}
关于self.class_weights的数值需要计算参考上面博客。
self.label_mapping = {0:0, 1:1}
self.class_weights = torch.FloatTensor([0.99521856,1.00478144]).cuda()
二、数据集命名问题
debug代码的时候会发现criterion.py文件中以及utils.py文件中的的代码会报错,是关于self.min_kept
的值可能不适合当前的上下文,导致其值大于 pred
的元素数量的问题。
其实就是数据集命名的问题,你要确保你的图片命名是从数字0开始的,依次往下命名。
如果你是从数字1开始的,那么最后一张图片的数字就会超过数组索引的范围,这个方法是最快的,比去修改criterion.py和utils.py的代码好得多,本人亲测有效!也是大多数人报错IndexError: index -1 is out of bounds for dimension 0 with size 0的主要问题!希望大家能够尽快解决问题!