논문 - Mask R-CNN, Kaiming He, Georgia Gkioxari, Piotr Dollar, Ross Girshick, Facebook AI Research (FAIR)
1. Motivations/Problems
Instance segmentation
Image segmentation은 semantic segmentation과 instance segmentation 두 종류가 있다.
- Semantic segmentation: 같은 클래스를 같은 영역으로 분류
- Instance segmenation: 같은 클래스라도 다른 인스턴스로 분류
이처럼 Instance segmentation은 이미지 안의 모든 object를 감지하고, 각 인스턴스로 정확히 분류해야 하기 때문에 까다로운 분야이다.
기존의 방식은 object detection과 semantic segmentation 기법을 합쳐서 수행했는데, 본 논문은 보다 간단하고, flexible, 빠른 프레임워크를 제안한다.
2. Key ideas
Mask R-CNN의 특징
1. Faster R-CNN + mask branch
2. 각 RoI의 feature extraction에 RoIPool 대신 RoIAlign을 사용한다.
3. mask prediction과 class prediction을 분리(decoupling)했다.
1. Mask branch
Mask R-CNN을 간단히 하면 Faster R-CNN에 mask branch를 추가해 확장한 모델이다.
1) RPN (Faster R-CNN과 동일)
2) class 및 bbox offset 예측과 병렬로, 각 RoI에 대한 binary mask를 예측
*Faster R-CNN 크게 두 단계로 구성됩니다. 1) RPN(region proposal network): RoI를 얻는다 2) 각 RoI에서 RoIPooling을 통해 고정된 크기의 feature map을 얻고, 이를 입력으로 fc layer를 사용해 classification과 bbox regression을 수행한다. -> class label과 bbox offset 출력 (출처: herbwood.tistory.com/20) |
Mask branch는 각 RoI마다 binary mask를 출력하는 small FCN(fully convolutional network)이다.
class 별로 mask를 생성하고, 각 픽셀이 class에 해당하는지 여부를 표시한다.
*mask: 각 픽셀이 instance에 해당하는지 아닌지 마스킹
Mask branch는 구현하기 쉽고, small FCN으로 오버헤드가 적다.
2. RoIAlign
Faster R-CNN은 각 RoI에서 feature를 추출할 때 RoIpooling을 사용한다.
(아래의 내용은 블로그 내용을 차용했습니다.)
RoIPool은 각 좌표의 값을 반올림 한 뒤에 pooling을 수행하기 때문에, 원본 이미지의 위치 정보가 왜곡되어 misalignment 문제가 발생한다.
이는 픽셀 단위로 mask를 예측하는 segmentation task의 경우 성능에 큰 영향을 미치기 때문에, 본 논문에서는 이 문제를 해결하기 위해 RoIPool 대신 RoIAlign을 도입한다.
RoIAlign은 feature map에서 근접 grid point(파란색 화살표의 시작점)를 bilinear interpolation 연산을 통해 weight sum을 계산하여 각 샘플링 포인트 값을 계산합니다.
Faster R-CNN과 다르게 quantization을 사용하지 않는다.
*quantization (추가) |
RoIAlign의 과정
1) feature map을 원하는 출력에 맞춰 분할한다.
2) 분할된 하나의 cell(파란 점선)에서 4개의 sampling point를 찾는다.
3) Bilinear interpolation을 적용한다.
4) 2)~3) 과정을 모든 cell에 대해 반복한다.
5) 한 cell에 있는 4개의 sampling point에 대하여 max pooling을 수행한다.
RoIAlign을 사용했을 때 mask accuracy가 10~50% 향상했다.
*Bilinear interpolation 2차원 좌표 상에서 두 좌표가 주어졌을 때 중간에 있는 값을 추정하는 방법 점 P에서 x축 방향으로 사각형의 변까지의 거리를 w1, w2, y축 방향으로 거리를 h1, h2라 하고, 알려진 네 점에서의 데이터 값을 A, B, C, D라 할 때, P에서의 데이터 값 (단, α=h1/(h1+h2), β=h2/(h1+h2), p=w1/(w1+w2), q=w2/(w1+w2)). (출처: darkpgmr.tistory.com/117 ) |
3. Mask prediction과 class prediction의 Decoupling
Mask R-CNN의 또 다른 핵심은 mask prediction과 class prediction을 분리했다는 것이다.
Mask R-CNN은 classifiaction, bbox regression, mask 이 세 개의 branch를 동시에 학습시키기 위해서 multi-task loss를 사용한다.
- Lcls: classification loss
- Lbox: bbox loss
- Lmask: masking loss (positive RoI에 의해 정의됨)
(위의 식을 보면 각 loss가 서로 독립적임을 알 수 있다.)
Lcls과 Lbox는 Faster R-CNN과 동일하고, Lmask는 average binary cross entropy loss를 사용한다.
Mask branch는 각 RoI 당 K 개의 m^2 small feature map을 출력하는데, 이 출력에 픽셀 별로 sigmoid를 적용하고 loss를 계산한다.
*Binary cross entropy (추가) |
이렇게 Lmask를 정의하여 mask branch와 class branch를 분리(decouple)했다.
기존의 방식은 pixel 별 sortmax를 적용하고 multinomial cross entropy loss를 사용한다. 이 경우 class 간에 mask가 경쟁하게 된다.
Mask R-CNN은 pixel 별로 sigmoid와 binary loss를 사용하여 class에 대한 경쟁없이 class 별로 mask를 생성할 수 있게 된다. 이 방법이 기존 방법보다 좋은 성능을 보임을 실험에서 증명했다.
(*이해가 어려워 원문을 가져왔습니다.) Our definition of Lmask allows the network to generate masks for every class without competition among classes; we rely on the dedicated classification branch to predict the class label used to select the output mask. This decouples mask and class prediction. This is different from common practice when applying FCNs [30] to semantic segmentation, which typically uses a per-pixel softmax and a multinomial cross-entropy loss. In that case, masks across classes compete; in our case, with a per-pixel sigmoid and a binary loss, they do not. We show by experiments that this formulation is key for good instance segmentation results. |
3. Design
Mask R-CNN의 아키텍처는 크게 두가지로 나뉜다.
1) 전체 이미지에 대한 feature extraction을 위한 convolution backbone architecture
2) 각 RoI에서 bbox recognition(classification 및 regression)과 mask prediction을 위한 network head
1) Convolution backbone architecture
본 논문에서는 depth 50 또는 101 ResNet, ResNext, FPN 등 다양한 backbone을 사용해 평가했다.
FPN backbone
FPN은 Feature Pyramid Network로, lateral connection의 top-down architecture를 사용한다.
FPN을 사용하는 Faster R-CNN은 feature pyramid의 서로 다른 레벨에서 RoI feature를 뽑아낸다. (나머지는 vinilla ResNet과 같다.)
*FPN single-scale의 이미지에서 다양한 scale의 feature map을 출력하는 네트워크 (참고: herbwood.tistory.com/18) |
Mask R-CNN에서 feature 추출에 ResNet-FPN 백본을 사용했을 때 정확도와 속도에서 엄청난 향상을 보였다.
2) Network head
Backbone에 따라 head의 구조가 달라지게 된다. 본 논문에서는 두 개의 Faster R-CNN의 헤드를 확장했다.
4. Performance
COCO 데이터세트로 다양한 실험을 진행했다.
(80K train image와 35K val image의 subset을 사용해서 훈련, 나머지 5K val image로 테스트)
*ablation eperiment Ablation study는 모델이나 알고리즘을 구성하는 다양한 구성요소(component) 중 어떠한 “feature”를 제거할 때, 성능(performance)에 어떠한 영향을 미치는지 파악하는 방법을 말한다. 좀 더 막연한(coarse) 정의로는, 제안한 요소가 모델에 어떠한 영향을 미치는지 확인하고 싶을 때, 이 요소를 포함한 모델과 포함하지 않은 모델을 비교하는 것을 말한다 (출처: https://sangminwoo.github.io/glossary/atod) |
Mask R-CNN은 모든 SOTA 모델보다 좋은 성능을 보였다.
Mask R-CNN과 FCIS를 비교했을 때, Mask R-CNN은 overlapping object에 대해서도 좋은 성능을 보인다.
Mask R-CNN의 다양한 조건을 변경해서 실험을 진행했다.
(a) Backbone architecture: 네트워크가 깊을수록 성능이 좋다. C4 보다 FPN이, ResNet보다 ResNeXt가 성능이 좋다.
(b) Multinomial vs Independent Masks(ResNEt-50-C4): mask branch를 분리했을 때 성능이 좋다.
(c) RoIAlign(ResNet-50-C4): RoIAlign을 사용했을 때 가장 좋은 성능을 보인다. (pixel-level에서 masking을 수행하기 때문에 위치 정보를 적절히 유지하는 것이 중요함을 의미)
(e) mask branch(ResNet-50-FPN): mask prediction에 MLP 보다 FCN을 사용하는 것이 좋은 성능을 보인다. FCN은 공간 레이아웃을 명시적으로 인코딩하기 때문에 pixel-to-pixel task에서 좋은 성능을 보인다.
[참고]