728x90

Introduction

 

기존의 Object Detection과 Semantic segmentation을 위한 모델들 (Fast/Faster R-CNN, FCN) 등이 개발이 되어있지만 이 둘을 결합한 Instance Segmentation은 여전히 연구가 많이 되고 있는 분야이다. Class가 아닌 각 물체마다의 정확한 pixel 단위의 구분을 해야하는 과제에서 저자는 Mask R-CNN 이라는 모델을 제안하고 있다.

 

Mask R-CNN은 기존 object detector로 사용된 Faster R-CNN에 각 Region of Interest (RoI) 마다 segmentation mask를 예측하는 단계를 하나 추가한 모델이다. (본 논문에서는 branch 라는 단어를 사용했는데 기존 Faster R-CNN의 branch인 classification과 box regression에 가지 하나를 추가한 느낌이라고 이해하면 된다) 이 branch는 각 RoI마다 FCN(Fully Connected Network)를 적용한 것으로 이를 통해 픽셀 단위의 segmentation을 수행할 수 있게 된다.

 

이론적으로 본다면 Mask R-CNN은 단순히 Faster R-CNN에 segmentation mask를 예측하는 단계를 하나 추가한 것이지만, Mask R-CNN의 특징은 크게 두 가지로 이야기 할 수 있다.

 

우선, Faster R-CNN은 pixel 단위의 조정 (alignment) 를 전혀 고려하지 않고 설계가 되었다는 점이다. 이는 RoIPool 단계에서 확실하게 알 수 있는데 고정된 feature map을 생성하기 위해 즉, 공간에 대한 정보를 정량화 하는 과정에서 세밀하지 못하다는 것이다. (어떤 부분에서 RoIPooling layer가 세밀하지 못하다고 이야기하는지는 이후 RoIAlign 부분에서 다룬다) 따라서, pixel 단위의 정확한 정량을 위한 RoIAlign 이라는 간단한 layer를 대신 사용하였다. 단순히 RoIPool layer를 RoIAlign layer로 바꾼 것에 불과하다고 볼 수 있지만  실제로 mask accuracy 값은 50%이상 높아졌다.

 

또한, mask prediction과 class prediction을 분리하여 진행하였다는 것이다. 즉, 각 class마다 이 픽셀이 object가 있는지 없는지를 예측하는 binary mask가 존재한다는 것이다. 이로 인해 class들간의 competition이 없고 해당 카테고리가 어떤 것인지는 RoI classification 결과값을 활용하면 되는 것이다. (FCN은 이와는 정 반대로 작동하게 된다. Mask R-CNN이 class별 binary mask를 만들어서 해당 픽셀에 특정 class object가 존재하는지 아닌지를 판단한다면 FCN은 해당 픽셀에 object가 있는지 없는지 그리고 어떤 class의 object가 존재하는지를 판가름하게 된다. 즉, segmentation과 classification을 같이 실행하게 되는 것이다. 본 논문에서 FCN과 같이 둘을 결합해서 실험을 진행했을 때, 오히려 더 결과가 안좋았다고 한다.)

 

Multinomial & Softmax (Dependent) vs. Binary & Sigmoid (Independent)

 

 

Mask R-CNN

 

Mask R-CNN은 개념적으로 Faster R-CNN의 2개의 output (class label, bounding box offset) 에 세 번째 branch, obejct mask에 대한 output을 더한 것이다. 하지만 mask output은 class label과 bounding box output과는 별개로 동작되며 특정 object에 대해서 좀 더 세밀하게 특징을 추출하게 된다. 이제 Mask R-CNN의 주요 특징들에 대해서 알아보자

 

Faster R-CNN

 

해당 모델이 어떻게 동작되는지에 대해서 설명이 되어있으나 생략하도록 한다. 해당 모델에 대한 논문 리뷰는 다음 링크에 있다.

 

Mask R-CNN

 

Mask R-CNN은 Faster R-CNN의 첫 번째 단계인 RPN은 그대로 동일하게 사용한다. 하지만 두 번째 단계인 class label과 bounding box offset을 내는 구간에서 각 RoI에 대한 binary mask 값을 산출하는 branch를 하나 추가한다. 앞서서 말했던 것처럼 기존에 mask prediction, 즉 해당 픽셀이 어떤 class로 구분이 되었느냐에 기반하여 classification label 값도 정한 것과는 다르게 mask prediction과 classification이 독립적으로 진행된다.

 

training 과정 동안 각 RoI에 대한 multi-task Loss는 다음과 같이 표현된다

 

$L\ =\ L_{cls}\ +\ L_{box}\ +\ L_{mask}\\ L_{cls\ }\ :\ soft\max _{ }^{ }\ cross\ entropy\\ L_{box}\ :\ Regression\\ L_{mask}\ :\ binary\ cross\ entropy$

 

RoI에 대해서 각 mask branch는 $Km^2$ dimension의 output을 갖게 된다. 여기서 K는 class label의 숫자이고 각 RoI는 mxm 크기의 해상도를 갖는 것이다. 또한, $L_{mask}$ 는 k번째 mask 값만을 계산한다. 다시 말해보자면 $L_{mask}$ 값 안에는 k개의 class에 대한 각각의 mask prediction이 들어가있다. 

 

$L_{mask}\ =\ L_{c1}\ +\ L_{c2}\ +\ ...\ +\ L_{ck}$

 

