Instance Segmentation
Instance Segmentation은 이미지에 존재하는 모든 객체를 탐시하는 동시에 각 인스턴스를 픽셀 단위로 분류하는 task이다. Semantic segmentation은 객체의 종류별로 구분을 한다는 차이점이 있다. Instance segmentation은 각 객체를 탐지하는 Object detection과 카테고리를 분류하는 Semantic segmentation이 결합되었다고 볼 수 있다.
Mask R-CNN
Mask R-CNN은 Faster R-CNN의 RPN이 출력한 RoI에 대하여 객체의 class를 예측하는 classification branch, bbox regression을 수행하는 bbox regression branch와 평행으로 segmentation mask를 예측하는 mask branch를 추가한 구조를 가지고 있다. mask branch는 각각의 RoI에 작은 크기의 FCN이 추가된 형태이다. Segmentation task를 보다 효과적으로 수행하기 위해 논문에서는 객체의 sptial location을 보존하는 RoIAlign layer를 추가했다.
Main Ideas
Mask branch
Mask R-CNN은 두 branch와 병렬구조로 segmentation mask를 예측하는 branch가 추가되어 있다. RoI pooling을 통해 얻은 고정된 크기의 feature map을 mask branch에 입력해 segmentation mask를 얻는다. 여기서의 Mask는 각 객체 class에 따라 분할된 이미지 조각이다.
여기서는 픽셀 별로 class를 분류해야 하기 때문에 detection보다 더 정교한 sptial layout, 공간적 배치 정보를 필요로 한다. 이를 위해 Mask branch는 여러 개의 conv layer로 구성된 작은 FCN의 구조를 띄고 있다. class label이나 bbox offset은 fc layer에 의해 output vector로 붕괴되는 것과 달리 segmentation mask는 이미지 내 객체에 대한 공간 정보를 효과적으로 인코딩하는 것이 가능하다.
mask branch는 각각의 RoI에 대하여 class 별로 binary mask를 출력한다. 여기서 Mask prediction은 classification branch에 의존하지 않고, class 별로 Mask를 생성한 후 픽셀이 해당 class에 해당하는지 여부를 표시한다. 논문에서는 mask branch와 classification brach를 결합하는 방식을 사용할 경우 성능이 크게 하락했다고 한다.
mask branch는 최종적으로 크기의 feature map을 출력한다. 여기서 m은 feature map의 크기이고, k는 class의 수를 의미한다.
RoIAlign
RoI pooling을 사용하면 입력 이미지 크기와 상관없이 고정된 크기의 feature map을 얻을 수 있다는 이점이 있다. 하지만 이 때 얻은 feature map과 RoI가 어긋나는 misalignment가 발생한다고 저자들은 말한다. 이러한 어긋남은 pixel mask를 예측하는데 매우 안 좋은 영향을 끼친다고 한다.
RoI pooling 시 위 그림처럼 실수 입력값을 정수와 같은 이산 수치로 제한하는 quantization 과정에서 misalignment가 유도된다고 저자들은 말한다. 이것은 RoI를 sub sampling ratio대로 downsampling하려는 과정에서 일어난다. 위 그림에서는 feature map의 마지막 row에 대한 정보가 소실될 수 있다.
RoIAlign은 다음과 같은 순서로 동작한다.
- RoI projection을 통해 얻은 Feature map을 quantization 과정 없이 그대로 사용하고, 이후 출력하고자 하는 feature map의 크기에 맞게 projection된 feature map을 분할한다. 위의 예시에서는 3x3의 feature map을 출력할 것이기 때문에 width, height를 각각 3등분 한다.
- 분할된 하나의 cell에서 4개의 sampling point를 찾는다. 이는 cell의 h, w를 각각 3등분하는 점에 해당한다.(가운데 그림 파란 점)
- 그 다음 Bilinear interpolation을 적용한다.
- 2~3과정을 모든 cell에 반복한다.
- 하나의 cell에 있는 4개의 sampling point에 대하여 max pooling을 수행한다.
위 과정을 통해 misalignment 문제를 보완하고, RoI의 정확한 spatial location을 보존하는 것이 가능해진다. 또한 mask accuracy가 크게 향상된다고 한다.
Loss function
Mask R-CNN은 classification loss, bounding box loss, 그리고 mask loss로 binary cross entropy loss를 사용한다. 이는 mask branch에서 출력한 K^2m 크기의 feature map의 각 cell에 sigmoid function을 적용해 구한다.
기존 segmentation 모델은 픽셀별로 서로 다른 class에 softmax loss를 사용했는데, Mask R-CNN은 class branch와 mask branch를 분리하여 class별로 mask를 생성한 후 binary loss를 구한다.
Training Mask R-CNN
Mask R-CNN은 backbon network로 ResNet-FPN을 사용한다.
1) Input image Pre-processing
이미지를 네트워크에 입력전 전처리 과정으로, w, h 중 더 짧을 쪽이 target size로 Resize된다. 그리고 더 긴 쪽은 aspect ratio를 보존하는 방향으로 Resize된다. 만약 더 긴 쪽이 maximum size를 초과하면 maximum size로 resize되고 더 짧은 쪽이 aspect ratio를 보존하는 방향을 Resize된다.
2) FPN
전처리된 이미지를 ResNet-FPN에 입력해 feature pyramid를 얻는다.
https://2021-01-06getstarted.tistory.com/89
3) Region proposal by RPN
2에서 얻은 pyramid별로 RPN에 입력해 objectness score와 bbox regressor를 가진 Region Proposal을 출력한다.
4) best Proposal layer
RPN을 통해 얻은 Region proposal 중 최적의 RoI를 선정한다.
5) feature map by RoI Align layer
RoIAlign 과정을 통해 7X7 크기의 feature map을 출력한다.
6) Classification and Bounding box regression by Fast R-CNN
5과정에서 얻은 Feature map을 fc layer를 거쳐 classification, bbox regression branch에 전달한다. 이를 통해 최종 class score와 bbox regressor를 얻는다.
7) Mask segment by Mask branch
8) Post-processing of masks
최종 출력된 14X14크기의 Feature map을 원본 mask와 비교하기 위해 rescale 과정을 거친다. 이후 mask threshold(0.5)에 따라 각 mask segment의 픽셀값이 0.5 이상인 경우 class에 해당하는 객체가 있어 1을 할당하고 미만의 경우 0을 할당한다.
'DL > Object detection' 카테고리의 다른 글
YOLO v3 (0) | 2024.01.22 |
---|---|
[논문 리뷰] Object Detection in 20 Years: A Survey (0) | 2024.01.19 |
FPN (Feature Pyramid Networks for Object Detection) (0) | 2024.01.17 |
YOLO v2 (1) | 2024.01.15 |
YOLO v1 (1) | 2024.01.05 |