利用MMRotate编写自己的模型,运行时出现了本篇文章题目中的错误,通过搜集解决方案,发现该问题存在着多种可能的原因,不同原因对应的解决方案也不相同,因此用本篇文章记录一下解决思路。
error:“xxxxx is not in the model registry”
该error的意思时xxxxx模型未在已注册模型中
解决方案
1、检查是否按照要求进行了模型的注册
在MMRotate或MMDetection项目中正常注册一个模型时,通常需要注意以下两点(以模型RefineSingleStageDetector为例):
①. 检查模型前是否有@MODELS.register_module(), 没有注册的要进行添加
②. 检查__init__.py文件中是否进行导入,如下图所示(注意红线对应的代码)
2、更新完代码后是否重新进行了本地安装
在利用configs创建模型时,调用的是环境里面的mmrotate,如果更新代码与环境中的不会自动同步,那么在更新完代码后就需要重新进行本地安装,操作起来也相当简单:
①win+r,输入cmd进入windows控制台命令窗口并激活你所用的虚拟环境;
②cd到你更改代码后的mmrotate项目文件夹下,输入python setup.py install重新进行安装。
我这里安装成功的界面如下:
3、检查config文件中所写的模型与注册时的模型是否一致
这个问题看起来比较奇怪,这里举一个例子就理解了。比如我在MMRotate项目文件夹的config文件中所用model的type为RTMDet,但是实际注册是在mmdet中,此时我应该使用mmdet.RTMDet而不是RTMDet,如下图
此处的例子仅为解释问题,可能与代码的实际情况不相符,酌情参考。
解决方法有两种:
①直接在config文件中修改model的type,根据模型的实际注册情况决定采用mmdet.xxx还是xxx
②根据config文件去修改模型注册信息,比如config中采用的是mmdet.xxx,那么注册模型时所用的MODELS就必须是从mmdet中导入的,即:
from mmdet.registry import MODELS
@MODELS.register_module()
class xxx():
......
如果config中采用的是xxx,那么注册模型时所用的MODELS必须时从mmrotate中导入:
from mmrotate.registry import MODELS
@MODELS.register_module()
class xxx():
......
一句话概括就是config中model的type要与模型注册时所用的基准库保持一致。
4、非常有用但还没彻底搞清楚的解决方法
在运行的代码中,比如运行train.py可以直接在main函数中添加下列代码:
from mmrotate.utils import register_all_modules
register_all_modules(init_default_scope=True)
该方法亲测好用有效,放心食用。