mmrotate框架基本使用

1、如何将类交给mmrotate框架容器管理

  • 容器:框架中现有基本容器包括DATASETS, BACKBONES, LOSSES, DETECTORS。
  • 初始化容器:Registry(‘backbone’)中’backbone’为容器初始化配置文件。
    #/mmdet/models/builder.py  部分代码
    from mmcv.utils import Registry,build_from_cfg
    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')
    
  • 容器管理类的形式:
    #DATASETS容器
    Registry(name=dataset, items={
    'CustomDataset': <class'mmdet.datasets.custom.CustomDataset'>, 
    'CocoDataset': <class'mmdet.datasets.coco.CocoDataset'>, 
    'CityscapesDataset': <class'mmdet.datasets.cityscapes.CityscapesDataset'>, 
    'ConcatDataset': <class'mmdet.datasets.dataset_wrappers.ConcatDataset'>, 
    'RepeatDataset': <class'mmdet.datasets.dataset_wrappers.RepeatDataset'>, 
    'XMLDataset': <class'mmdet.datasets.xml_style.XMLDataset'>, 
    'VOCDataset': <class'mmdet.datasets.voc.VOCDataset'>, 
    'WIDERFaceDataset': <class'mmdet.datasets.wider_face.WIDERFaceDataset'>})
    
  • 通过注解@ROTATED_DATASETS.register_module()可将数据集类注册到ROTATED_DATASETS容器。同理@ROTATED_BACKBONES.register_module()可将主干网类注册到ROTATED_BACKBONES容器。

2、如何实例化mmrotate框架容器管理的类

  • 通过build_dataset(cfg),build_backbone(cfg),build_neck(cfg),build_loss(cfg)实例化相应容器中的类对象。
    #L1LossConfig
     loss = dict('type': 'L1Loss', 'loss_weight': 1.0)
    
    import mmdet.models.builder.build_loss
    import L1LossConfig
    l1Loss = build_loss(L1LossConfig.loss)
    
  • 以上几个build_xxx(cfg)仅仅只是构建一个模型中的组件。

3、如何组装实例化mmrotate类对象(组件)

  • 通过build_detectors(cfg)就可以将各个组件组装起来。cfg如下:
    # model settings
    model = dict(
        type='MaskRCNN',
        backbone=dict(
            type='ResNet',
            xxx
            ),
        neck=dict(
            type='FPN',
            xxx
            ),
        rpn_head=dict(
            type='RPNHead',
               xxx
            loss_cls=dict(
                type='CrossEntropyLoss', xxx),
            loss_bbox=dict(type='L1Loss', xxx),
        roi_head=dict(
            xxx
            mask_head=dict(
                type='FCNMaskHead',
                xxx
                loss_mask=dict(
                    type='CrossEntropyLoss', xxx))))
    

在这里插入图片描述

4、各个组件之间是怎么进行耦合的。

5、怎么知道单个组件需要传入哪些参数,才能自适应构建我们想要的组件。

6、mmrotate组织结构/功能。

  • 通过 LOSSES = Registry(‘loss’)注册管理loss注册表中的所有loss,并通过build_loss(cfg)定制化生成我们所需的对象。这和Spring是一致的,通过ApplicationContext(application.xml)加载application.xml中所有的Bean,不过不同的是Bean中指定了更为详细的信息,包括Property等。而loss注册表中仅仅只有对象名和对应的类,其他所需要的配置需要通过build_loss(cfg)指定。mmrotate分两步加载生成实例Bean,Spring只需要一步。但mmrotate更加灵活,它将通用部分进一步抽象。