AIFFEL에서 강상권님의 자료를 공부한 내용입니다.
픽셀 수준에서 이미지의 각 부분이 어떤 의미를 갖는 영역인지 분리해 내는 방법입니다. segmentation은 이미지 분할 기술입니다.
이미지 내에서 영역을 분리하는 접근 방식은 크게 두 가지 방식이 있습니다.
시맨틱 세그멘테이션(semantic segmentation)
이미지 내에서 각 픽셀이 갖는 의미를 통해 영역을 분리해 냅니다. 하지만 각 픽셀이 어느 개체에 속하는지는 상관하지 않고 서로 구분된다고 생각되는 영역을 분리하기만 합니다.
위의 모델 구조는 semantic segmentation의 대표적인 모델인 U-Net의 구조입니다.
input으로 572x572 크기의 이미지가 들어가고 output으로 388x388의 크기의 두 가지 클래스를 가진 segmentation map이 나옵니다.
image classifcation이나 object detection보다 큰 output을 가지는 이유는 segmentation을 위해서 image의 각 pixel에 해당하는 영역의 클래스 정보가 필요하기 때문입니다.
인스턴스 세그멘테이션(instance segmentation)
각 개체에 따른 영역을 얻어낼 수 있습니다.
instance segmentation은 같은 클래스 내라도 각 객체(instance)들을 분리하여 segmentation을 수행합니다. 한 가지 방법으로 object detection 모델로 각 instance를 구분하고 이후에 각 instance별로 segmentation을 수행하는 것을 생각해볼 수 있습니다.
이러한 방식중 대표적인 것이 Mask R-CNN입니다. Faster-R-CNN의 아이디어인 RoI(Region-of-Interest) Pooling Layer(RoIPool) 개념을 개선하여 정확한 Segmentation에 유리하게 한 RoIAlign, 그리고 클래스별 마스크 분리라는 두가지 아이디어를 통해, 클래스별 Object Detection과 Semantic Segmentation 을 사실상 하나의 Task로 합쳐서 수행하는 모델입니다.
RoI Pooling Layer(RoIPool)
RoIPool Layer는 다양한 RoI 영역을 Pooling을 통해 동일한 크기의 Feature map으로 추출해 내는 layer입니다. 이후 이 고정 사이즈의 Feature map을 바탕으로 바운딩 박스와 object의 클래스를 inference 합니다.
semantic segmentation에서 RoI Pool을 사용하면 Quantization이 필요하게 됩니다. 위의 예시를 보면 16x16으로 분할된 상태입니다. 그런데 모든 RoI 영역의 가로/세로 pixel이 16의 배수인 것은 아닙니다. 그래서 위의 그림처럼 RoI 영역 밖이 포함되는 경우도 있고, 영역이 버려지는 경우도 생기게됩니다. 이런 상황은 semantic segmentation의 정보손실과 왜곡을 일으킬 수 있습니다.
Mask-R-CNN의 RoIAlign은 Quantization하지 않고도 RoI를 처리할 고정 사이즈의 Feature map을 생성할 수 있는 아이디어를 제시합니다. 아이디어의 핵심은, RoI 영역을 pooling layer의 크기에 맞추어 등분한 후, RoIPool을 했을 때의 quantization 영역 중 가까운 것들과의 bilinear interpolation 계산을 통해 생성해야 할 Feature Map을 계산하는 것 입니다.
Mask R-CNN은 Faster R-CNN에서 특성 추출방식을 RoIAlign 방식으로 개선을 하고 segmentation을 더한 방식입니다. Faster R-CNN과 비교한 구조도를 보면 U-Net처럼 feature map의 크기를 키워 mask를 생성해내는 부분을 통해 instance에 해당하는 영역을 inference합니다.
Mask R-CNN은 클래스에 따른 mask를 예측할 때, 여러 가지 태스크를 한 모델로 학습하여 물체 검출의 성능을 높입니다.
Bounding box regression을 하는 Bbox head와 mask를 예측하는 Mask head의 두 갈래로 나뉘는 것을 볼 수 있는데요. Mask map의 경우 semantic segmentation과 달리 상대적으로 작은 28x28의 특성 맵 크기를 갖습니다. RoIAlign을 통해 줄어든 특성에서 mask를 예측하기 때문에 사용하려는 목적에 따라서 정확한 mask를 얻으려는 경우에는 부적합할 수 있습니다.
AlexNet, VGG-16 등의 모델을 segmentation에 맞게 변형한 모델입니다. FCN에서는 세그멘테이션을 하기 위해서 network의 마지막 부분에 fully connected layer 대신 CNN을 붙여줍니다.
fully connected layer 대신 CNN을 붙여주는 이유
fully connected layer는 위치를 고려하지 않지만, CNN은 위치의 특성을 유지합니다. 이렇게 위치 정보를 유지하면서 클래스 단위의 heatmap을 얻어 segmentation을 하기 위해서 fully connected layer를 CNN으로 대체합니다.