취미가 좋다

Mask R-CNN 정리 본문

논문

Mask R-CNN 정리

benlee73 2021. 3. 17. 17:04

Mask R-CNN

Kaiming He Georgia Gkioxari Piotr Dollar Ross Girshick

Facebook AI Research (FAIR)


 

Mask R-CNN의 시작은 Faster rcnn으로 찾은 RoI에서, FCN을 이용하여 segmentation을 하자는 아이디어에서 시작되었다.

Faster rcnn + FCN 의 아이디어

 

 

동작 순서

1. 이미지 전처리

1) 입력 이미지 resize (bilinear interpolation)

2) Backbone network의 입력 사이즈에 맞게 이미지 padding

 

2. Backbone

1) ResNet을 통해 여러 층의 feature map (C1, C2, C3, C4, C5) 생성

2) FPN을 통해 최종 feature map (P2, P3, P4, P5, P6) 생성

 

3. RPN

1) 각 픽셀 별로 anchor box를 생성하고, 그 box에 대한 objectness와 bbox regression을 구한다.

2) bbox regression (box 위치)에 맞게 이전에 만든 feature map을 잘라 RoI를 만든다.

3) NMS를 통해 RoI를 줄인다.

 

4. RoI Align

1) 크기가 다른 RoI들의 크기를 동일하게 맞춰준다.

 

5. 3개의 branch 통과

1) Classfication 으로 클래스 예측

2) bbox regression 으로 box 좌표 수정

3) FCN 기반의 mask branch 에서 binary mask 생성

 

classification / bbox regression은 Fully Connected Layer를 사용한다.

 

 

 

Faster R-CNN 과의 차이점

1) 마스크 branch 추가

- RPN을 통해 찾은 RoI의 binary mask를 예측하는 CNN(FCN) 추가

- 그 box의 class는 기존의 faster rcnn

- branch를 하나만 추가하면서 object detection이 아닌 instance seg가 됨

 

- 기존 FCN과는 조금 차이가 있다.

a) 픽셀 수준의 classification을 진행하기 위해 softmax를 사용했지만, 다른 branch에서 classification을 수행하므로 물체인지 아닌지만 구분하면된다. 따라서 sigmoid를 사용한다.

b) 영역 내 여러 instance에 대한 예측을 수행해야 했지만, 한 object에 대한 영역만을 잘라서 보내주니 그럴 필요 없다.

 

2) RoI Align

: RPN에서 나온 영역들의 사이즈를 동일하게 맞추기 위한 pooling 작업을 더 정교하게 수정하여 성능을 향상시켰다.

instance segmentation 뿐만 아니라 object detection의 성능도 올라갔다.

 

- Faster R-CNN에서 사용한 RoI Pooling은 RPN에서 통과되어 나온 결과를 조금씩 무시하며 계산하였다.

a) 실수로 나온 좌표값을 정수로 반올림한다.

b) box를 7x7로 적절히 나누기 때문에, 49개의 영역이 모두 동일한 사이즈를 갖지는 못한다.

c) 각 영역에서 max pooling을 진행한다.

 

- RoI Align은 interpolation을 사용하여 실수의 좌표를 그대로 활용하여 더 정확하게 값을 활용한다.

a) 실수값을 반올림하지 않고, RPN에서 나온 영역에서 정확히 7x7 등분을 하고, 다시 영역을 2x2로 나눈다.(2x2는 예시)

b) 2x2로 나눈 영역을 서브셀이라고 하고, 각 서브셀의 값은 interpolation하여 결정한다.

c) 서브셀들을 max pooling하여 7x7에서의 값을 결정한다.

 

3) mask를 예측할 때 클래스를 고려하지 않고, binary mask를 생성

- 해당 RoI의 클래스는 기존 faster rcnn의 다른 branch가 예측

- resnet, fpn을 백본으로 사용하면 성능이 올라감

 

backbone

: 입력 이미지의 feature extraction

- 여러 백본을 적용해보았으며, ResNeXt 101 FPN을 사용했을 때 성능이 가장 높았다.

 

- ResNet, RestNext

깊이는 50 or 101 layer를 사용하고, 4번째 Conv layer에서 feature를 뽑아낸다.

이것을 사용하면 ResNet-50-C4 라고 부른다.

 

- FPN

ResNet에서 conv layer를 반복하면 bottom-up 방식으로 여러 layer의 feature map이 생성된다.

그 feature map에서 top-down 방식으로 최종 feature map을 다시 만든다.

 

FPN을 통해 여러 feature map 을 사용할 수 있으므로, 여러 scale의 anchor box를 생성하지 않아도 된다.

작은 feature map 에서는 큰 object, 큰 feature map에서는 작은 object를 찾을 수 있다.

기존에는 픽셀마다 3개의 scale, 3개의 ratio로 총 3x3=9 개의 anchor box를 생성했지만, 지금은 3개의 anchor box만 필요하다.

 

 

Loss Function

: L = Lcls + Lbox + Lmask

3개의 branch 각각의 loss이다.

 

RPN (Region Proposal Network)

CNN으로 입력 이미지의 feature map을 RPN의 입력으로 사용한다.

feature map의 각 픽셀마다 anchor box를 생성하여 objectness score와 RoI의 좌표를 출력한다.

selective search 알고리즘 대신 region proposal 과정을 수행하여 시간을 단축할 수 있었다.

 

RPN은 두 번의 convolution 연산을 수행한다.

3x3 conv filter 256개를 연산하여 depth를 256으로 만든다.

그 후 1x1 conv 두개를 이용하여 각각 classification과 bbox regression을 계산한다.

 

RPN의 학습 과정은 아래와 같다.

1) pre-trained된 backbone의 결과로 RPN만을 먼저 학습시킨다.

2) RPN을 고정시키고 모델 전체를 학습시킨다. (FC Layer, backbone, detector...)

3) 모델을 고정시키고 RPN만을 재학습시킨다. backbone은 freeze하여 학습하지 않는다.

4) RPN을 고정시키고 모델을 재학습시킨다.

 


참고

https://youtu.be/RtSZALC9DlU

 

Comments