androidstudio4.1.1 build model卡主_Detectron2源码阅读笔记-(二)Registry&build_*方法

2023-05-16

Trainer解析

我们继续Detectron2代码阅读笔记-(一)中的内容。

上图画出了detectron2文件夹中的三个子文件夹(tools,config,engine)之间的关系。那么剩下的文件夹又是如何起作用的呢?

def main(args):
    cfg = setup(args)

    if args.eval_only:
        ...
    trainer = Trainer(cfg)
    trainer.resume_or_load(resume=args.resume)
    if cfg.TEST.AUG.ENABLED:
        trainer.register_hooks(
            [hooks.EvalHook(0, lambda: trainer.test_with_TTA(cfg, trainer.model))]
        )
    return trainer.train()

build_*方法

我们从trainer = Trainer(cfg)开始进一步了解。

Detectron2代码阅读笔记-(一)中已经提到过一连串的Trainer的继承关系如下: tools.train_net.Trainer->detectron2.engine.default.DefaultTrainer->detectron2.engine.train_loop.SimpleTrainer->detectron2.engine.train_loop.TrainerBase,而detectron2.engine.default.DefaultTrainer在其__init__(self, cfg)函数中定义了解析cfg。如下面代码所示,cfg会作为参数倍若干个build_*方法解析,得到解析后的model,optimizer,data_loader等。

from detectron2.modeling import build_model
class DefaultTrainer(SimpleTrainer):
    def __init__(self, cfg):
        """
        Args:
            cfg (CfgNode):
        """
        # Assume these objects must be constructed in this order.
        model = self.build_model(cfg)
        optimizer = self.build_optimizer(cfg, model)
        data_loader = self.build_train_loader(cfg)

        ... 

        self.register_hooks(self.build_hooks())

    @classmethod
    def build_model(cls, cfg):
        """
        Returns:
            torch.nn.Module:
        """
        model = build_model(cfg)
        logger = logging.getLogger(__name__)
        logger.info("Model:n{}".format(model))
        return model

下面我们以DefaultTrainer.build_model为例来介绍注册机制,该方法调用了detectron2/modeling/meta_arch/build_model.pybuild_model函数,其源代码如下:

from detectron2.utils.registry import Registry

