Segmentation이란, Bounding box를 구하는 것에 만족하지 않고 픽셀 레벨에서 어디까지 객체에 해당하는지 예측하는 것을 의미한다.
Semantic Segmentation과 Instance Segmentation으로 구분되며, Sementic Segmentation은 의미적으로 무엇에 해당하는지만 분류하고, Instance Segmentation은 여러 마리 강아지가 있으면 각 객체를 다른 객체로 인식하는 것까지의 과정을 포함한다.
Fully Convolutional Network는 Classification에서 성능을 검증 받은 기존의 네트워크(ex. AlexNet, VGGNet, GoogLeNet)를 이용하되, 네트워크의 마지막에 FC Layer를 삽입하지 않고, Convolution Layer로 대체하는 모델을 의미한다.
FC Layer를 사용하면 고정된 크기의 입력을 받아야 하고, 모든 노드들이 서로 곱해진 후 더해지는 연결 때문에 위치 정보가 손실되는 문제가 존재하기 때문에 이를 해결하고자 FC Layer를 없애자는 아이디어에서 시작한 것이 FCN이다.
아래의 그림을 보면, FC Layer를 포함한 구조에선 출력이 정답 카테고리별 확률을 나타내며 위치 정보가 존재하지 않는 반면에, FC layer를 Convolution Layer로 변경한 구조에선 고양이가 있어야 하는 곳에 위치 정보가 남아있는 heatmap이 출력으로 나타나는 것을 확인할 수 있다.
FCN의 끝은 1x1의 kernel size와 class 개수 만큼의 channel을 지닌 컨볼루션 계층으로 구성된다. 이렇게 예측된 Feature map의 size를 input size와 맞추기 위해 upsampling하여 Segmentation 결과를 얻는다.
아래 그림을 보면, 입력 이미지는 pool5까지 점진적으로 다운샘플링되면서 특징을 추출한다. 이후, pool5의 Feature Map을 32배 업샘플링하여 예측을 수행하는 것이 FCN-32s이다. 하지만 이 방법은 공간적 정보가 손실될 가능성이 크다.
이를 보완하기 위해 pool5의 Feature Map을 2배 업샘플링한 후, pool4의 정보를 결합(skip connection)하여 16배 업샘플링하는 방식이 FCN-16s이다.
마지막으로, pool5의 Feature Map을 2배 업샘플링한 후 pool4의 정보를 결합, 다시 2배 업샘플링하여 pool3의 정보를 추가 결합한 뒤, 8배 업샘플링하여 최종 예측을 수행하는 것이 FCN-8s이다. 이처럼 여러 단계의 Skip Connection을 활용하면 더 세밀한 공간 정보를 보존할 수 있으며, FCN의 성능을 점진적으로 향상시킬 수 있다.
다만, 이러한 FCN은 큰 Object의 경우 전체가 아니라 일부분만 정답으로 예측하여 같은 Object여도 다른 Object로 예측하고, 작은 Object의 경우 아예 무시하는 문제와, Object의 디테일한 모습이 사라지는 문제가 존재했으며, 이는 고정된 Receptive Field와 단순한 Deconvolution 때문에 발생한다.
Deconvolution (Transpose Convolution, Transposed Convolution)
- Convolution 연산의 반대 개념으로, 작은 Feature Map을 큰 Feature Map으로 변환하는 것을 의미함.
- 커널을 이동하면서 출력 픽셀을 겹쳐서 합산하는 과정을 거쳐 upsampling을 수행함.
- 만약 겹치는 부분이 있다면 합산하여 표현
Instance Segmentation은 모든 객체들에 대한 정확한 Detection과 Segmentation이 이루어져야 하기에 어려움이 존재했으나, Mask R-CNN은 Faster R-CNN에 Small FCN으로 구성된 Mask branch를 추가한 단순하고 빠른 아키텍처로 Instance Segmentation에 대해 좋은 성능을 보였으며, 픽셀 단위의 Segmentation을 위해 RoI Pooling을 RoIAlign으로 대체해 공간 정보를 보존할 수 있도록 했다.
RoIAlign
기존의 ROI Pooling은 반올림으로 인해 위치 정보에 혼란이 올 수 있어 픽셀 단위로 segmentation을 진행해야 하는 마스크를 예측하는 task에서 부정적인 효과를 가져온다.
이런 문제를 Mask R-CNN에선 ROI Pooling을 RoIAlign으로 대체하여 해결한다. 이는 나눠진 각 그리드에 대해 sample point를 잡고, 포인트 하나를 기준으로 가까운 그리드 셀 4개에 대해 선형 보간법(Bilinear Interpolation)을 적용하여 Feature Map을 계산하는 것이다.
이 과정을 모든 sample point에 대해 진행하면, 하나의 영역에 4개의 값이 생겨나는데, 여기서 max 또는 average pooling을 사용해 output을 얻어낸다.
이렇게 반올림하지 않고도 RoI 처리를 고정된 사이즈의 Feature Map으로 생성하는 것을 RoIAlign이라고 한다.