mmdetection之model构建


前言

 本篇主要介绍mmdetection如何构建目标检测模型的。在读本文之前,建议读者先阅读mmcv之Config类介绍。该系列文章以构建FasterRcnn为具体例子。当然,本文不会详细介绍如何构建FasterRcnn,仅仅介绍mmdetection是如何建立目标检测模型的。

1、总体流程

在这里插入图片描述
 我这里简单介绍下流程:“模型配置字典”以字典形式存储着实例化类的信息。而检测器注册类里面存储了目标检测类(FasterRcnn,Yolo,ssd等,里面存储着是类,不是实例)。而函数build_from_cfg则是根据模型配置字典中type字段FasterRcnn来从 检测器注册类 中提取出FasterRcnn类。然后完成实例化。
 本篇文章分配顺序如下:2 介绍“模型配置字典”和“检测器注册类”;3介绍build_from_cfg;4.实例化faster_rcnn。

2、模型配置字典和检测器注册类

2.1.模型配置字典

 这里放张FasterRcnn的配置字典。关于这个字典怎么生成的请转mmdet之Config类介绍
在这里插入图片描述
 这里注意下‘type’字段。type字段是用来辨别采用何种检测器/backbone等等(比如FasterRcnn,ResNet,FPN)。

2.2.检测器注册类

 注册器是mmdetection中一大特色,要讲清需要很大篇幅,后续我会单独出一篇博文介绍。这里只需明白注册器就是一个字典,里面存储了各个类。比如检测器注册器类,里面存储着(FasterRcnn类、SSD类、Yolo类)。这里贴下注册器类:
在这里插入图片描述
 从上图可以看出,注册器Registry里面包括了多种检测器类。

3、build_from_cfg函数介绍

 在弄懂了模型配置字典和注册器类之后,build_from_cfg就是根据模型配置字典中的 type字段 来从注册器类中索引出 对应的 类 完成初始化。举个例子,type为FasterRcnn,则就从Registry中提取出FasterRcnn类。贴下代码:

def build_from_cfg(cfg, registry, default_args=None):

    args = cfg.copy()
    obj_type = args.pop('type')            # 从配置文件中索引出type字段对应的obj
    if isinstance(obj_type, str):
        obj_cls = registry.get(obj_type)   # 根据字段从Registry中索引出类
        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)}')

    return obj_cls(**args)                 # 完成类的初始化

 这里比较难以理解最后一行代码:obj_cls(args) 。其实作用就是用模型配置字典中参数完成类的初始化。这里贴下FasterRcnn初始化代码:

@DETECTORS.register_module()
class TwoStageDetector(BaseDetector):
    def __init__(self,
                 backbone,
                 neck=None,
                 rpn_head=None,
                 roi_head=None,
                 train_cfg=None,
                 test_cfg=None,
                 pretrained=None):
        super(TwoStageDetector, self).__init__()

 就是用模型配置字典中剩下的字段完成上述参数的初始化。
 这是类继承关系图:
在这里插入图片描述

总结

 本文主要大致介绍了mmdetection如何构建model。核心就是借助build_from_cfg将类完成初始化。后续文章会介绍Registry类,Runner,Hook以及检测算法介绍。

猜你喜欢

转载自blog.csdn.net/wulele2/article/details/114139512