이 때, classification label에 대한 결과로 RoI의 class label이 $c3$ 으로 예측되었다고 해보자. 그러면 3번째 class를 제외한 나머지 class label의 값은 모두 loss값의 계산에서 빠져야한다. 따라서 $L_{mask}$ 는 $L_{c3}$ 로 정의되는 것이다.

 

Mask Representation

 

기존의 Faster R-CNN은 class label과 box offset 결과를 내기 위해 fc layer를 이용하여 K차원 혹은 4차원 형태의 작은 벡터로 표현하였다. 하지만 mask prediction하는 과정에서 input object에 대한 공간적인 layout을 받아야 한다는 문제점이 생기게 된다. 이를 위한 해결책으로 각 RoI마다 FCN(Fully Convolutional Networks for Semantic Segmentation) 을 적용하고 이로 인해 공간 정보를 잃어버리는 것 없이 mxm 차원의 object spatial layout을 유지할 수 있게 된다. 더불어 fc layer를 사용하는 것보다 parameter의 수도 훨씬 줄게 되고 정확도가 높다는 실험 결과도 얻을 수 있었다.

 

MLP vs. FCN

 

RoIAlign

 

RoIPool은 각 RoI에서 고정된 feature map을 뽑아내는 방법이었다. RoIPool 동작 과정에 대해서 간략하게 설명해보자. 아래에서 왼쪽 그림에서 왼쪽 grid가 최종 feature map이고 feature map 위에 붉은 색의 RoI가 Sampling 된 것이다.  이 때, RoI Pool은 우선적으로 feature map을 discrete하게 나누기 위해 RoI 위에 있는 소숫점 숫자들을 모두 정수로 바꿔준다. 그리고 이렇게 바뀐 RoI 값을 spatial bin으로 나눈 후에 각 bin 안의 값들을 max pooling 혹은 average pooling 하여 오른쪽과 같은 최종 feature map을 생성한다.

 

<왼쪽> : Feature map 위의 RoI                                                      <오른쪽> : RoI를 quantized 한 결과 (위치가 살짝 바뀐 것을 볼 수 있다)

 

RoI Pooling의 최종 결과

 

하지만 이런 공간을 양자화하는 과정 (Quantization) 이 pixel 단위로 넘어가게 되면 문제가 발생된다는 것이다. 우선 Quantization은 $x$ 라는 coordinate가 있으면 이를 $\left[x/16\right]$ 을 하여 계산하게 된다. 여기서 대괄호는 올림을 의미하는데 위의 그림을 보면 quantization을 적용한 후에 box의 위치가 살짝 바뀐 것을 볼 수 있게 된다. 즉, 실제 RoI 위치와 extracted feature 사이의 misalignment가 발생되는 것이다. 사실 기존 Faster R-CNN이 사용한 것처럼 classification에 사용하려는 목적이라면 이런 작은 차이는 큰 결과를 가져오지 않지만 pixel 단위로 예측해야 하는 Mask R-CNN의 경우에는 이런 작은 차이도 큰 결과의 변화로 이어지게 되는 것이다.

 

이 문제를 해결하기 위해서 harsh quantization을 수행하는 RoIPool 대신에 RoIAlign layer를 사용하게 된다. 방법은 간단하다. 기존의 coordinating하는 과정에서 $\left[x/16\right]$ 대신 $x/16$ 을 사용하는 것이다. 그 후에는 bilinear interpolation을 활용하여 각 RoI bin에 input feature의 정확한 값을 계산하여 넣게 되는 것이다.

 

Bilinear Interpolation for RoI Align

 

Result of RoIAlign

 

실제 RoIPool, RoIWarp, RoIAlign 3가지 방법을 모두 비교했을 때, RoI Align을 적용했을 때 가장 결과가 좋았다.

 

Network Architecture

 

Mask R-CNN에서는 크게 두 가지를 달리 해서 모델을 생성하였다. 우선 하나는 전체 이미지에서 feature을 뽑아내는 backbone architecture과 다른 하나는 각 RoI에 대해서 생성되는 bounding box recognition (classification and regression) 과 mask prediction의 head 부분이다.

 

우선, backbone architecture은 ResNet과 ResNext 모델을 사용하였고 각각 50 혹은 101 layer를 적용하였다. Faster R-CNN을 ResNet50를 backbone 모델로 사용하고 feature을 4번째 단계의 마지막 convolution layer에서 가져온 케이스에 대해서는 ResNet-50-C4 라고 명명하였다.

 

또한, 더 다양한 backbone을 적용하게 위해 Feature Pyramid Network (FPN) 을 사용하였다. FPN을 backbone 모델로 활용한 Faster R-CNN은 각 feature pyramid의 층마다 RoI feature을 뽑아낸다는 점을 제외하고 나머지는 vanilla ResNet과 동작과정이 동일하다. 

 

Network head에 대해서는 아래 그림과 같이 적용하였다.

 

 

Backbone Architecture

 


 

<References>
He, K., Gkioxari, G., Dollár, P., & Girshick, R. (2017). Mask r-cnn. In Proceedings of the IEEE international conference on computer vision (pp. 2961-2969).
YouTube. (2018.01.07)
PR-057 : Mask R-CNN [https://www.youtube.com/watch?v=RtSZALC9DlU&t=1166s]

+ Recent posts