Computing

Semantic Segmentation (1) : 문제 정의 및 FCN (Fully Convolutional Networks for Semantic Segmentation) 본문

Deep Learning/개념

Semantic Segmentation (1) : 문제 정의 및 FCN (Fully Convolutional Networks for Semantic Segmentation)

jhson989 2022. 5. 24. 21:34

Semantic Segmentation 문제 정의

Semantic의 사전적 의미는 "의미론의"이다. 프로그래밍 언어 및 컴파일러를 배우다보면 syntactic(구문론의)과 더불어 자주 나오는 개념인데, 말 그대로 어떤 것의 "의미"를 의미한다. "나는 쇠를 먹었다"라는 문장은 문법적으로는 틀리지 않았지만 (syntactically correct), 의미는 전혀 말이 되지 않는 문장이다. (사람이 어떻게 쇠를 먹겠는가?) 이처럼 보여지는 형식에서 벗어난 어떤 것의 "의미"를 가리키는 단어가 semantics, semantic이다. 이때 "의미"라는 것은 사람이 정하는 기준에 따라 정해지는 것이다.

 

따라서 semantic segmentation은 의미에 따라서 영상을 분할하는 문제이다. Fig 1.은 semantic segmentation 문제를 나타내는 예제이다.

 

Fig 1. Semantic segmentation 문제 예제 [1]

 

Fig 1. 예제를 보면, 이미지에서 어떤 영역이 하늘을 나타내고, 나무를 나타내고, 잔디밭을 나타내는 지를 찾고자(분할하고자) 한다. 이처럼 이미지 내에서 각 영역의 의미(의미는 사람이 정하는 요소이다.)를 추론하는 문제이다.

 

이 문제를 좀 더 명확히 정의하자면 pixel-wise classification 문제라고 할 수 있다. 이미지는 픽셀의 2차원 배열로서, 이미지 상의 하나의 객체는 픽셀들의 집합으로 표현된다. 따라서 semantic segmentation 문제는 이미지를 구성하는 각 픽셀이 무엇을 의미하는 지를 찾는 pixel-wise classification 문제이다.

 

Semantic segmentation 문제를 풀기 위한 딥러닝 네트워크는 두 가지 목표를 가지고 학습이 된다. 어떤 물체(=classification)가 어디에 있는 지(=localization), 즉 classification + localization를 동시에 학습하여 추론한다. 이러한 classification + localization 능력을 동시에 필요로 하는 문제는 semantic segmentation 뿐만 아니라, Fig 2.와 같이 object detection, instance segmentation 문제도 있다.

 

Fig 2. Classification + localization 문제 분류 [1]

 

세 가지 문제는 비슷해 보이지만 네트워크의 구조(아웃풋의 형태), 준비할 데이터셋 등 서로가 매우 다르다. 그렇기에 내가 풀고자 하는 문제가 무엇인지를 구체적으로 구별하여 사용해야 한다.

 

 

 

Semantic Segmentation이 어려운 이유

Semantic segmentation 문제를 풀기 위한 딥러닝 네트워크는 classification과 localization을 모두 할 수 있도록 학습되어야 한다. 

 

일반적인 image classification 문제(e.x. MNIST, CIFAR10, ImageNet etc.)를 풀기 위해서는 주로 convolution layer로 구성된 CNN을 사용한다. Convolution layer는 이미지 상의 local feature (=pattern)을 찾는데 탁월한 성능을 가진다. convolution layer 필터의 한 채널은 하나의 패턴을 익히도록 학습되며, 이 패턴을 가지고 sliding window 방식으로 이미지 곳곳을 훑어서 이 패턴이 이미지 상의 어디에 얼만큼 나타나는 지를 계산한다. 이렇게 구한 feature map은 pooling 및 FC layer, stride-convolution 등을 통해 압축(=추상화)되어, 최종적으로 이미지가 무엇을 나타내는 지를 알려주는 global feature를 추론하게 된다.

 

정리하자면 기존의 image classification 문제는 이미지 상의 local feature를 뽑고, 그것들을 추상화하는 과정을 반복하면서 최종적으로 이미지가 나타내는 의미를 찾는다. 이러한 추상화 과정에서 각 픽셀의 정보는 모두 사라지고, 전체 이미지(=픽셀의 집합)로서의 의미만이 남게된다.

 

