-
[Semantic Segmentation] FCN 원리Deep-Learning/[Vision] 논문 리뷰 2020. 1. 29. 17:17
* 논문 : https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf
1. Semantic Segmentation의 목적 : https://kuklife.tistory.com/118?category=872136
2. Semantic Segmentation 알고리즘 - FCN
FCN은 Fully Convolution network의 약어로 2015년 발표되었으며, 논문의 제목은 Fully Convolution networks for Semantic Segmantation 이다.
(1) Fully convolutional networks
FCN이 주목한 부분은 분류에서 성능을 검증받은 기존의 네트워크(AlexNet, VGGNet, GoogLeNet) 등을 이용하는 것이다. 이들 대부분의 기존의 분류 모델들은 class 분류를 위해 네트워크의 마지막엔 항상 FCL(Fully Conneted Layer)이 삽입되게 되는데 이는 image segmentation에 적합하지 않다.
왜냐하면 FCL을 사용하기 위해서는 고정된 크기의 input만을 받아야한다. 또한, FCL을 거치고 나면 위치정보가 사라진다. Segmentation에 사용하려면 위치 정보를 알 수 있어야하는데 불가능하기 때문에 심각한 문제가 된다.
위의 단점을 극복하고자 분류에서 사용되었던 모델의 마지막 FCL들을 Convolution Layer로 대체하자는 것이다.
위 그림에서 보듯이, 기존의 분류 모델의 FCL을 Convolution Layer로 바꾸었다.(논문에서는 이 과정을 Convolutionalization이라 부른다.) 이런 과정을 거치게 된다면 FCL과 달리 위치 정보나 Class에 대한 정보(즉, 2차원 정보)를 잃어버리지 않을 수 있게 되는 것이다.
tabby cat heatmap을 보면 tabby cat의 Class에 대한 정보뿐만 아니라 그 위치 정보까지 함께 가지고 있는 것을 알 수 있다. 또한 일정한 크기의 input을 요하는 FCL와는 다르게 Convolution Layer는 Filter의 크기만 맞다면 어떠한 input이 오더라도 수용할 수 있어서 input의 크기에 제약을 받지 않는다.
조금더 자세히본다면 아래의 그림에서 네트워크는 입력된 이미지의 클래스를 tabby cat 이라고 예측해냈다.
이 분류용 CNN 알고리즘들은 이미지에 있는 물체가 어떤 Class에 속하는지 예측해낼 수 있지만, 그 물체가 어디에 존재하는지는 예측해낼 수 없다. 왜냐하면 FCL에 들어서면서 위치정보가 손실되었기 때문이다. 따라서, AlexNet, VGGNet 등과 같은 알고리즘들을 수정함 없이는 Semantic Segmentation에 그대로 사용하는 것이 불가능하다.
하지만, FCL의 층을 1*1 형태의 Convolution층들로 전환하면 위치정보가 손실되지 않고, 아래 사진과 같이 어떠한 입력 이미지의 크기도 허용될 수 있게 된다.
이제는 Class의 Score와 위치 정보를 담고 있는 heatmap을 이용하여 segmentation을 구현하게 된다.
그러나, 여기서 중요한 점은 이 Convolution층들을 거치고 나서 얻게된 마지막 heatmap의 개수는 훈련된 Class의 개수와 동일하다는 것이다.(즉, heatmap은 굵직한 대략적인 정보만을 가지고 있으며, 각 heatmap은 하나의 Class를 대표한다는 것이다.)
예를 들면, 만약 고양이 Class에 대한 heatmap이라면 고양이가 있는 위치의 픽셀값이 높고 강아지 Class에 대한 heatmap이라면 강아지 위치의 픽셀값들이 높다. 그렇기에 이 대략적인(coarse) heatmap들의 크기를 원래 이미지의 크기로 다시 복원해줄 필요가 있다.(이미지의 모든 필섹에 대해 Class를 예측하는 dense prediction하는 것이 semantic segmentation의 목적이기 떄문에)
그래서 픽셀단위의 정확한 segmentation을 위해 이 논문에서 Upsampling(deconvolution) 방법을 소개한다.
(2) Segmentation Architecture
먼저 deconvolution 이라는것은 upsampling 방법으로 convolution의 역연산이다. Convolution은 특징을 추출해내면서 크기를 줄여나가는 역할이었다면, deconvolution은 추출된 feature의 정보로부터 크기를 키워주는 역할을 한다.
논문에서는 Upsample stride를 32, 16, 8을 각각 사용하였는데, upsample stride가 32라면 feature map의 정보 하나를 32개로 늘려놓는다는 것이다. 즉, 아래의 사진과 같이 원래의 크기대로 복원시켜 segmentation된 output을 얻겠다는 것이다.
위의 그림을 보면,
먼저 마지막 pool5 layer에서 stride32로 upsample을 해서 prediction map을 만들어낸다. 하지만, pooling layer를 거치면 거칠수록 원래의 형태의 정보보단 고차원적인 feature들의 정보가 있으므로 32배로 upsample한 결과는 디테일하지 못하다.
그렇기에 이 논문에서 제안하는 것이 그 전의 layer의 정보도 같이 사용하자(skip combining)는 것이다. 그 전의 layer는 현재의 layer가 가지는 정보보다 디테일한 정보를 가지고 있기때문에 복원하는데에 있어서 좀 더 효율적일 것이라는 이야기다.
Skip combining은 이전의 결과 다음에 pool5 layer를 bilinear interpolation을 이용하여 stride 2로 upsample을 해서 initialize한 prediction map을 구한다. 그 후에 그 전의 layer 인 pool4 layer와 pixelwise summation을 실행하여 stride 16으로 upsample을 시행하여 prediction map을 구한다.
다음 계속해서 이전의 stride16으로 upsample하기 전의 summation의 값을 bilinear interpolation으로 stride 2로 upsample 해 prediction map 을 구한다. 그 후에 pool4의 전 layer 인 pool3 layer와 pixelwise summation을 한다. 그 다음 stride 8로 upsample을 해서 최종 prediction map을 생성해내게 된다.
위 그림은 각 stride 32, 16, 8 별로의 결과이다. 확실히 그 전의 정보들을 잘 활용하는 것이 더 디테일한 output을 생성해 낸 것을 볼 수 있다.
'Deep-Learning > [Vision] 논문 리뷰' 카테고리의 다른 글
[GAN] Pixel-Level Domain Transfer(DTGAN) 논문 리뷰 (0) 2020.08.06 [Inpainting] Context Encoder(CE) 원리 (0) 2020.05.26 [Semantic Segmentation] DeepLab v3+ 원리 (1) 2020.02.05 [Semantic Segmentation] SegNet 원리 (2) 2020.02.03 [Semantic Segmentation] U-Net 원리 (1) 2020.01.31