이미지에서 픽셀단위로 관심 객체를 추출하는 방법.
이미지에서 개체가 있는 위치, 해당 개체의 모양, 어떤 픽셀이 어떤 객체에 속하는지 등을 알고 싶다고 가정할 때, 이미지를 분할해 이미지의 각 픽셀에 레이블을 부여하는 것이다.
이러한 세그멘테이션은 여러 가지 종류로 나뉜다.
실제로 인식할 수 있는 물리적 의미 단위로 인식하는 세그멘테이션을 시멘틱 세그멘테이션(sementic segmentation)이라고 한다.
즉, 이미지에서 픽셀을 사람, 자동차, 비행기 등의 물리적 단위로 분류하는 방법이다.
세부적으로는 모든 픽셀의 레이블을 예측하는 Dense Prediction이라고 부른다.
시멘틱 세그멘테이션은 사진에서 '사람'이라는 객체 자체를 추출한다. 결국 다른 사람이더라도 상관없이 같은 라벨로 표현된다.
인스턴스 세그멘테이션은 사람을 개개인별로 다른 라벨을 가지게 한다.
Semantic Segmentation을 해결하기 위한 방법 역시 여러가지가 있다.
그 중 DeepLab이라 불리는 알고리즘에 대해 알아보자.
DeepLab은 Semantic Segmentation을 해결하기 위한 방법으로 1, 2, 3, 3+ 네가지 버전이 존재한다.
DeepLab은 atrous convolution을 활용해 Semantic Segmentation을 해결한다.
DeepLab에서 사용되는 개념들은 다음과 같다.
Atrous Convolution은 기존 Convolution과 다르게 필터 내부에 빈 공간을 둔 채로 작동한다.
위 사진에서 볼 수 있듯이, r(rate)라는 파라미터를 통해 얼마나 빈 공간을 둘지 설정하고 빈 공간을 제외하고 기존 Convolution과 같이 학습을 진행한다.
r = 1일 경우에는 기존 Convolution과 동일하게 학습을 진행한다.
Semantic Segmentation의 성능을 높이기 위한 방법 중 하나로, 이를 사용한 SPPNet은 R-CNN의 단점을 극복하고자 나온 모델이다.
SPP는 Conv Layer를 거친 Feature Map을 인풋으로 받아 위와같이 4x4, 2x2, 1x1로 미리 정해진 영역으로 나눈다.
각각을 하나의 피라미드라고 부른다. 즉, 위 사진에서는 3개의 피라미드를 설정한 것이다.
위 피라미드에서 네모칸 한 칸을 bin이라고 부른다.
각 bin에 알맞은 크기의 Window(일종의 Filter와 같은 역할)와 Stride를 통해 Feature Map을 순회하며 MaxPooling을 수행해 그 값을 이어붙인다.
ex) 예를 들어 위에서 제시한 예시와 같이 64x64x256 Feature Map을 4x4, 2x2, 1x1 피라미드로 Pooling 했을 때, 최종 Output은 bin의 총 개수인 21과 Feature Map의 차원 수인 256개의 곱이된다.
+) Selective Search(Region Proposal) 등 R-CNN과도 관련된 개념은 추후 정리 예정