Posts List

[컴퓨터비전] 12. Semantic Segmentation

Semantic Segmentation

Semantic Segmentation은 Object에 bounding box로 위치를 표현해주는 것을 넘어서 픽셀 단위로 labeling하는 문제이다.

Semantic Segmentation의 초기에는 hand crafted rule으로 segment proposal을 마스킹한 후 CNN, SVM으로 classification하는 원리를 가졌다. 다만 region proposal에 성능이 너무 의존적이기 때문에 사용자가 proposal rule을 잘 정의해줘야하는 한계점이 있었다. 

그래서 최근에는 1x1 convolution 연산을 통해 영역별로 classification하는 approach를 적용하고 있다. 이렇게 했을 때 이미지의 사이즈와 상관없이 이미지의 구역별로 classification 할 수 있는 장점이 있다. 다만 이 구역을 어떻게 다루느냐에 따라 segmentation resolution이 결정된다.

여튼 중요한 건 Semantic Segmentation 모델은 Pixel 단위의 Classification 문제를 푼다는 것이다.


최근 Fully connected network 구조의 레이어를 convolution연산으로 변경시킨 Fully Convolution Network(FCN)구조를 이용해 end-to-end segmentation 모델이 2015년 발표되었다.

다만, 앞서 잠깐 언급한 low resolution 이미지를 얻게 되기 때문에

이미지 복원시 최종 feature에서 바로 결과 이미지를 출력하는 것이 아니라, 위 그림과 같이 up-sampling된 feature와 기존 pooling layer의 결과를 병합(concat)한 뒤 최종이미지를 출력하는 방법이 제안됐었다. (2015)

물론 FCN이 CNN기반 모델보다 더 빠르고 정확도는 높았지 여전히 Ground Truth(GT)에 비해 만족스럽지 않은 결과를 보여줬다. (성능, 해상도 측면 모두)

그래서 이를 개선시키기 위해 2017년에 발표된 모형이 바로 DeepLab이다.

DeepLab은 Atrous convolution을 이용해 receptive field를 강화시키고, Fully-connected conditional random field(CRF)를 이용해 post-processing 테크닉에 적용시켰다. 특히, CRF를 적용했을 때 다소 낮은 resolution의 segmentation score map을 더욱 높은 해상도로 만들어 줄 수 있다.

atrous convolution은 위와 같이 다양한 크기의 특징을 모두 학습하기 위한 layer 구성을 위한 것이며,

atrous convolution layer로 부터 계산된 score map의 post processing을 위해 CRF를 적용하면 위와 같이 높은 품질의 segmentation 결과를 얻을 수 있다.

그리고 FCN을 발전시킨 Pyramid Scene Parsing Network (PSPnet)도 2017년에 고안되었다. 

※ 확실히 머신러닝, 딥러닝 분야는 지금 발전속도가 빨라서 최신 트랜드를 따라가는 것이 필수 생존 수단이라는 생각이 든다.

앞서 살펴본 network와는 다른 구조로 segmentation을 문제를 풀기위해 제안된 구조에는 Deconvolution network가 있다.

Deconvolution network는 feature를 생성해서(encoding) 다시 새로운 이미지로 복원(decoding)시키는 구조를 가지고 있어서, 먼저 제안한 모델이 너무 작은 object를 놓치거나 smoothing 되는 문제점을 해결해 줄 수 있다.

여기서 encoder는 labeled image를 지도 학습하는 일반적인 CNN구조인데, segmentation을 위해 공을 들여야하는 부분은 사실 decoder역할을 하는 deconvolution network이다. 즉, 제대로 이미지를 복원하는 것에 집중해야 한다는 것이다.

앞서 배운 CNN의 구조를 갖는 encoder는 convolution과 pooling을 반복하며 feature를 생성한다. 

특히 Pooling의 경우는 특정 1개 값(ex. max, average pool)을 선택하는 연산인데, 이 때 정보의 유실이 발생하기때문에 복원이 어렵다. 그래서 위 그림과 같이 switch variable에 pooling으로 선택된 값의 위치를 기억해 뒀다가 unppoling 시킬 때 반영시키면 좀 더 decoding 성능을 향상시킬 수 있다.

마찬가지로 Convolution도 기존의 정보를 이용해 복원을 할 수 있는데 사실 정확히 inverse convolution연산이 아니기 때문에 Deconvolution이라고 명명하기는 어렵지만, 최대한 encoding의 역방향으로 decoding시킬 수 있다. (Transposed convolution이 좀 더 올바른 표현이다. 참고 [머신러닝/딥러닝 : Semantic Segmentation]) 

앞서 소개한 것과 같은 deconvolution을 적용해 network를 설계하면 위와 같이 상당히 우수한 결과를 얻을 수 있다.


다음으로 볼 주제는 Instance segmentation이다.

위 그림을 보면 사람 2명이 각각 분리 된 것이 아니라 한 덩어리로 묶어져서 segmentation 된 결과를 볼 수 있다.

이 때 object 별로 segmentation 하기 위한 기술이 2016년에 처음으로 소개되었다.

Multi-task Network Cascades에서는 

   ① object의 bounding box(RoIs : Region of Interest)를 찾아주는 R-CNN과 같은 네트워크와 

   ② Feature와 RoI 를 같이 학습해서 object 별 mask를 찾고, 

   ③ masking 된 이미지를 classification 하는 네트워크 구조로 이루어져 있다.

다만 이 방법에는

   ① bounding box별로 RoI pooling 후 FC layer에 입력하다 보니 detect된 object가 많을 수록 파라미터수도 많고 메모리도 많이 먹는다. 그래서 mask의 크기를 크게 할 수 없었고,

   ② 그러다 보니 segmentation 결과가 둥글둥글하게 smoothing 될 수 밖에 없었다.


그래서 이미지 feature map의 전체가 아니라 patch 단위로 나눈뒤, segmentation, classification network로 각각 나눠서 연산되도록 구성한 방법이 고안되었다. (Multi-scale Patch Aggregation)








댓글 쓰기

0 댓글