META_ARCH_REGISTRY = Registry("META_ARCH")
META_ARCH_REGISTRY.__doc__ = """
def build_model(cfg):
    """
    Built the whole model, defined by `cfg.MODEL.META_ARCHITECTURE`.
    """
    meta_arch = cfg.MODEL.META_ARCHITECTURE
    return META_ARCH_REGISTRY.get(meta_arch)(cfg)
  • meta_arch = cfg.MODEL.META_ARCHITECTURE: 根据超参数获得网络结构的名字
  • return META_ARCH_REGISTRY.get(meta_arch)(cfg):META_ARCH_REGISTRY是一个Registry类(这个在后面会详细介绍),可以将这一行代码拆成如下几个步骤:
model = META_ARCH_REGISTRY.get(meta_arch)
return model(cfg)

注册机制Registry

那么Registry到底是什么呢?在分析源代码之前我们先了解一下如何使用它,假如你想自己实现一个新的backbone网络,那么你可以这样做:

首先在detectron2中定义好如下(实际上已经定义了):

# detectron2/modeling/backbone/build.py
BACKBONE_REGISTRY = Registry('BACKBONE')

之后在你创建的新的文件下按如下方式创建你的backbone

# detectron2/modeling/backbone/your_backbone.py
from .build import BACKBONE_REGISTRY

# 方式1
@BACKBONE_REGISTRY.register()
class MyBackbone():
    ...

# 方式2
class MyBackbone():
    ...
BACKBONE_REGISTRY.register(MyBackbone)

Registry源代码如下(有删减):

class Registry(object):
    def __init__(self, name):
        self._name = name
        self._obj_map = {}

    def _do_register(self, name, obj):
        assert (
            name not in self._obj_map
        ), "An object named '{}' was already registered in '{}' registry!".format(name, self._name)
        self._obj_map[name] = obj

    def register(self, obj=None):
        if obj is None:
            # used as a decorator
            def deco(func_or_class):
                name = func_or_class.__name__
                self._do_register(name, func_or_class)
                return func_or_class

            return deco

        # used as a function call
        name = obj.__name__
        self._do_register(name, obj)

    def get(self, name):
        ret = self._obj_map.get(name)
        if ret is None:
            raise KeyError("No object named '{}' found in '{}' registry!".format(name, self._name))
        return ret
  • 首先是__init__部分:
    • self._name则是你要注册的名字,例如对于完整的模型而言,name一般取META_ARCH。当然如果你需要自定义backbone网络,你也可以定义一个Registry('BACKBONE')
    • self._obj_map:其实就是一个字典。以模型为例,key就是你的模型名字,而value就是对应的模型类。这样你在传参时只需要修改一下模型名字就能使用不同的模型了。具体实现方法就是后面这几个函数。
  • register: 可以看到该方法定义了注册的两种方式,一种是当obj==None的时候,使用装饰器的方式注册,另外一种就是直接将obj作为参数调用_do_register进行注册。
  • _do_register:真正注册的函数,可以看到它首先会判断name是否已经存在于self._obj_map了。什么意思呢?还是以backbone为例,我们定义了一个BACKBONE_REGISTRY = Registry('BACKBONE'),然后又定义了很多种backbone,而这些backbone都使用@BACKBONE_REGISTRY.register()的方式注册到了BACKBONE_REGISTRY._obj_map中了,所以才取名为Registry,还是蛮形象的吼。
  • get: 这个其实就是根据key值对字典进行取值。

Detectron2 整体代码架构

虽然Detectron2还有很多部分没有介绍到,但是源代码分析到这应该对整体架构有了一定的理解了,具体的一些细节会在后续的文章中进行分析。现对Detectron2 整体代码架构总结一下:

MARSGGBO♥原创
微信公众号: 【AutoML机器学习】

AutoML机器学习
2019-10-15 13:16:32
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

androidstudio4.1.1 build model卡主_Detectron2源码阅读笔记-(二)Registry&build_*方法 的相关文章

  • 使用 jar 依赖项构建 Android 库项目

    我已经被一个问题困扰了几天 但我不知道如何解决这个问题 我正在处理一个 Android 库项目 该项目正在使用 android sdk 提供的 Android 工具进行编译 在项目内部 我遵循 Android 项目的标准结构 我的 jar
  • 应用程序启动时突然出现 Firebase java.lang.IllegalAccessError

    突然发生崩溃安装后应用程序的初始启动 但只是第一次 第二次打开应用程序后它可以正常工作 我没有更改 firebase 代码 但可能是依赖项 但是到最新版本 所以通常它应该是一个稳定的版本 似乎有一些与 firebase 相关的问题 java
  • 在这个 Spring MVC 展示示例中如何使用 @RequestAttribute 和 @ModelAttribute 注释?

    我对 Spring MVC 还很陌生 这段时间我正在学习Spring MVC 展示 https github com spring projects spring mvc showcase可从 STS 仪表板下载示例 我在理解此示例中如何处
  • ExtJS 4:克隆商店

    我正在尝试找出如何克隆Ext data Store不保留旧的参考 让我用一些代码更好地解释一下 这是源商店 var source Ext create Ext data Store fields name age data name foo
  • 同一数据库的多个实体框架

    我们可以在项目中为同一个数据库创建多个实体框架吗 我想为每个子系统创建实体框架 一些子系统具有共享表 这是可能的 您可以根据需要创建多个 EDMX 文件 但不建议这样做 因为 您不能查询不同模型中的多个表 定义边界将非常困难 因为大多数表都
  • R CMD INSTALL --build package --> “小插图丢失”

    问题 C gt Rcmd exe INSTALL build library C Users local aphalo Documents R win library 3 0 photobiology C gt Rcmd exe INSTA
  • 如何在 C# 中找到已安装应用程序的升级代码?

    我正在使用 Windows Installer API 的 C 包装器WIX 工具集 http wixtoolset org 我用ProductInstallation类来获取有关已安装产品的信息 例如产品代码和产品名称 例如 产品名称 我
  • C++:获取注册表值仅给出第一个字符[重复]

    这个问题在这里已经有答案了 我试图从注册表中获取字符串值 但我只得到第一个字母 HKEY hKey char gamePath MAX PATH if RegOpenKeyEx HKEY CURRENT USER L Software Bl
  • 如何将 django ModelForm 字段显示为不可编辑

    接受我的初步教训django ModelForm 我想让用户能够编辑博客中的条目 BlogEntry has a date postedTime title and content 我想向用户展示一个编辑表单 其中显示所有这些字段 但仅包含
  • 无法为 Windows 构建 OpenH264.lib

    我遵循了中提到的所有说明https github com cisco openh264 https github com cisco openh264但我无法通过 该信息在链接中引用 但相当混乱 替代方式 您可以在 Windows 中使用
  • 构建 OpenCV 时出错 :: MonitorFromRect 未在此范围内声明

    我试图建立OpenCV version 2 4 8与它一起使用CodeBlocks and MinGw 我按照以下指示进行操作here http kevinhughes ca tutorials opencv install on wind
  • Java 中有没有类似 cmake 的工具?

    迄今为止我所知道的最好的Java构建工具似乎是maven 但它仍然没有提供像 cmake 那么多的灵活性 有人知道 java 的类似 cmake 的工具吗 只为您的兴趣 我在 CMake 中开发了 Java 支持 它从 2 8 6 版本开始
  • 如何从视图中使用模型函数? - 拉拉维尔 5.4

    我在模型类中创建了一个函数 它是 public function scopetest query return query gt pluck name 我的控制器代码是 public function index books Book al
  • 如何在 Xcode 构建完成时设置警报?

    我是一名懒惰的 iOS 开发人员 在一个大型 iOS 项目中工作 我已经应用了许多优化来减少项目构建时间 但每次构建都需要超过 10 12 分钟 我开始构建 有时当构建完成时 我会在桌子上睡着 有没有什么方法可以将任何语音 铃声警报与 xc
  • 错误:任务“:app:packageDebug”执行失败 - Java 堆空间

    当我尝试构建 APK 时 我在 Android Studio 日志中收到此错误 错误 任务 app packageDebug 执行失败 Java堆空间 当我尝试在资产目录中构建 350 MB 大小的 sqlite 的 APK 时 就会出现此
  • 构建错误:致命错误:pcre.h:没有这样的文件或目录

    我刚刚安装完 Ubuntu 13 10 我想尝试 Phalcon 当我构建源代码 phalcon so 时 出现以下错误 from home fabrice Downloads cphalcon build 32bits phalcon c
  • 如何创建一个省略其内容时间戳的 tar 文件?

    有没有办法创建一个 tar省略其文件 目录的 atime ctime mtime 值的文件 我们为什么要这样做 我们的构建过程中有一个步骤 生成一个打包到 tar 文件中的工件目录 我们期望构建步骤是幂等的 给定相同的输入 它会产生exac
  • 如何以编程方式构建 Visual Studio 解决方案?

    我想通过传递解决方案文件路径 sln 文件 和构建模式 调试 发布 来编译解决方案 我不想调用像 devenv exe 或 msbuild exe 这样的命令行进程 相反 我想使用 API 并了解是否存在编译错误 是否可以 如果您认为您知道
  • Yii2 修改 Model search() 中的 find() 方法

    我试图修改模型搜索中的 find 方法 但它抛出错误 必须设置数据提供程序属性 这是我的搜索模型 public function search params userID Yii app gt user gt identity gt id
  • Windows CE 6.0 注册表中的时间设置

    我有一台装有 Windows CE 6 0 的 Motorola MC3100 移动条码扫描设备 现在我想让设备在启动时使用我创建的一些注册表文件与我们的域控制器同步其日期 时间 我使用了下面这两个注册表文件来接近我的需要 REG 1 HK

随机推荐