본문 바로가기
딥러닝관련/Detection

MMCV 의 Registry

by 머리올리자 2021. 10. 26.

https://mmcv.readthedocs.io/en/latest/understand_mmcv/registry.html

 

Registry — mmcv 1.3.16 documentation

Registry MMCV implements registry to manage different modules that share similar functionalities, e.g., backbones, head, and necks, in detectors. Most projects in OpenMMLab use registry to manage modules of datasets and models, such as MMDetection, MMDetec

mmcv.readthedocs.io

 

MMdetection을 정리하다가 Registry 항목이 많아 정리해본다.

 

MMCV는 유사한 기능을 공유하는 서로 다른 모듈(backbone, head, necks..)을 관리하기 위해 레지스트리(Registry) 구현

 

OpenMMLab의 대부분의 프로젝트에서 Registry를 사용하여

MMDetection, MMDetection3D, MMClassification, MMEditing 등과 같은

데이터 세트 및 모델의 모듈을 관리.

 

 

위 개념들을 봐도 어렴풋하게만 이해하여 레지스트리 개념에 대해서 좀 찾아봤다

 

https://ko.wikipedia.org/wiki/윈도우_레지스트리

 

윈도우 레지스트리 - 위키백과, 우리 모두의 백과사전

윈도우 레지스트리(Windows Registry)는 마이크로소프트 윈도우 32/64비트 버전과 윈도우 모바일 운영 체제의 설정과 선택 항목을 담고 있는 데이터베이스로, 모든 하드웨어, 운영 체제 소프트웨어,

ko.wikipedia.org

우리가 익히 알고있는 윈도우 레지스트리는

윈도우 모바일 운영 체제의 설정과 선택 항목을 담고 있는 데이터베이스로, 모든 하드웨어, 운영 체제 소프트웨어, 대부분의 비운영 체제 소프트웨어, 사용자 PC 선호도 등에 대한 정보와 설정

 

사용자가 설정들을 변경하면 변경 사항들이 레지스트리에 반영된다.

 

 

MMCV의 Registry의 레지스트리가 비슷한 개념이라면,

 

모델에 대해서 설정과 항목을 담고 있는 정보이며, 이 정보와 설정들을 컨트롤하는 역할로 볼 수 있을 것 같다.

 

 

 

 

[Registry]

(이어서 정리)

 

-> 클래스를 문자열에 maps하는 mapping으로 볼 수 있다.

 

Registry로 문자열을 통해 클래스 찾고 인스턴스화

 

ex) Registry를 사용하여 config를 통해 hook, runner, models 및 datasets를 생성하는

대부분의 OpenMMLab 프로젝트의 config 시스템

 

Registry에서 코드베이스의 모듈 관리하려면

 

1. 빌드 방법 만듦

 

2. Registry 만듦

 

3. Registry이용해서 모듈 관리

 

 

[build_func]

 

Registry의 build_func argument는 class instance를 instance화 하는 방법을 사용자 정의하기 위한 것

 

기본 : build_from_cfg


[예제]

 

레지스트리를 사용하여 패키지 모듈을 관리하는 예제

 

다양한 형식의 데이터 -> 예상 데이터 형식으로 바꾸려면 [Dataset Converter]

 

converters 폴더 생성 [패키지 역할]

converters/builder.py 빌더를 구현하기 위한 파일 생성

 

# converters/builder.py

from mmcv.utils import Registry
# create a registry for converters
CONVERTERS = Registry('converter')

# print(CONVERTERS)
# Registry(name=converter, items={})

 

이제 패키지에서 다른 converter를 구현할 수 있음.

 

ex) converters/converter1.py 에서 Converter1 구현 가능

 

# converters/converters1.py

from .builder import CONVERTERS

# use the registry to manage the module
@CONVERTERS.register_module()
class Converter1(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b

@CONVERTERS.register_module() --> 구현된 모듈을 Registry CONVERTERS에 등록하는 것.

- 모듈 관리 목적

 

이런 식으로 문자열과 클래스 간의 매핑은 아래와 같이 CONVERTERS에 의해 구축되고 유지됨

 

'Converter1' -> <class 'Converter1'>

모델이 올바르게 등록되면, config를 통해 converter를 사용할 수 있다.

 

converter_cfg = dict(type='Converter1', a=a_value, b=b_value)
converter = CONVERTERS.build(converter_cfg)

 

from builder import CONVERTERS

# use the registry to manage the module
@CONVERTERS.register_module()
class Converter1(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b


converter_cfg = dict(type='Converter1', a=2, b=3)
converter = CONVERTERS.build(converter_cfg)


print(converter_cfg)
print(converter)

# >>> {'type': 'Converter1', 'a': 2, 'b': 3}
# >>> <__main__.Converter1 object at 0x7fdd555e03d0>

 

 


[Build function]

converters가 build되는 방식을 customize하고 싶다고 가정, 

 

customized 'build_func'를 구현하고 이를 Registry에 전달할 수 있다.

 

from mmcv.utils import Registry

# create a build function
def build_converter(cfg, registry, *args, **kwargs):
    cfg_ = cfg.copy()
    converter_type = cfg_.pop('type')
    if converter_type not in registry:
        raise KeyError(f'Unrecognized converter type {converter_type}')
    else:
        converter_cls = registry.get(converter_type)

    converter = converter_cls(*args, **kwargs, **cfg_)
    return converter

# create a registry for converters and pass ``build_converter`` function
CONVERTERS = Registry('converter', build_func=build_converter)

위는 build_func instance를 사용하여 class instance를 빌드하는 방법

 

기능은 build_from_cfg와 유사build_model_from_cfg : nn.Sequential에서 Pytorch 모듈을 빌드하기 위해 구현

 


Hierarchy Registry

 

MMDetection의 object Detectors에 대해 MMclassification의 모든 backbone 사용 가능MMDetection과 MMSegmentation 결합 가능

 

예시

 

 

 

 

 

 

 

API는 아래와 같음

 

https://mmcv.readthedocs.io/en/latest/api.html?highlight=registry#mmcv.utils.Registry 

 

fileio — mmcv 1.3.16 documentation

Docs > fileio Edit on GitHub Shortcuts

mmcv.readthedocs.io

 

 

 

 

String -> class

Registry 기록 가져오기

 

 

Registry 범위 추론

모듈 등록

 

scope와 key split