Read on Omnivore
Read Original

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_archGeneralizedRCNN,那么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函数,主要包括如下步骤:

阅读更多