영어논문 스터디

MASK RCNN 논문 리뷰

잡담연구소 2021. 2. 21. 04:57

Instance segmentation task를 다룬 논문인 MASK-RCNN 차례입니다.

 

 

MASK RCNN은 기존 object detection task에서 사용되던 FASTER RCNN에 Mask branch를 추가해 classification , bbox regression , predicting object mask를 동시에 처리하는 모델입니다. 

이 논문을 읽기 위해서는 기본적으로 Faster RCNN , FCN , FPN 모델들과 segmentation이 뭔지 알아야 합니다.

 

 

📌 Instance segmentation 

Mask RCNN의 task인 "Instace segmentation"에 대해 먼저 이해해야합니다. 

Image Segmentation은 영상/이미지에서 의미있는 부분들을 구별해내는 기술을 얘기합니다.

이미지를 영역별로 나눠준 후 , 각 개체에 맞게 합쳐주는 task를 얘기합니다.

object detection, classfication 과 같은 task들과 비교해봤을 때,  정확하게 개체들의 경계선까지 추출해 의미있는 영역들로 나누어져야하므로 더 어려운 (challenging) 작업입니다.

Image Segmentation는 semantic 과 instance로 나뉩니다.

 

  • Sematic segmentation 
    : 아래 사진과 같이 segmentation을 진행할 때, class가 같다면 구분하지 않고 같은 영역 혹은 색으로 분할합니다.
     같은 클래스의 다른 개체들이어도 구분을 하지 않습니다. 아래 사진에서도 각기 다른 사람 5명이 있지만 "person"이라는 같은 클래스이므로 하나로 봅니다. FCN에서는 각 픽셀별로 해당 클래스를 계산하고 픽셀별로 색을 칠해 Sematic segmentation을 진행합니다. 
  • Instance segmentation 
    : class가 같더라도 다른 개체라면 이를 구분해 인식합니다. 아래 사진처럼 5명 모두 "person"이라는 같은 class지만, instance로 인식해 각자 다르게 영역 혹은 색으로 분할 해줍니다.
    해당 논문에서는 object detection과 sematic segmentation을 힙쳐놓은 task라고도 설명합니다.

    Mask RCNN에서는 ROI 내에서 각 클래스별로 instance인지를 구분하는 mask를 씌워줍니다.
    그 후 classification layer를 통해 계산된 classfication에 대해 instance가 있다고 판단된 픽셀들에 색을 칠해 Instance segmentation을 진행해줍니다. 

 

 

 

📌 Faster RCNN 

이전에 논문 리뷰를 한 적이 있지만, MASK RCNN을 이해하기 위해 간략하게 다시 복기해봅니다. 

Faster RCNN은 FAST RCNN + RPN으로 이루어져있으며, RPN이 핵심이라고 볼 수 있습니다. 

Faster RCNN에서는 기존 CNN에서 뽑은 feature map을 RPN에 input으로 넣어줍니다.

RPN에서는 "Anchor"라는 개념을 도입해 물체가 있을 거 같은 region을  proposal 합니다.

ROI pooling을 통해 feature map에 맵핑시킨 후, classfication과 bbox regression 2가지 task를 동시에 진행합니다. 

 

 

📌 FCN(Fully Convolutional Network)

FCN은 논문을 읽지는 않았지만, 수업시간에 CNN의 동향에 대한 강의르 들으며, 추가적으로 학습한 적이 있습니다.

Sematic segmatic task에서 뛰어난 성능을 보인 모델로 spatial한 정보를 잃는 Fully connected layer 대신 fully convolutional layer를 주장합니다. 

Fully connected layer를 1x1 convolution layer로 대체해 FC 대신 1x1xK개의 feature vector를 얻게 됩니다.

위와 같이 여러 단계를 거치게 되면 feature map의 크기가 줄어 들게 돼, 픽셀 단위로 예측하기 위해서는 다시 feature map의 크기를 키워줘야합니다.  skip layer 개념을 활용하여 unsampling 하여 원래 feature map 크기로 되돌려줍니다.

 

 

 

