YOLOX训练VOC数据集后使用eval.py验证best_ckpt.pth报错

YOLOX验证eval.py文件报错size mismatch for head.cls_preds.0.weight: copying a param with shape torch.Size([20, 96, 1, 1]) from checkpoint, the shape in current model is torch.Size([80, 96, 1, 1]).

YOLOX训练VOC数据集后使用eval.py验证best_ckpt.pth报错_第1张图片

一开始我以为是自己yolo_voc_s.py文件中的参数配置出错了,但是检查之后发现并没有问题。

最后对比了训练和验证日志发现,两个文件加载的同一个模型在头部中的cls类别数竟然不一样;因为是训练的VOC数据集,所以训练的train_log.txt中显示模型输出的cls类别数就是20,但是在使用eval.py验证同一个模型训练出来的文件下的best_ckpt.pth权重文件,val_log.txt显示模型输出的cls类别却是80????我仔细对比过,除了这个cls_preds中卷积的参数不对以外,其他的结构都是完全一样的,太奇怪了,一直找不到问题出现在哪里。

已尝试过的几种方法

(1)看了网上其他博主的解答,说是需要修改yolo.py文件中head = YOLOXHead(80)为head = YOLOXHead(20),而且参数配置应该是在yolox_voc_s.py文件里才对,按理来说跟yolox.py关系应该不大,但是该方法我还是试过了,还是报一样的错误,未解决。

(2)还有些博主说是因为权重文件选错了,验证VOC的但是路径写成了COCO训练的权重文件,所以80和20不匹配,当然会报错了,但是我确认,我就是调用的同一个模型训练出来当前文件夹下面保存的best_ckpt.pth权重文件,路径没有写错,还是报一样的错误,未解决。

(3)还有写博主说要修改coco_classs.py文件中的类别参数,我也试着修改了,但是训练VOC数据集调用的应该是voc.py和voc_class.py才对,对于coco的数据集参数应该不影响呀,于是受到启发,我尝试了把coco_class.py改成voc的类别参数和把voc_class.py改成coco的类别参数,两种方法都不行,还是报一样的错误,未解决。

一直找不到解决方法

因为之前有训练过原始的YOLOX在VOC上训练的结果,我用当时训练的VOC的权重文件也进行了验证,发现还是报一样的错误,训练输出的模型cls参数是20,但是调用该best_ckpt.pth权重文件验证输出的模型cls参数却是80,所以我猜测应该是在调用eval.py过程中的某个机制出现了问题,但是不知道怎么解决。

我仔细看了launch.py文件和eval.py文件中,也没有任何关于num_class的参数设置,所以到底问题应该是出在哪里。

YOLOX训练VOC数据集后使用eval.py验证best_ckpt.pth报错_第2张图片

终于解决

在第二天,我从头到尾看了一遍代码和程序命令,终于找到了问题,我傻了,我居然把调用训练VOC的工程文件的路径写错了!写成调用训练COCO数据集的工程文件了!!因为在工程文件中训练VOC的设置的参数类别是20,而在COCO中设置的类别是80。

这也说明了一个问题,YOLOX的开源项目的输出以及底部的网络架构都是受工程文件控制的,在VOC数据集上已经训练好的权重文件是20个类别,但是如果调用的工程文件与权重文件不匹配的话,也是会报错运行不起来的,还是说明是依靠的底层的配置文件,并不是读取的已经训练好的权重文件的参数。

你可能感兴趣的:(深度学习,人工智能,pytorch,目标检测,python)