mmdetection源代码阅读笔记——builder

本系列为本菜鸡阅读mmdetection源代码的过程中所进行的一些查阅和思考,正文内容里将本菜鸡增添批注后的源代码奉上。如有不对之处,欢迎大家指正!
mmdetection的GitHub
mmcv的GitHub

builder.py

builder的定义文件mmdetection/mmdet/models/builder.py

from mmcv.utils import Registry, build_from_cfg
from torch import nn

# Registry是一个存放module的一个仓库。
# 以下部分就是建立backbone、neck、roi_extractor等七个仓库。
BACKBONES = Registry('backbone')
NECKS = Registry('neck')
ROI_EXTRACTORS = Registry('roi_extractor')
SHARED_HEADS = Registry('shared_head')
HEADS = Registry('head')
LOSSES = Registry('loss')
DETECTORS = Registry('detector')

# build函数用于建立一个module,它的返回值是一个nn.Module。
# 整体思路就是将cfg(config)和它属于的仓库(registry)通过mmcv.utils.build_from_cfg建立module。
def build(cfg, registry, default_args=None):
    """Build a module.
    Args:
        cfg (dict, list[dict]): The config of modules, is is either a dict
            or a list of configs.
        registry (:obj:`Registry`): A registry the module belongs to.
        default_args (dict, optional): Default arguments to build the module.
            Defaults to None.
    Returns:
        nn.Module: A built nn module.
    """
    if isinstance(cfg, list): # isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
        modules = [
            build_from_cfg(cfg_, registry, default_args) for cfg_ in cfg # build_from_cfg()在后面进行讲解。
        ]
        return nn.Sequential(*modules) # nn.Sequential(*modules)神经网络模块将按照在传入构造器的顺序依次被添加到计算图中执行。
    else:
        return build_from_cfg(cfg, registry, default_args)

# 通过调用build()函数建立backbone、neck、roi_extractor等七个modules。
def build_backbone(cfg):
    """Build backbone."""
    return build(cfg, BACKBONES)


def build_neck(cfg):
    """Build neck."""
    return build(cfg, NECKS)


def build_roi_extractor(cfg):
    """Build roi extractor."""
    return build(cfg, ROI_EXTRACTORS)


def build_shared_head(cfg):
    """Build shared head."""
    return build(cfg, SHARED_HEADS)


def build_head(cfg):
    """Build head."""
    return build(cfg, HEADS)


def build_loss(cfg):
    """Build loss."""
    return build(cfg, LOSSES)


def build_detector(cfg, train_cfg=None, test_cfg=None):
    """Build detector."""
    return build(cfg, DETECTORS, dict(train_cfg=train_cfg, test_cfg=test_cfg))
mmcv.utils.build_from_cfg

函数定义位于mmcv/mmcv/utils/registry.py

def build_from_cfg(cfg, registry, default_args=None):
    """Build a module from config dict.
    Args:
        cfg (dict): Config dict. It should at least contain the key "type".
        registry (:obj:`Registry`): The registry to search the type from.
        default_args (dict, optional): Default initialization arguments.
    Returns:
        object: The constructed object.
    """
    # 判断输入的参数形式是否正确
    if not isinstance(cfg, dict):
        raise TypeError(f'cfg must be a dict, but got {type(cfg)}')
    if 'type' not in cfg:
        raise KeyError(
            f'the cfg dict must contain the key "type", but got {cfg}')
    if not isinstance(registry, Registry):
        raise TypeError('registry must be an mmcv.Registry object, '
                        f'but got {type(registry)}')
    if not (isinstance(default_args, dict) or default_args is None):
        raise TypeError('default_args must be a dict or None, '
                        f'but got {type(default_args)}')

    # 将obj_cls设置为config的type对应的class。
    args = cfg.copy() # dict.copy()用来返回一个字典的浅复制。
    obj_type = args.pop('type') # 从args中删除type和其对应的值,obj_type等于type对应的值。
    if is_str(obj_type):
        obj_cls = registry.get(obj_type) # registry.get(obj_type)是提取名为obj_type的class赋给obj_cls。
        if obj_cls is None:
            raise KeyError(
                f'{obj_type} is not in the {registry.name} registry')
    elif inspect.isclass(obj_type): # 检查是否为类
        obj_cls = obj_type
    else:
        raise TypeError(
            f'type must be a str or valid type, but got {type(obj_type)}')

    if default_args is not None:
        for name, value in default_args.items():
            args.setdefault(name, value) # dict.setdefault():如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值。
    return obj_cls(**args)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mmdetection的代码修改可以通过以下步骤完成: 1. 首先,你可以根据自己的需求,修改mmdetection中的共性结构文件two_stage.py。这个文件抽象了模型的共性结构,并提供了一些基本的属性和方法。 2. 接下来,你可以通过修改cfg文件中的字段来增加模型的具体属性。比如,如果你想要修改faster-rcnn模型,可以在cfg文件中相应的字段中增加属性。 3. 为了增加属性,你需要创建一个新的类,并继承共性结构two_stage.py。在这个类中,你可以定义新的属性和方法,以满足你的需求。 4. 为了让新的属性得以调用,你还需要修改当前文件夹下的__init__.py文件。在__init__.py文件中,你可以将新的类添加到__all__列表中。 通过以上步骤,你可以很方便地对mmdetection进行代码修改。如果你需要修改共性结构,直接修改two_stage.py文件即可。如果你需要增加属性,只需创建一个新的类并继承共性结构,然后在__init__.py文件中添加该类即可。这样的设计使得代码结构清晰,方便书写。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [对mmdetection代码设计的简单理解及代码修改](https://blog.csdn.net/chenxi1900/article/details/122590855)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值