📌 FPN(Featre Pyramid Network)

FPN을 이해하는 것보다는 Mask RCNN에 FPN이 쓰일 방식?을 이해하는 게 더 효율적일 거라고 판단해 일부분만 공부했습니다.  Herbwood님이 아주 잘 설명해놓으셨습니다! faster rcnn과는다르게 여러개의 feature map이 생성되고, 각각의 feature map에 맞는 ROI가 생성되는 것을 확인할 수 있습니다. 

 

 

 

📌 Introduction 

기존 Faster RCNN에 각각의 ROI에 대해 segmentation mask를 예측하는 mask branch를 추가한 구조입니다. 

classfication , bounding box regression , segmentation mask 총 이렇게 3가지의 branch로 이루어져있으며, 3가지 task를 동시에 수행합니다.  Mask branch는 작은 크기의 FCN으로 pixel-to-pixel 방식으로 픽셀별로 K개의 클래스 각각에 대해 물체가 있는지 없는지를 판단하는 segmentation mask를 예측합니다.

 

또한 기존 fast rcnn의 ROI pooling 를 ROI Align layer로 대체해 물체의 spatial location 즉, 위치정보를 보존했습니다.  

이전 모델들과는 다르게 class 예측과 segmentation mask가 독립적으로 일어나 더 좋은 결과를 가져왔다고 합니다. 

논문에서는 이를 "decouple"이라고 표현합니다. 

 

결과적으로는 학습이 쉽고, faster rcnn에 branch를 하나 더 추가했긴 하지만, 연산량이 크게 많아지지는 않았습니다.

속도 역시 5fps로 빨라졌으며, COCO instance segmentation , bbox object detection , person keypoint detection 등의 COCO suite of challenges에서 모두 top result를 보여주었습니다. 이전 sematic segmentation의 문제점이었던 느리고 부정확하다는 단점이나 instance들이 겹친다(FCIS)거나등의 문제를 해결했습니다.

 

 Mask RCNN이 Faster RCNN과의 차이는 크게 3가지를 꼽을 수 있습니다. 

  •  FPN 사용 : ROI를 생성하는 RPN에 FPN 추가
  •  ROI pooling을 ROI align으로 대체  
  •  Mask branch 추가 

제 기준 핵심이라고 생각하는 ROI Align 과 Mask branch를 설명한 이후, train 순서대로 설명하겠습니다. 

 

📌 Mask branch 

Mask RCNN은 Fast RCNN처럼 2단계로 이루어져있습니다. 

1STEP에서는 RPN을 통해 ROI를 얻습니다. 

2STEP에서는 ROI, Feature map을 통해 classfication , bbox regression, segmentation mask를 동시에 합니다. 

그렇기 때문에 loss 함수로 $L_{cls} + L_{box} + L_{mask}$라는 multi loss를 가지게 됩니다.

 

Mask branch에서는 각각의 ROI에 대해 각각의 클래스 k에 대해 binary mask를 계산합니다. 

Binary mask란 아래의 그림과 같이 특정 클래스 k에 대해서 instance가 있다고 생각되면 1 , 없다고 생각되면 0으로 나타내는 걸 얘기합니다. 

 

https://herbwood.tistory.com/20#comment12497971

 

기존 모델들의 경우 mask와 class prediction을 동시에 수행했습니다.  하나의 픽셀에 대해 softmax를 취해 각각의 클래스들의 확률을 계산하고 multinomial creoss entropy loss를 이용해 학습힙니다.

$pixel_{1,1}$에 대해 클래스가 4개라면 [0.1 , 0.2, 0.4, 0.4]와 같이 확률을 계산해 그 중 가장 큰 값을 class로 사용하게 되는겁니다. 

 

mask branch에서는 이전 모델들과 다르게 mask와 class prediction을 분리했습니다. 이를 논문에서는 "decouples"라고 표현합니다.  mask에서는 하나의 픽셀에 대해 각각 클래스 별로 해당 클래스의 instance가 존재하는지 안하는지를 sigmoid를 통해 binary로 계산합니다. $L_{mask}$는 binary cross entropy loss의 평균으로 정의됩니다.

