Mask R-CNN
제목이 제일 심플하네
1. Abstract
다들 본인 분야가 제일 챌린징하다고 말하더라
Instance segmentation은 다른 부분에 비해서 조금 challenging 하다.
1) object detection 별로 개별 object 에 대해서 판단을 해야할 뿐 아니라
2) semantic segmentation 처럼 각 픽셀별로 object 에 대한 판단을 해야 하기 때문이다.
어떻게 보면 이 두 분야를 섞은 게 instance segmentation이라고 할 수 있다.
그래서 복잡해보일 수 있는 이 문제를, 본 논문에서는 쉽게 접근하고자 했다.
Faster R-CNN의 확장판 같은 느낌으로 만들었는데,
기존에 존재하던 classification과 bbox regression 와 병렬적으로 ROI (region of interest) 의 mask를 예측하는 브랜치를 추가했다고 한다. 이 브랜치는 작은 FCN(fully convolutional network) 으로 이루어져있고, 픽셀단위로 mask를 예측한다.
Faster R-CNN과 구조가 거의 유사하기 때문에 Mask R-CNN의 동작은 쉽다고 한다!
하지만 애초에 Faster R-CNN은 object detection을 위한 모델인만큼 고려해야할 부분이 있다.
기존에는 ROI pooling layer를 통해서 latent vector를 뽑아냈다면,
여기서는 픽셀 단위로 pooling을 할 수 있게 ROI Align이라는 모듈을 이용하기로 한다.
performs coarse spatial quantization for feature extraction : ROIAlign
간단해 보이는 이 모듈이 실제로는 엄청난 효과!
1) 이전 mask prediction 성과들 대비 10% ~ 50% 상승한 효과를 보였다고 한다.
2) 또한 mask랑 class prediction을 분리시켜서 더 cls 에도 더 좋은 성능을 냈다고 한다.
그러니까 픽셀별로 cls를 하기는 하지만, 어차피 여기서는 cls 브랜치가 따로 있기 때문에 두 개의 기능이 decouple 된다.
블라블라 우리 성능 짱
3. Mask R-CNN
해당 모델의 output: 각 candidate object 별로 1) class label 2)bounding box offset 3)object mask
@mask r-cnn
$L = L_{cls} + L_{box} + L_{mask}$
mask branch의 출력값은 K * $M^{2}$ 개인데, 이때 K는 클래스 수, M은 feature map의 resolution 이다.
이때 $L_{mask}$의 경우 실제 레이블이 k 인 경우, k 번째 mask 에 대해서만 시행했다고 한다.
이렇게 함으로써 class 별로 경쟁하는 거 없이 모든 class 에 대한 mask를 생성할 수 있었다고 한다. (cls는 cls branch에만 의존하니까!: 이게 안 되서 다른 semantic segmentation 에서는 multinomial cross entropy loss 를 쓴다고 함)
$L_{mask}$ 픽셀별로 mask 예측한 값을 1) 시그모이드 함수를 거쳐서 2) BCE Loss 로 계산했다고 한다.
@mask representation
기존의 cls, bbox regression 의 경우 feature map을 뽑은 다음에는 결국 fc layer를 거치기 위해서 1차원으로 flatten 을 시키는 과정이 필수적이었다. 하지만 segmentation을 할 때는 이런식으로 진행하면 공간 정보를 무조건 잃게 된다!
그렇기 때문에 segmentation을 시행할 때는 FCN을 통해서 ROI의 m*m mask를 예측하려고 한다. FCN 구조를 사용함으로써 우리는 계속해서 m*m 으로 연산을 할 수 있기 때문이다. 또 다른 논문을 언급할 때도 나왔지만 fc 레이어보다는 합성곱 레이어가 파라미터수가 더 적기 때문에(희소 행렬이니까) 연산면에서도 이점을 가진다.
그래서 픽셀별로 공간 정보를 잘 유지하기 위해서는 ROI feature이 필요하고, 이게 ROIAlign 레이어가 출범하게 된 계기다!
@RoIAlign
RoIPool 은 ROI 에서 feature map을 추출하는 레이어다.
하지만 문제는 RoIPool은 quantize 한다는 점이다!
예전에 개발새발로 그린 그림을 참고하자.
이렇게 feature map 에서 ROI를 추출할때도 우리는 int로 반올림한다. 여기서 첫번째 quantization이 일어난다.
여기서도 2*2의 latent vector로 추출하기 위해서 quantization (살짝 애매) 를 하고 있다.
그런데 이런식으로 feature map에서 추출하는 ROI는 잘 맞지 않는다는 문제가 있다 : misalignment!
이게 cls에는 큰 영향을 주지 않더라도, 픽셀별로 예측하는 mask prediction에는 지대한 영향을 준다.
그렇기 때문에 RoIAlign이 나온다!
기존에는 [x/16]이라는 반올림을 이용했다면 여기서는 그냥 x/16을 한다. 대신 bilinear interpolation을 이용함 Simple!
예전에 수업했던 자료를 가져왔다. 이걸 보면 이해가 쉬울듯 bilinear interpolation이 무엇인가에 관해..
일단 RoI를 bin으로 나눈다(초록 실선) : latent vector size
그리고 각 bin에서 4개의 point를 sampling 한다.
이제 각 sampling 별로 bilinear interpolation을 한다.
그 후에 이 4개의 점의 최대값을 계산하거나 평균값을 취한 값을 이용함.
@network architecture
1) the convolutional backbone architecture used for feature extraction over an entire image
backbone으로는 ResNet과 FPN을 써봤는데, 전자의 경우가 정확도나 속도면에서 좋았다고 한다.
2) the network head for bounding box recognition (cls, bbox reg) and mask prediction that is applied separately to each ROI.
resnet을 쓸 때는 resnet-c5를 함께 이용함
fpn을 쓸 때는 backbone에 이미 모두 포함되었기 때문에 별도의 추가 필터를 헤드에서 사용하지는 않았음
3.1 Implementation Details
@Train
- 만약 ROI와 gt box의 IoU값이 0.5 이상이면 positive, 아니면 negative
- $L_{mask}$는 positive한 RoI 대상으로만 계산
- pos:neg = 1:3의 비율로 미니 배치 구성 => (미니배치 사이즈) N= 64
- 기타 디테일은 관심있으면 보시라
@Inference
(resnet을 backbone으로 썼을 때 기준)
1) 300개의 proposal
-> 2) box prediction branch & nms
-> 3) 상위 100개의 prediction score인 bbox 대상으로만 mask branch 수행 : 속도, 정확도 상승
-> 4) mask branch에서는 RoI 당 K개의 마스크를 예측함(이때 K는 클래스 개수)
-> 5) mask loss 계산할 때는 cls branch 예측 결과인 k 번째 mask 만 이용함
4. Experiments
관심있으면 읽어보시라~
'딥러닝 > CV 논문' 카테고리의 다른 글
[NLP]Transformer_ver2 (3) | 2024.10.05 |
---|---|
[Generation]GAN - 2부 (0) | 2022.08.09 |
[Object Detection] Faster R-CNN (0) | 2022.07.27 |
[Classification] ResNet 요약 (0) | 2022.07.10 |
[Object Detection] CenterNet2 요약 (0) | 2022.03.21 |
댓글