안녕하세요.
오늘은 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
이전 Object Detection과 Semantic Segmentation, Instance 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
Mask R-CNN은 앞서 언급했듯 Faster R-CNN에 FCN을 돌린 것으로 구조를 간단히 보면,
ResNet을 BackBone Network로하는 FPN으로 Feature Extraction을 하고 RPN으로부터 얻은 ROI에 대해
Classification, Bbox Regression, mask 3개의 branch로 구성되어 있습니다.
Mask R-CNN Loss Function
3개의 branch에 대한 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을 사용합니다.
예를 들어 그림 6과 같이 입력 이미지 안에 사람(class=1), 말(2), 자동차(3)가 존재할 때,
mask가 Training과 Test할 때의 L_mask를 살펴보겠습니다.
- Training
주어진 Groundtruth에 해당하는 Bounding box의 Class에 대한 loss만 계산하고 다른 class들에 대해서는 학습을 하지 않습니다.
ex) GroundTruth Class가 2인 말에 대한 Bbox → L_mask = L_c2
- Test
Bounding box에 해당하는 Groundtruth class를 모르기 때문에, Classifcation branch에서 나온 prediction class에 대한 prediction mask를 사용하여 예측합니다.
softmax 기반의 FCN보다 mask branch를 추가하였을 때의 성능이 더 좋은 것을 확인할 수 있습니다.
그리고 기존 Faster R-CNN은 Object Detection을 수행하는 모델이므로 정확한 위치 정보를 담는 것은 중요하지 않았습니다.
Faster R-CNN의 ROI Pooling 과정을 보면
그림 3과 같이 ROI가 소수점 좌표를 가지면 각 좌표를 반올림하여 이동시킨 후 Pooling을 수행했습니다.
하지만 pixel 단위로 정확한 mask를 예측하려는 Segmentation에서는 입력 이미지의 위치 정보가 왜곡되기 때문에 문제가 발생할 수 있게 됩니다.
그래서 좀 더정확하게 feature map에서 픽셀 값을 얻기 위해 ROI Align이 등장하게 되었습니다.
- ROI Align
feature map(파란 선)에서 ROI(빨간 선)가 2x2 bin들을 갖도록 4등분을 하고 또, 각 bin이 2x2 bin들을 갖도록 4등분을 합니다.
그리고 이렇게 획득한 4x4 bin에 대하여 Bilinear Interpolation을 수행합니다.
그림 4-2 ROI에서 (0,0)에 위치한 bin에서 Bilinear Interpolation을 수행한 것을 자세히 보면
검은색은 bin 내에서 비중이 가장 적어 가장 적게 weight를 차지하고
파란색은 bin 내에서 비중이 가장 커 가장 크게 weight를 차지하는 것을 볼 수 있습니다.
이렇게 구한 weight들로 해당 bin에 대한 값을 구해줍니다.
그러면 그림 4-3과 ROI와 같은 총 16개 bin들이 생성되고 이들을 4개씩 max pooling하여 2x2 feature map을 획득합니다.
그러면 위와 같이 Feature map의 ROI로부터 ROI Align을 수행한 뒤
Binary Mask를 ROI Align feature map의 맞게 Upscaling하면 입력 이미지와 Visualization을 수행할 수 있게 됩니다.
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 >
'Deep Learning > Segmentation' 카테고리의 다른 글
[Real-time Segmentation] YOLACT: You Only Look At Coefficients (0) | 2021.02.03 |
---|---|
[Real-time Segmentation] PSPNet, ICNet, ENet (0) | 2021.01.21 |
[Semantic Segmentation] FCN: Fully Convolutional Network (0) | 2021.01.21 |