만약 ROI의 ground truth가 k라면 k번째 마스크에 대해서만 $L_{mask}$가 정의됩니다. 

 

결국 하나의 픽셀에 대해 클래스의 개수 k개의 output을 출력하므로, feature map mxm에 대해서 총 $Km^{2}$의 output을 출력하게 됩니다. 각각의 ROI에서는 $Km^{2}$차원의 binary mask를 인코딩한 output이 출력됩니다. 

 

mask는 input object의 spatial한 정보를 담고 있습니다.  clasification , box regression과 같이 FC layer를 사용하게 되면 위치에 대한 정보를 잃어버리게 됩니다. 그렇기 때문에 mask branch에서는 FCN을 사용해 pixel to pixel로 대응해 공간정보를 유지할 수 있게 됩니다. 

 

 

📌 ROI Align

논문에서는 ROI pooling을 하면 quantization이 발생하고, ROI와 extracted features 사이의 misalignment를 발생시킨다고 얘기하고 있습니다. quantization이 뭘까요? 간단하게 얘기하면 "반올림"해버린다는겁니다. 

 

https://medium.com/@fractaldle/mask-r-cnn-unmasked-c029aa2f1296

 

이런 5x5 feature map이 있다고 가정했을 때, 현재 ROI가 점선 상자와 같이 존재한다고 가정합니다. 

현재 ROI의 경계는 Featuremap과 딱 떨어지지가 않습니다. 이때 ROI Pooling은 이 문제를 해결하기 위해서 그냥 아래와 같이  "반올림"해버립니다. 이렇게 되면 위치정보에 혼란이 옵니다. 들어와야할 정보는 들어오지 않고, 이상한 정보가 들어오기 떄문입니다. pixel 단위로 segmentation을 진행해야되는 mask를 예측하는 task에 대해서 아주 큰 부정적인 효과를 가져온다고 합니다. 

 

 

이를 해결하기 위해서 본 논문에서는 ROI와 featuremap이 딱! 맞도록 하는 ROI Align이라는 것을 적용했습니다. 

각 ROI bin에서 일관되게 샘플링된 4개의 위치에서 input feature의 값을 계산하고 결과를 aggregate(max, average)하는 bilinear interpolation을 사용합니다. 말이 너무 어렵습니다 🤔💦

 

  • bilinear interpolation이란

linear interpolation이란 우리가 중학교에서 배웠던 "내분"과 같은 개념입니다. 

아래와 같이 두 지점 x1,x2 사이에 있는 x에서의 데이터값을 알고 싶을 때 선형 보간법을 사용하면 아래 식과 같이 쓸 수 있게 됩니다.\begin{align} f(x) =\beta f(x_{1}) + \alpha f(x_{2})\end{align}

\alpha는 d1+d2의 길이 중에서 d2이 차지하는 비율을 , \beta는 그 중 d1이 차지하는 비중을 얘기합니다. 

 

https://darkpgmr.tistory.com/117

 

bilinear는 이를 2차원으로 확장한 개념입니다.

아래 그림에서 p를 구하고자하면 a,b를 보간하여 m을 얻고 , c,d를 보간하여 n을 얻은 후 $\bar{mn}$에 대하여 보간해 p를 얻는 것입니다. 그럼 식을 아래와 같이 쓸 수 있게됩니다. 

\alpha , \beta는 세로에 대한 비율 , q,p는 가로에 대한 비율입니다. 

 

https://darkpgmr.tistory.com/117

 

예시로 보는 게 빠릅니다. bin=2로 잡아 ROI를 2X2로 나눠줍니다.

 

https://firiuza.medium.com/roi-pooling-vs-roi-align-65293ab741db

 

각각의 Bin에 sample point를 4개씩 잡습니다. 논문에 따르면 point의 위치나 개수는 중요하지 않다고 합니다.

현재 bin=2로 잡았으니 sample point가 총 16개가 생기게 됩니다.

