• 카테고리

    질문 & 답변
  • 세부 분야

    컴퓨터 비전

  • 해결 여부

    미해결

mmdetection 모델 생성 원리가 궁금합니다.

22.08.11 17:05 작성 조회수 889

0

권철민 선생님 안녕하세요,

강사님의 수업 덕분에 mmdetection 사용법을 익힐 수 있어서 너무나 유익하고 감사합니다.

강사님의 수업을 듣고, mmdetection 코드를 살펴 보고 있는데요 궁금한게 생겨서 이렇게 질문 드리게 되었습니다.

 

예를 들어, mask rcnn 모델을 이용하여 데이터를 학습 시키게 되면, mmdetection에 있는 tools/train.py 파일을 실행시키게 되는데, 이때 config 파일로는 mask rcnn의 config 파일을 사용하게 됩니다.

(ex. mmdetection>configs>mask_rcnn>maskrcnn_r50_fpn_1x_coco.py)

이러한 config를 보면 기존에 제가 보았던 파이토치를 활용하여 적힌 코드들

ex) nn.Seqeuntial(nn.Conv2d(mid_channels, out_channels, kernel_size=3, padding=1, bias=False, .... )

이런식으로 코드가 적힌게 아니라 단순히 config 들만 적혀있는데 이들이 어떻게 train.py 파일에서 model화 되어 코드가 실행될 수 있는 지 궁금합니다.

mmdection>mmdet>models>builder.py 와, registry.py 파일을 확인해봐도 어떻게 이 config 들로 모델이 설계될 수 있는 것인지 이해가 잘 안가서 질문 드리게 되었습니다. 

 

너무 심오한 질문을 드려 죄송합니다..

 

답변 2

·

답변을 작성해보세요.

0

MMDetection 프레임워크가 방대(?)해서 github 소스코드로만으로는 이해하는데 시간이 걸리겠군요. 나중에 pycharm으로 다시 뜯어봐야 할 것 같지만, 지금까지 파악한 바로는 

MMCV의 Registry 클래스를 이용하여 모델을 등록하는 데 이때 build_model_from_cfg( )함수를 이용하여 모델을 등록하고 config에 기반해서 모델을 생성하는 것으로 보입니다(https://github.com/open-mmlab/mmcv/blob/master/mmcv/cnn/builder.py)

build_model_from_cfg() 는 config에 지정된 대로 모델을 만드는데, config자체에 모델에 대한 구조 자체는 없고,  환경 설정 위주로 config가 있는 것 같습니다. 

실제 모델은 models/detectors 밑에서 여러개의 py 파일로 이미 만들어져 있습니다.  예를 들어 faster_rcnn은 아래 url에서 만들어져 있습니다. 

https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/detectors/faster_rcnn.py

faster_rcnn 모델을 보면 기본적으로 TwoStageDetector를 상속받으면 TwoStageDetector는 다시 BaseDetector를 상속 받습니다. 

TwoStageDetector는 2 stage detector들이 가져야할 기본 구조와 기능을 가지고 있습니다. 그리고 faster_rcnn의 생성자를 보면 아래와 같이 되었습니다. 

super(FasterRCNN, self).__init__(

            backbone=backbone,

            neck=neck,

            rpn_head=rpn_head,

            roi_head=roi_head,

            train_cfg=train_cfg,

            test_cfg=test_cfg,

            pretrained=pretrained,

            init_cfg=init_cfg)

그러니까 faster_rcnn의 생성시 인자로 들어가는 backbone, neck, rpn_head, roi_head 등은 config로 입력될 수 있는데, 이때 backbone은 build_backbone() 함수로 해서 pytorch기반으로 layer들을 결합해서 생성이 되는 것 같습니다. 그리고 neck은 build_neck(), rpn_head는 build_head(), roi_head도 build_head() 로 만들어집니다. 

build_backbone(), build_neck(), build_head()는 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/builder.py 에 있습니다. 

근데 여기가 좀 블랙박스 같습니다.  mmcv의 Registry 객체를 이용해서 backbone, neck, head를 만드는 것 같은데 여기서 어떻게 만드는지 github만으로 쫓아가기가 힘들군요.  제 생각엔 

models에 있는 backbones, necks, detectors 디렉토리에 많은 모델들이 있는데, 이들 모델을 생성시 register_module()을 데코레이터로 만들면서 Registry 객체에 등록하고 이들을 가져다 쓰는것 같은데, 확실하지는 않습니다.  

가령 예를 들어 FasterRCNN()생성시에 데코레이터로 @DETECDTORS.register_module()이, backbone 모델에는 @BACKBONES.register_module()이 되어 있습니다. 이들을 이용해서 해당 모델을 생성시 Registry에 등록하는 것 같은데, 요 관계가 명확하지는 않습니다. 

여기까지가 지금 저에게 허락된 시간으로 파헤칠수 있는 한계인것 같습니다.  나중에 저도 한번 pycharm으로 더 파헤쳐 봐야 할것 같습니다. 

 

0

안녕하십니까, 

이건 저도 소스코드를 더 뜯어봐야 겠군요. 시간이 더 걸릴것 같습니다. 

주말에 시간내서 함뜯어보고 말씀드리겠습니다.