본문 바로가기

Object Tracking 연구

MMCV에서 Registry를 어떻게 만드는가?

최근 Tracking 연구를 하게 되어 MMCV를 공부하고 있는데,, 여간 복잡한 것이 아니다..

하나하나씩 개념을 정리하며 이해할 필요가 있을 것 같은데,, 오늘은 Registry를 다뤄보려한다.

 

MMCV에서 registry는 라이브러리 내의 다양한 유형의 구성 요소를 관리하고 조직하는 중앙 시스템이다. 코드 조직, 유연성 및 유지 관리에 여러 가지 이점을 제공하는 강력한 메커니즘이라 한다.

Registry 안에는 Dataset, Backbone, Neck, Head, Hook 등 별별 클래스 (모듈) 들이 들어갈 수 있는데, vision 모델 구축을 위해 필요한 (1) 모든 개념들을 각각의 Registry (DATASETS, MODELS, NECKS 등..) 에 집어넣고,, (2) 요할때마다 build_from_cfg 함수를 호출하여 객체를 생성하는 개념인 듯 하다.

 

QDTrack에서 model을 생성하는 과정을 예시로 참고하여 Registry를 더 이해해보자.

우선 모델 레지스트리 (MODELS)는 models 폴더 안에서 임포트된다.

 

👍 __init__.py란 폴더(디렉터리)가 패키지로 인식되도록 하는 역할도 하고, 이름 그대로 패키지를 초기화하는 역할을 한다. 즉, import로 패키지를 가져오면 init.py 파일이 실행된다.

👍 __all__는 우리가import \*를 했을 때 임포트 대상에서 어떤 것들을 가져와야 하는지를 정해 주는 변수이다.

(임포트 대상에서 내용 전체를 가져오라고 했을 때 '전체'가 무엇인지 정의해줌)

👍 함수만 import할 수 있는게 아니라 변수 (Registry)도 import할 수 있다. (전역으로 불러오지는 않음)

맨처음 Registry가 만들어졌을때 속에 아무것도 없다.. 언제 채워지는걸까? 😢

 

👉 아래 .mot.py, .tracker.py를 거치면서 MODELS, TRACKERS 레지스트리 안에 model/tracker가 채워진다.

from .mot import * 를 거쳤더니 MODELS에 'QDTrack' 이 추가되었다.

 

Registry 변수들 (MODELS, TRACKERS)는 전부 .builder.py 안에서 선언된 변수들이지만,, custom class는 mutable 하기 때문에 .builder.py 파일 밖에서도 Registry 변수의 내용물을 변경할 수 있다.

👉 다음으로 .mot.py 파일 안에서 어떻게 Registry에 'QDTrack'을 추가했는지 살펴보자.

mot/qdtrack.py를 import하면서 자동으로 Registry 변수가 수정된다.

 

위 mot/qdtrack.py를 보면 QDTrack 클래스를 정의할때 @MODELS.register_module() 이라는 데코레이터 함수를 호출하는 것을 볼 수 있다. 이 과정에서 Registry 변수 MODELS에 QDTrack에 대한 정보가 추가된다.

👍 데코레이터 함수는 정의중인 함수 또는 클래스를 인자로 받는 일종의 wrapper 함수이다.