detectron2学习:KeyError: “No object named ‘XXXXX‘ found in ‘BACKBONE‘ registry!“

问题来源:在使用FB的框架detectron2改写模型的时候碰到了KeyError: "No object named 'XXXXX' found in 'BACKBONE' registry!"的bug。

detectron2学习:KeyError: “No object named ‘XXXXX‘ found in ‘BACKBONE‘ registry!“

分析:detectron2中自定义的模型都需要注册,这一点官方的文档中已经提到,上图是官方给出的标准模型注册code,我照着官方文档改写代码还是报错,我的代码如下:

detectron2学习:KeyError: “No object named ‘XXXXX‘ found in ‘BACKBONE‘ registry!“

可以看到,我已经像文档所说的那样使用装饰器注册了我自己的backbone,但是运行train_net.py还是会报错找不到自定义的backbone。

再次翻看detectron2官方给出的TridentNet的代码,并没有发现有什么不一样,上图:

detectron2学习:KeyError: “No object named ‘XXXXX‘ found in ‘BACKBONE‘ registry!“

我的代码也是仿照着TridentNet的结构写的,所以应该不会有大的问题,但是有一个小细节引起了我的注意,这个细节是TridentNet的目录结构:

detectron2学习:KeyError: “No object named ‘XXXXX‘ found in ‘BACKBONE‘ registry!“

可以看到TridentNet中有一个文件叫做init.py,这个文件是做什么的大家可以自行百度python工程中init.py的作用,这里不再赘述。

再次查询github:

detectron2学习:KeyError: “No object named ‘XXXXX‘ found in ‘BACKBONE‘ registry!“

开发者给出的回答是代码没有导入,其实问题已经浮现出来了,其实就是你虽然装饰了你的backbone或者模型,但是根本就没有执行你的那段代码,我的代码结构如下:

detectron2学习:KeyError: “No object named ‘XXXXX‘ found in ‘BACKBONE‘ registry!“

造成这个的原因是因为新建net这个文件夹的时候选择的是directory而不是python package,区别就是会不会为你生成init.py,区别不再赘述,所以自己弄一个,或者重新新建,把net文件改为python package,改完如下:

detectron2学习:KeyError: “No object named ‘XXXXX‘ found in ‘BACKBONE‘ registry!“

 

在init.py里面导入自己写的模块:

detectron2学习:KeyError: “No object named ‘XXXXX‘ found in ‘BACKBONE‘ registry!“

再在自己的训练文件train_net.py里导入net时,就会将它视为一个package并执行_init_.py

detectron2学习:KeyError: “No object named ‘XXXXX‘ found in ‘BACKBONE‘ registry!“

这样你注册的模型的那段代码才得到了执行。

这样问题得以解决,造成这个问题的原因还是自己的python基础太过薄弱,早就注意到了TridentNet的目录里有init文件,不知道有什么在作用放着没管,结果最后确实是这个问题造成的bug。