经常遇到KeyError: "XXX: 'Model is not in the backbone registry的报错。因为只要引用了带有registry注解的文件,就会将其注册到mmdet中,一开始我以为mmdet不支持重复引用文件引发的重复注册。但测试了一下发现是支持的,究其原因是注册了不同文件下的同一个类。
我的场景是使用develop的方式本地安装了mmdet。
work_dir\ mmdet\ abc.py
abc.py内既通过相对路径的方式引用了mmdet,又通过from mmdet.xxx的方式引用了mmdet,此时不会报错。然后在另一目录下又复制了当前work_dir,再运行abc.py就会报错,因为此时相对路径和from引用的不是同一个mmdet库,尽管代码内容相同依然会报重复注册。
解决方法就是禁止对mmdet的相对路径的引用,完全从包中进行引用。