Link
Highlights&&Note
首先介绍
detectron2
中使用的registry
机制
Trainer
中初始化模型调用的接口是build_model
函数,通过modeling/__init__.py
可以知道它是在modeling/meta_arch/build.py
中定义的。但是在阅读build.py
的过程中,我们发现它使用了一个叫做Registry
的东西——那么什么是Registry
呢?
Registry
机制来自于FaceBook计算机视觉研究组的常用函数库fvcore
,其中Registry
的源代码和解读可见registry。它的主要作用是提供了用字符串调用类方法的接口,具体的函数是registry
中的get
方法。个人感觉registry.get()
非常像一个getattr
方法,它能够通过字符串访问类的方法。
例如我们有一个具体的网络结构,定义在
modeling/meta_arch/rcnn.py
中的GeneralizedRCNN
。注意在它的定义上方有一个修饰器@META_ARCH_REGISTRY.register()
,意思就是把GeneralizedRCNN
注册到META_ARCH_REGISTRY
中。那么在modeling/meta_arch/build.py
中的model = META_ARCH_REGISTRY.get(meta_arch)(cfg)
中,只要我们设置meta_arch
为GeneralizedRCNN
,那么META_ARCH_REGISTRY.get(meta_arch)
就调用了GeneralizedRCNN
方法,也就因此初始化了模型。
- 指定名字来调用模型
用@ 修饰器在META_ARCH_REGISTRY中注册
再在参数中写入名称即可实现初始化*
registry
的几个要点
- 创建一个
registry
,设置可能的调用的类的名字 - 对于想加入到
registry
中的类,在定义的时候通过修饰器指定 - 调用类方法的时候通过
get(name)
- 通过
fvcore
中的源代码,我们可以知道如何写python
修饰器。
Faster-RCNN
的结构主要包含如下几个部分,而这几个部分也是GeneralizedRCNN
在初始化部分的输入:
backbone
:从图片提取特征表示的卷积神经网络结构,比如说ResNet。proposal_generator
:从图片的特征预测“哪里可能有物体”roi_head
:以proposal_generator
部分预测的有物体区域为基础,预测物体的类别和检测框坐标
与
__init__
功能相似的是from_config
函数,它用config文件初始化模型,通过这个函数我们知道了实际构造backbone、proposal_generator和roi_head的函数分别都是来自对应文件夹的build_xxx
函数。
RCNN
模型处理函数的过程,我们主要关注forward
函数,主要包括如下步骤: