Deep Learning study

Fully Convolutional Networks for Semantic Segmentation(FCN) 본문

AI/papers

Fully Convolutional Networks for Semantic Segmentation(FCN)

HwaniL.choi 2019. 3. 24. 11:36
반응형

이번에 정리해 볼 논문은 FCN이다. image segmentation에서 기초가되는 논문.? 이라고 생각돼서 한 번 정리를 해보려고 한다.


여기서 이야기하는 방법론은 단순하면서 간단하다. FCN에서는 기존의 classification에 사용되던 모델들을 이용하여 tranfer learning을 하게 된다.  하지만 기존의 classification의 모델들은 class 분류를 위해 네트워크의 마지막엔 항상 Fully connected layer(이하 Fc layer)가 삽입되게 되는데 이는 image segmentation에는 적합하지 않다. 왜냐하면 Fc layer를 사용하기 위해서는 고정된 크기의 input만을 받아야하며, 1차원적인 정보만을 가지고 있기 때문에 원하는 2차원적인 정보(위치정보 등,,)를 담을 수 없다.

그래서 이 논문에서 소개한 방법은 classification에서 사용되었던 모델의 마지막 Fc layer들을 convolution layer로 대체하자는 것이다. Fc layer는 1차원적인 정보만을 가지기 때문에 이미지의 외형이나, 위치정보등을 잃어버리기때문에 2차원적인 정보를 그대로 가지고 가자는 것 이다.

그럼이제 그 과정부터 segmentation하는 과정까지를 살펴보도록 하자 .


Fully convolutional networks




위의 그림에서 보듯이, 기존의 classification model 의 fc layer를 convolution layer로 바꾸었다. 논문에서는 이 과정을 convolutionalization이라고 부른다. 그렇다면 fc layer는 단순해 tabby cat 이라는 하나의 class로 분류될 score정보만을 출력해 주었다면, convolutionalization을 거친 아래의 모델은 conv layer를 사용했으므로 위치정보나 class에대한 정보 또한 잃어버리지 않고 있다.

tabby cat heatmap을 보면 tabby cat의 class에대한 정보뿐만아니라 그 위치정보까지 함께 가지고있는 것을 알 수 있다. 또한 일정한 크기의 input을 요하는 fc layer와는 다르게 conv layer는 filter의 크기만 맞다면 어떠한 input이 오더라도 수용할 수 있어서 input의 크기에 제약을 받지 않는다.

이제는 class의 score와 위치정보를 담고있는 heatmap을 이용하여 segmentation을 구현하게 됩니다. haetmap은 굵직한 대략적인 정보만을 가지고 있다. 그래서 픽셀단위의 정확한 segmentation을 위해서, 이 논문에서 deconvolution 방법을 소개한다.


Segmentation Architecture


먼저 deconvolution 이라는것은 upsampling 방법으로 convolution의 역 연산이다.  convolution은 feature를 추출해내면서 크기를 줄여나가는 역할 이였다면, deconvolution은 추출된 feature의 정보로부터 크기를 키워주는 역할을 한다.

논문에서는 upsample stride를 32, 16, 8을 각각 사용하였는데, upsample stride 가 32라면 feature map 의 정보 하나를 32개로 늘려놓는다는 것이다. 이런식으로 원래의 크기대로 복원시켜 segmentation된 output을 얻겠다는 것이다.


위의 그림을 보도록 하자.

먼저 마지막 pool5 layer 에서 stride 32로 upsample을 해서 prediction map을 만들어낸다. 하지만 pooling layer를 거치면 거칠수록 원래 형태의 정보보단 고차원적인 feature들의 정보가 있으므로 32배로 upsample한 결과는 디테일하지 못하다.

그래서 여기서 생각해 낸 것이 그 전의 layer의 정보도 같이 사용하자는 것 이다. 그 전의 layer는 현재의 layer가 가지는 정보보다 디테일한 정보를 가지고 있기때문에 복원하는데에 있어서 좀 더 효율적일 것이라는 이야기다. 논문에서 이 기법을 deep jet이라고 칭한다.

그러면 다음으로 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을 생성해 낸 것을 볼 수 있다.

이런식으로 논문에서의 표현으로 coarse한 layer와 fine한 layer의 정보를 skip connection으로 같이 활용하여 더 디테일한 결과를 만들어 냈다 !


여기서 사용한 deepjet이 resnet에서 skip connection이랑 비슷한 원리인거 같다.. (내생각..)


Reference

[1] Fully Convolutional Networks for Semantic Segmentation

반응형
Comments