sameple하나를 기준으로 가까운 그리드 셀 4개에 대해서 아래와 같은 보간식을 따라 게산하게 됩니다. 

아래 빨간 점을 기준으로 Q11 = 0.2 , Q12 = 0.2 , Q21 = 0.9 , Q22 = 0.1이 되고 x1,x2, y1,y2는 각각 중심의 x,y좌표로 차는 두 그리드 셀 사이의 가로,세로 길이를 의미합니다.

 

 

 

 

 

위의 과정을 모든 sample point에 진행해줍니다. 그럼 하나의 영역 안에 4개의 값이 생깁니다. 여기서 max 혹은 average pooling을 사용해 2x2의 output을 얻어냅니다.

 

 

자세한 설명은 이곳을 참고하면 좋습니당😊

 

 

📌 Network Architecture

논문에서는 "generality"를 보여주기 위해 여러가지 backbone 모델들과 여러가지 network head를 사용했습니다. 

ResNet과 FPN을 같이 사용했을 때, 성능이 가장 좋았으므로 Resnet-FPN을 위주로 얘기하게 됩니다. 

 

 

  • Stage 1 

Mask RCNN은 Faster RCNN과 같이 Backbone model 이 존재합니다.

Backbone model로부터 feature map을 생성합니다. 

이 논문에서는 backbone model을 Resnet에 FCN을 추가해서 구성했습니다. 

전처리를 통해 800pipxel로 resize된 이미지가 input으로 들어가 p2,p3,p4,p5가 output으로 나옵니다.

 

이 p2,p3,p4,p5를 FPN Feature라고 부르겠습니다.

FPN Feature들은 RPN에 input으로 들어가고, RPN에서는 각각의 feature에 대해 물체가 있을만한 영역인 ROI를 생성합니다. 

Training시에는 RPN에서는 ground truth와의 IOU가 0.5 이상이어야 positive, 이외는 negative로 판단합니다. 

positive : negative = 3 : 1이 되도록 학습시켜줍니다.

이때 anchors는 FPN에서와 동일하게  5가지의 scale과 3가지의 aspect ratio를 가집니다. 

NMS를 통해 가장 점수가 높은 N(512)개의 ROI만을 output으로 넘겨주게 됩니다.

 

이후 RPN에서 생성된 ROI를 ROI Align을 통해 7X7 Feature map을 생성해준다. 

사용한 backbone model에 따라 다른 head를 사용한다.

Resnet을 사용할 때는 7x7x1024 featuremap을 만든 후, 한 번 더 conv를 거쳐 7x7x2048의 featuremap을 만들어 준 후, 2stage로 보내줘 이후 각자의 task에 맞게 변형된다.

FPN에서는 mask task를 위해 따로 ROI ALIGN을 진행해준다.

결국 classfication , bbox regression task를 위한 ROI Align을 통해 7x7x256 feature map이 , mask task를 위해 따로  14 x 14 x 256 feature map이 만들어진다. 

 

 

  • Stage 2

3가지 assignment에 맞게 진행이 됩니다. 

classfication, bbox regression은 faster rcnn과 동일하니 따로 설명하진 않겠습니다. 

mask branch중 위의 Resnet을 사용했을 때를 보면 ROI Align을 거쳐 나온 7x7x1024에 3x3 conv와 ReLU를 통해 7X7X2048로 만들어줍니다. 이후 2x2 deconv , stride = 2 를 통해 feature size를 2배로 키워주게 됩니다. 

이후 1x1(FCN)을 통해 14X14X80(class 의 개수)를 output으로 출력해줍니다.

결론적으로 하나의 ROI는 14X14X80 ( $Km^{2}$) shape의 tensor를 output으로 뱉게 됩니다. 

sigmoid를 거쳐 0에서 1사이 값들이 되는데 이는 후처리에서 binary mask가 됩니다.

이후 classfication layer를 통해 ROI의 class를 알 수 있고 k개 중 에측된 클래스인 1개만 선택해 1xmxm tensor가 됩니다

 

 

 

