Semantic Segmentation은 이미지의 각 픽셀이 어디에 속하는지 classification하는 것이다.
이는 주로 자율주행에 많이 사용된다.
Semantic Segmentation의 대표적인 알고리즘은 Fully Convolutional Network이다.
Fully Convolutional Networks에서는 기존의 분류 성능을 검증받은 네트워크(AlexNet, VGGNet 등)을 이용하려고 했다. 그런데, 이들을 그대로 이용하기에는 문제가 많았다.
1) Dense Layer로 인해 spatial information이 사라진다.
기존의 CNN은 마지막 layer즈음에서 데이터를 flatten하고 fully connected layer를 사용하게 된다. 이는 공간 정보를 없애기 때문에 semantic segmentation에는 적합하지 않다.
2) Fully connected layer를 사용한다면 고정된 크기의 input만을 받아야한다. 왜냐하면 fully connected layer는 (이전 레이어 데이터 x 다음 레이어 데이터) 만큼의 가중치 행렬을 필요로하기 때문이다. 그러니 이전 레이어에서 output된 데이터의 크기가 고정되어야하기 때문에 결국 input 데이터도 고정된 크기여야한다는 것이다. 그런데 이미지의 input size가 항상 고정되어야 한다면 너무 제약적이지 않는가!
따라서 FCL은 위 단점을 극복하고자 기존에 사용되던 fully connected layer를 모두 convolutional layer로 대체하자
는 것이다. 즉, Dense Layer를 없애고 Convolutionalize
하자는 것이다!
그렇게 해도 아래와 같이 output은 동일하게 만들 수 있다.
위와 같은 과정으로 convolutionalize하면 이제 모든 사이즈의 이미지 데이터를 input으로 받을 수 있게 되었다. 그런데 문제는 convolution을 통한 output dimension이 대부분 줄어든다는 것이다. 즉, subsampling으로 인해 resolution이 떨어진다는 것이다. 이대로 두면 안되지! 우리는 다시 원래대로 resolution을 늘려야 한다. 이를 deconvolution
이라고 한다.
위 이미지의 왼쪽 주황색 부분은 convolution을 의미하며, spatial dimension이 약 절반가량 줄어들었다. 반면 오른쪽 보라색 부분은 deconvolution을 의미하며, spatial dimension을 키워준다. 엄밀히 convolution의 역연산은 아니지만 역이라고 생각하면 이해가 편한 뭐 그런 연산이다.
구체적으로 Deconvolution은 다양한 방법이 있겠지만 아래와 같이 2x2 이미지에 padding을 많이 주어 결과적으로는 원하는 5x5 이미지를 만드는 방식이다.
이 외에도 우리가 다루어야할 내용이 많다. Skip Architecture
등이 그것이다. 이에 대한 내용은 나중에 심화된 cv 수업에서 배워보도록 하자.
앞서 Semantic Segmentation에서 per pixel별로 label을 찾는게 아니라, 이는 bounding box를 찾는 문제
이다. 이를 위한 알고리즘은 R-CNN, SPPNet, Fast R-CNN, YOLO 등이 있다. 이에 대해 이번 시간에 간략하게 high level로 설명하고자 한다.
computational cost가 매우 높다.
각 후보 영역(약 2천개의 이미지)에 대해 CNN을 개별적으로 통과시켜야 하기 때문이다. 즉, convolutional network를 2천번 돌려야하기 때문에 매우 느리다는 문제가 있다. CNN을 1번만 돌리자!
알고리즘
(1) Feature Extraction: 이미지를 CNN에 입력하여 이미지 전체의 특징맵을 한번만 계산한다.
(2) Spatial Pyramid Pooling: 후보 영역에 대해 SPP를 적용하여 고정된 크기의 특징 벡터 생성
(3) Classification and Regression: R-CNN과 유사하게 SVM을 사용하여 분류하고, bounding box를 적용한다.
한계
R-CNN보다 훨씬 속도가 빠르지만 여전히 각각의 후보영역에 대해 하나하나 개별적으로 SVM을 통한 분류를 수행해야 한다.
알고리즘
(1) Feature Extraction: 이미지를 CNN에 입력하여 이미지 전체의 특징 맵을 한 번만 계산한다.
(2) RoI Pooling: 후보 영역을 특징 맵에서 추출한 후, RoI Pooling(Region of Interest Pooling)을 적용하여 고정된 크기의 특징 벡터를 생성한다.
(3) Two outputs: Classification and Regression: 하나의 네트워크를 통해 분류와 경계 상자 회귀를 동시에 수행한다.
한계
여전히 후보 영역을 생성하는 단계가 필요하다.
Faster R-CNN = Region Proposal Network + Fast R-CNN
(2) Fast R-CNN Detector: RPN에서 생성된 후보 영역을 사용하여 클래스 분류와 경계 상자 회귀를 수행한다. (Fast R-CNN과 동일한 구조)