利用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)

该方法亲测好用有效,放心食用。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