이제 후처리 과정입니다.

mask는 input image에 맞춰 resize 되어야 합니다. 

deconv로 인한 boundary effect를 막아주기 위해 미리미리 패딩을 해줍니다. 

BOX, MASK를 rescale해준 후 , 하이퍼파라미티로 정해놓은 threshold보다 크면 1로 작으면 0으로 binary mask를 싀워줍니다. 최종적으로 [이미지의 높이, 이미지의 너비] 사이즈의 마스크를 얻게 됩니다. 

 

 

 

전체적으로 크게 다시 보면

 

https://developpaper.com/mask-r-cnn/

 

 

📌 Experiments 

COCO dataset을 사용하였고, matrix로는 $ AP, AP_{50}, AP_{75}, AP{S} , AP_{M} AP_{L} $를 사용하였다. 

밑첨자가 숫자인 것은 IOU를 의미하고, S,M,L과 같은 것은 object의 scale을 의미한다.

mask의 IOU를 기준으로 평가되었다.

 

https://cocodataset.org/#detection-eval

 

Instance Segmentation에서는 COCO2015,2016 우승자들보다 압도적으로 더 좋은 성능을 보여줬습니다.

특히 backbone으로 ResNeXt-101에 FPN을 같이 사용했을 때, 좋은 성능을 보였습니다.

논문엔 없는 사견으로는, FPN을 쓴 게 신의 한 수 같습니다. FPN을 사용하지 않을 때는 , 오히려 이전 모델들보다 ap가 낮은 걸 볼 수 있습니다.  

 

 

 

  • ablation study 

(a) FPN을 추가할수록, 모델이 깊을 수록 더 높은 AP를 보여줍니다.

(b) classfication과 mask를 따로 할 때(sigmoid 사용)가 같이 사용(softmax)할 때보다 훨씬 성능이 좋은 것을 보여줍니다. 따로 하는 것이 모델의 학습을 더 쉽게 해준다고 합니다.

(c) RoI Align을 사용했을 때가 3~5%정도 AP가 높은 것을 볼 수 있습니다. 

ROI Warp도 bilinear interpolation을 사용하지만, misalignment를 신경쓰지 않아 ROI Align의 성능이 훨씬 좋은 거 같습니다.

(d) FCN의 stride 크기에 대해 비교합니다. (c)가 16이었다면 (d)는 32로 더 큰 stride에서 더 좋은 성능을 보여줍니다.

그 이유는 stride가 작을 때가 misalignment에 더 취약하기 때문입니다.

(e) FCN의 사용으로 pixel-to-pixel task가 가능해져 최대한 공간 정보를 보존할 수 있었던 mask bracnh의 성능이 더 좋다는 것을 보여줍니다. FCN을 사용하지 않고 MLP(FC layer)를 사용했을 때와 비교하면 훨씬 좋습니다.

 

 

 

  • Bounding box detection Results 

이전까지는 IOU를 Mask기준으로 했을 때고, 아래 사진은 bounding box를 기준으로 했을 때입니다. 

bounding box를 잡는 것보다는 Mask를 잡는 것이 훨씬 어려운 task이지만 AP는 37.1(mask)과 39.8(box)로 큰 차이가 나지 않습니다. 

 

 

 

  • Mask RCNN for Human Pose Estimation 

 

 

 

Pose Estimation도 가능

 

 

Mask RCNN은 여태까지 읽어 본 거중에서 가장 불친절한 논문이었던 거 같습니다. 

하지만 2시간만에 10쪽짜리 논문을 읽어서 신납니당. 처음에는 한 장에 하루였던 거 같은데 늘고 있는 거 같네요

그리고 instance segmentation의 binary mask도 신기합니다. 

'영어논문 스터디' 카테고리의 다른 글

RefineNet 논문 리뷰  (0) 2021.03.03
SSD  (0) 2021.02.01
YOLO v1 리뷰  (0) 2021.01.26
Faster RCNN 논문 리뷰  (0) 2021.01.15
Fast RCNN 논문 리뷰  (0) 2021.01.09