그러나 Semantic segmentation은 이러한 classification 문제를 푸는 동시에 localization 문제도 풀어야 한다. 즉 global feature를 추출하기 위한 추상화 과정에서 각 픽셀 하나하나의 정보를 보존하고 있어야 한다. (그래야 그 픽셀이 어떤 것을 의미하는 지 알지) 이를 위해 semantic segmentation 분야에서는 각 픽셀 정보를 보존할 다양한 방식이 제안되고 있다.

 

 

 

Fully Convolutional Network (FCN) : FC Layer와 Convolution Layer의 의미

논문 [2]는 딥러닝 네트워크를 이용한 Semanti segmentation 분야에서 가장 기초가 되는 연구이다. 

 

Fig 3. FCN 네트워크 구조도 [2]

 

Fig 3.은 FCN 네트워크의 구조를 나타낸 그림이다. FCN은 이름 그대로 convolutional layer만으로 구성되었기에 붙여진 이름이다. 기존의 image classification 문제에서 사용되던 딥러닝 네트워크의 마지막 FC layer를 없애고 그것을 이미지 재생성을 위한 convolution layer로 대체하였다. 이러한 방식이 FCN이 제안하는 localization을 위한 픽셀 정보 보존 방법이다.

 

Fig 4. Image classification 문제와의 차이점 [2]

 

Fig 4.은 이러한 FC layer의 제거가 어떻게 픽셀 정보를 보존하도록 하는지를 원리를 잘 보여준다. Fig 4.의 윗쪽 그림은 기존의 image classification 문제를 위한 네트워크 구조를 나타낸 것으로, 최종 결과물은 정답 category별 확률이다. 이때 FC layer는 이미지의 모든 위치 정보를 제거하고 오로지 global feature 정보만을 도출한다. 

 

이에 반해, FC layer를 convolution layer로 바꾼 밑쪽 그림에서는 위치 정보가 어느정도(저화질이지만) 남아있는 것을 알 수 있다. 고양이가 있어야 할 영역의 heatmap의 값이 높은 것을 알 수 있다. 이는 convolution layer가 spatially 이웃한 픽셀들끼리의 관계만 도출하기에, 그 결과에도 여전히 spatial 정보가 남아있기 때문이다.

 

 

 

Fully Convolutional Network (FCN) : Encoder - Decoder 구조

Fig 3. FCN의 구조도를 보면 FCN은 encoder - decoder 구조로 되어있는 것을 알 수 있다. FCN은 2 pass로 진행되며 첫 번째 pass, down-sampling pass에서는 이미지의 global 의미를 분석(=classification)한다. 두 번째 pass, up-sampling pass에서는 분석된 global 의미를 바탕으로 각 픽셀의 local 의미를 분석(=localization)한다. 

 

첫 번재 down-sampling 과정에서 이미지는 global context 분석을 위하여 32배로 압축된다. 이 경우 Fig 4.에서 보듯이 위치 정보(고양이가 이쯤에는 있다라는 정보)는 있지만 매우 저화질이기에 이를 32배로 up-sampling하는 두 번째 pass가 필요하다.

 

Fig 3. 은 32배 압축된 feature map을 32-stride를 가진 transposed convolution layer(실제 구현은 2-stride transposed convolution 연산을 5번하는 것으로 구현됨)를 통해 up-sampling하는 예제이다. 이경우 하나의 feature가 32*32개의 pixel을 생성해내야 하기에 화질 향상에는 한계가 있다. 이를 극복하기 위해 Fig 5.와 같은 구조가 제안되었다.

 

Fig 5. FCN의 Encoder - Decoder 구조와 Skip connection [2]

 

Fig 5.는 최종적으로 32배 up-sampling을 2배, 2배, 8배(실제 구현은 8배(=2배*2배*2배)도 3번으로 나눠서 구현) up-sampling으로 3번에 걸쳐서 나눠서 하도록 되도록 구현된 네트워크이다. (32 = 2*2*8) 단순히 3번 나눈 것이 아니라, down-sampling 과정에서 압축되기 전의 feature map을 건네 받도록 구현되어 downsampling 과정에서 손실될 뻔한 위치 정보를 up-sampling 과정에 곧바로 제공해준다. 이를 skip connection이라고 한다.

 

 

 

Reference

[1] http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture11.pdf

[2]  J. Long, E. Shelhamer and T. Darrell, "Fully convolutional networks for semantic segmentation," 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2015, pp. 3431-3440, doi: 10.1109/CVPR.2015.7298965.