안녕하세요.

오늘은 Mask R-CNN 논문에 대해 리뷰하려고 합니다.

He, Kaiming, et al. "Mask r-cnn." Proceedings of the IEEE international conference on computer vision. 2017.

(논문 링크: https://arxiv.org/abs/1703.06870)

Keyword: Mask, ROI Align, FPN

 

앞서 리뷰했던 R-CNN의 계열들은 모두 Object Detection을 위한 모델이지만

Mask R-CNN은 Instance Segmentation을 위하여 고안된 모델입니다.

 

Mask R-CNN을 리뷰할 때 Fast R-CNN과 Faster R-CNN에 대하여 몇 번 언급될 예정이니 이전 포스팅을 읽고 오시면 이해하는데 더욱 도움이 될 것입니다.

https://nepersica.tistory.com/4?category=898260

 

SPP-Net, Fast R-CNN, Faster R-CNN

안녕하세요. 지난번 리뷰했던 R-CNN에 이어서 후에 발표된 R-CNN 계열 논문들을 간단하게 리뷰하고자 합니다. 순서는 타이틀과 같이 SPP-Net, Fast R-CNN, Faster R-CNN 순으로 진행하겠습니다. 1. SPP-Net - R-CN

nepersica.tistory.com


 

이전 Object Detection과 Semantic Segmentation, Instance Segmentation에 대한 연구들이 꾸준히 이어져 왔는데 Instance Segmentation에 대한 성과는 크게 없었습니다.

 

<그림 1> Object Detection, Semantic Segmentation, Instance Segmentation

Mask R-CNN은 Object Detection의 instance들을 separate 할 수 있는 특성과 Semantic Segmentation의 segment 특성을 사용하여(Faster R-CNN(Object Detection)과 FCN(Semantic Segmentation)을 합쳐)

Bounding box 내에서 Segmentation을 수행하는 Instance Segmentation으로

 

Faster R-CNN의 RPN에 Segmentation을 수행하는 작은 FCN인 mask branch를 결합한 2-stage architecture를 가집니다.

 

 

Mask R-CNN Architecture

<그림 2> Mask R-CNN Architecture

 

Mask R-CNN은 앞서 언급했듯 Faster R-CNN에 FCN을 돌린 것으로 구조를 간단히 보면,

 

 

<그림 3> Mask R-CNN Tasks(좌), Mask Groundtruth와 Prediction(우)

 

ResNet을 BackBone Network로하는 FPN으로 Feature Extraction을 하고 RPN으로부터 얻은 ROI에 대해 

Classification, Bbox Regression, mask 3개의 branch로 구성되어 있습니다.

 

Mask R-CNN Loss Function

3개의 branch에 대한 loss function을 먼저 살펴보겠습니다.

<그림 4> Mask R-CNN Loss Function

전체 Loss는 multi-task loss(Classification과 Bbox Regression, mask)의 합으로 이루어져 있습니다.

 

classification(Softmax Cross Entropy)과 Bbox Regression에 대한 Loss Function은 이전 포스팅에서 설명하였으니 생략하겠습니다.

 

L_mask(mask branch loss)는 per pixel로 object에 대한 masking을 binary로 수행하므로 Binary Cross Entropy를 loss function을 사용합니다.

 

<그림 5> L_mask

 

 

예를 들어 그림 6과 같이 입력 이미지 안에 사람(class=1), 말(2), 자동차(3)가 존재할 때,

mask가 Training과 Test할 때의 L_mask를 살펴보겠습니다.

- Training

<그림 6> example for L_mask During Training

주어진 Groundtruth에 해당하는 Bounding box의 Class에 대한 loss만 계산하고 다른 class들에 대해서는 학습을 하지 않습니다.

ex) GroundTruth Class가 2인 말에 대한 Bbox → L_mask = L_c2

- Test

<그림 7> example for L_mask During Test

Bounding box에 해당하는 Groundtruth class를 모르기 때문에, Classifcation branch에서 나온 prediction class에 대한 prediction mask를 사용하여 예측합니다.

<그림 8> softmax vs sigmoid

softmax 기반의 FCN보다 mask branch를 추가하였을 때의 성능이 더 좋은 것을 확인할 수 있습니다.

 

 

그리고 기존 Faster R-CNN은 Object Detection을 수행하는 모델이므로 정확한 위치 정보를 담는 것은 중요하지 않았습니다.

 

Faster R-CNN의 ROI Pooling 과정을 보면

<그림 3> ROI Pooling

 

그림 3과 같이 ROI가 소수점 좌표를 가지면 각 좌표를 반올림하여 이동시킨 후 Pooling을 수행했습니다.

하지만 pixel 단위로 정확한 mask를 예측하려는 Segmentation에서는 입력 이미지의 위치 정보가 왜곡되기 때문에 문제가 발생할 수 있게 됩니다.

 

그래서 좀 더정확하게 feature map에서 픽셀 값을 얻기 위해 ROI Align이 등장하게 되었습니다.

 

- ROI Align

 

<그림 4-1> ROI Align

feature map(파란 선)에서 ROI(빨간 선)가 2x2 bin들을 갖도록 4등분을 하고 또, 각 bin이 2x2 bin들을 갖도록 4등분을 합니다.

그리고 이렇게 획득한 4x4 bin에 대하여 Bilinear Interpolation을 수행합니다.

<그림 4-2> ROI Align

그림 4-2 ROI에서 (0,0)에 위치한 bin에서 Bilinear Interpolation을 수행한 것을 자세히 보면

검은색은 bin 내에서 비중이 가장 적어 가장 적게 weight를 차지하고

파란색은 bin 내에서 비중이 가장 커 가장 크게 weight를 차지하는 것을 볼 수 있습니다.

 

이렇게 구한 weight들로 해당 bin에 대한 값을 구해줍니다.

 

<그림 4-3> ROI Align

 

그러면 그림 4-3과 ROI와 같은 총 16개 bin들이 생성되고 이들을 4개씩 max pooling하여 2x2 feature map을 획득합니다.

<그림 4-3> ROI Align

그러면 위와 같이 Feature map의 ROI로부터 ROI Align을 수행한 뒤 

Binary Mask를 ROI Align feature map의 맞게 Upscaling하면 입력 이미지와 Visualization을 수행할 수 있게 됩니다.

<그림 4-4> ROI Align Table

 

Mask R-CNN이 Instance Segmentation을 수행하는 과정은 다음과 같습니다.

1. ResNet 기반 FPN을 수행

2. FPN으로부터 획득한 feature map을 RPN에 통과시켜 ROI에 대한 정보 획득

3. ROI에 대하여 ROI Align을 수행

4. Upscaling하여 획득한 ROI Align을 mask branch에 통과하여 학습

 

단점) RPN 과정에서 Bbx가 예측되지 않으면 masking 자체가 불가능하다.😅

 

< Reference >

https://www.youtube.com/watch?v=RtSZALC9DlU