[논문리뷰] Mask R-CNN
들어가며
이 글은 Faster R-CNN의 사전 지식이 있다는 가정하에 작성하였습니다.
Mask R-CNN은 Instance Segmentation 작업에 초점을 맞춘 모델입니다. 근데 여기서 왜 Instance Segmentation을 하는지 의문이 들 수 있습니다. 그냥 "Semantic Segmentation을 사용해서 pixel별 클래스를 예측하면 되지 않을까?"
위 차이를 보면 Semantic Segmentation은 Classification과 Segmentation을 동시에 수행하는 반면(Coupling), Instance Segmentation은 Object Detection 방식처럼 Bounding Box(BBox)와 Classification을 수행한 다음, 해당 영역 안에서만 Segmentation을 진행한 것입니다(Decoupling).
본 논문에서는 이러한 Semantic Segmentation과 같이 Classification과 Segmenation을 같이 진행하면 정확한 Segmentaiton이 힘들다고 합니다. 그에 반해, Instance Segmentation은 Region Proposal Network(RPN)에서 추출한 Proposals에 대한 영역 안에서만 Segmentation을 진행하고 Detection(Classificaiton, Location)과 Segmentation을 병렬적으로 수행하기 때문에 더욱 정확한 Segmentation이 가능하다고 합니다.
이러한 Instance Segmenation을 가능하게 한 논문이 Mask R-CNN입니다. Mask R-CNN의 내부 구조는 생각보다 단순하며, 기본적으로 Faster R-CNN의 구조를 따르면서 아래와 같이 2가지 주요 변경 및 추가가 이루어졌습니다.
- RoI Pooling -> Roi Align
- 기존 Object Detection은 RoI Head 위에 Location과 Classification의 Layer를 연결하였는데, Instance Segmentation을 할 수 있게 추가적인 Mask Layer 연결
위 두 가지가 Mask R-CNN의 전부이고, 아래에서 자세히 설명하도록 하겠습니다.
Mask R-CNN
RoI Align
본 논문에서 첫 번째로 제안하는 기술인 RoI Align을 알기 전에 RoI Pooling을 리뷰하면 아래와 같습니다.
어떤 RoI가 있고, 이 좌표는 각각의 실수값입니다. 이 좌표들을 Feature map의 값에 접근하기 위해서는 가까운 정수값으로 변환되고 RoI Pooling이 진행됩니다.
이러한 방법은 Object detection처럼 러프하게 BBox를 예측하는 Task에는 크게 지장이 없었지만, Instance Segmentation과 같이 각 픽셀별로 정확한 예측이 필요한 Task에는 성능 저하를 야기한다고 합니다.
그래서 본 논문은 RoI Align이라는 기술을 제안하고, 아래와 같이 RoI에 대한 정확한 값에 접근을 하려고 하였습니다.
RoI에서 각 셀을 균등하게 3등분 하는 4개의 점을 찍습니다. RoI의 사이즈가 2 * 2 이므로 총 2 * 2 * 4의 점이 생깁니다. 이후, 각 점들의 값은 아래와 같이 대응되는 Feature map의 4개의 점들과의 Bilinear Interpolation으로 구합니다.
이 값들을 구하는 과정은 생략하겠습니다. 그리고 RoI 셀들의 4개의 점들 중 가장 큰 값을 기준으로 Pooling을 진행하여 RoI Align 값을 구합니다.
실제로 RoI Align을 적용하였을 때 성능 차이가 크게 난 것을 확인할 수 있었습니다.
Network
전체 네트워크 구조는 아래와 같습니다.
위의 Classification과 Localization은 Faster R-CNN과 같고, 유심히 봐야 할 부분은 아래 Mask Classifier입니다.
RPN에서 추출된 영역에 RoI Align 되어 Mask Classifier로 입력됩니다. Mask Classifier는 2개의 Convolution layer층으로 구성되었고, 최종적으로 \( K, m, m \) 차원을 출력합니다(e.g. COCO 데이터셋에 대한 차원: (80, m, m)). 여기서 \( K \)는 class의 개수이고, \( m \)은 Mask의 높이와 너비의 해상도입니다. 이 Mask는 Sigmoid 함수를 거쳐 0.5 이상의 값은 1, 0.5 미만의 값으로 0으로 구성하여 각 Class별로 Binary Mask를 만듭니다.
학습으로 GT Class Index의 Binary Mask와 GT Binary Mask에 대한 Binary Cross Entropy로 Mask에 대한 Loss를 구성합니다.
최종적으로 Classification, Localization, Mask에 대한 Loss를 모두 구하면 아래와 같습니다.
오늘은 Mask R-CNN의 리뷰를 해보았습니다.
긴 글 읽어주셔서 감사합니다.