본문 바로가기

Object Tracking 연구

MMCV에서 MODEL, DATASET을 어떻게 build 하는가?

이전 링크 에서 MMCV 에서 Registry를 만드는 법을 공부했다. 이렇게 만들어진 Registry는 build_model, build_dataset 등의 함수를 통해 instance가 만들어지는데 사용된다.

예를 들어서 QDTrack 의 train.py 에서 QDTrack 모델을 생성하는 과정을 살펴보자...

main.py

train.py를 보면 build_model 함수가 호출되는 것을 볼 수 있는데,, Pycharm 에서 디버깅을 위해 Ctrl + 클릭 을 하면 mmcv 패키지 안에 있는 코드로 이동한다. 근데 여기서 문제는.. 실제 동작되는 코드는 mmcv 패키지 안에 있는 build_model이 아니라는 점이다!! 

main.py

train.py 코드 위쪽을 보면 build_model을 import 하는 라인이 있는데,, 이게 원래 mmcv 패키지 안에 있는 build_model 함수 대신에 qdtrack 폴더 안에 custom으로 개량한 build_model을 사용하겠다는 뜻이다. mmcv 패키지를 사용하는 경우,, 이런식으로 model이나,, dataset이나,, loss나,,, 일부 모듈들을 작업 폴더에 새롭게 만들어서 사용하는 경우가 많은데,, Pycharm 에서 Ctrl + 클릭이 제대로된 위치를 찾지 못하고 mmcv 패키지로 디렉팅되는 경우가 많기 때문에 특별히 주의해야할 필요가 있다..

어찌어찌 qdtrack 폴더 안에 있는 .builder.py 안에 build_model 함수를 보면 아래와 같이 MODELS에 접근한다.

여기서 1차적으로 멘붕이 왔는데,, 도대체 MODELS이 어디서 어떻게 왔길래 속에 QDTrack 모델이 이미 등록되었냐는 것이다.. (이 코드파일만 보면 Registry('model')로 인해 아무것도 없는 빈 Registry가 만들어져야 하는데...)

 

흠.. 생각해보니 내가 이미 예전에 정답을 찾았었다...ㅎㅎㅎ (링크)

models/__init__.py

1) build_model.py 가 먼저 import된다. 이때 build_model.py 안에서 선언된 MODELS Registry도 함께 import된다.

2) 이후 losses.py, mot.py 등등 다양한 모듈을 import함

👉 이때 각 파일 안에서 QDTrack 모델 클래스를 정의하는데 @MODELS.register_module() 데코레이터가 호출되면서 앞서 선언한 MODELS Registry에 모델들이 추가된다.

🤔 이게 어떻게 가능한가?

👉 아래와 같이 ..builder 로부터 MODELS 변수를 import하고,, 파이썬에서 class type은 mutable 하기 때문에 class instance가 선언된 파일 밖에서 멤버 변수를 조작하면,, 원래 변수도 함께 변경될 수 있다.

qdtrack/models/mot/qdtrack.py

👉 이 시점에서 builder.py 의 Registry 변수 (MODELS) 안에 이미 QDTrack 클래스가 추가되었고,, 앞으로 builder.py 안에서 build_model 을 포함한 어떤 함수를 호출하던간에 전역변수 MODELS 에 접근하면 그 안에 추가된 QDTrack 모델을 사용할 수 있다.

 

휴 어렵다 어려워!

 

이상 끝! 💪😬🤜