-
FCN 논문 생각 정리paper(논문 정리) 2021. 10. 4. 17:16
Image task 정리
과거에는 이미지를 보고 분류를 하는 작업이 많은 연구가 이루어 졌다면 segmentation은 이미지 속 물체의 정확한 경계를 구분하는 것을 의미한다.
현재 이미지 속 객체를 처리하는 태스크는 크게 4개로 분류 할 수 있다.
1. image recognition : 이미지 인식으로 사진속 어떤 것이 있는지를 판단한다.
2. object detecion : 이미지 속 객체의 bounding box를 나타낸다. 한눈에 봐도 image recognition을 하고 그 다음에 위치까지 알아서 box를 그려야 하므로 조금더 어려운 작업이라고 볼 수 있다.
3. semantic segmentation : object별로 픽셀단위로 정확한 경계를 그리는 것을 의미한다. 말그대로 semantic수준의 단위로 구분을 하여 경계를 그려낸다.
4. instance segmentation : semantic보다 한 수준 위로 같은 semantic이어도 각각의 객체를 또 분리하여 표시한다.
현재 대략적으로 4개의 task로 분류 할 수 있다.
처음에는 단순 이미지를 보고 어떤 class에 들어가는지 분류만 했던 작업들이 점점 발달하여 전체 이미지 속 어떤 객체들이 있고 위치는 어디에 있으며 경계를 나누는 작업 까지 발달해 왔다.
FCN은 instance segmentaion을 위한 새로운 방법론을 제시했고 뒤에 많은 모델들에 영감을 준 연구로 평가 받고 있다.
FCN의 다른점
시작부터 이미 더 나아간 task 인 instance segmentation에 대하여 설명을 하고 있다.
The natural next step in the progression from coarse to fine inference is to make a prediction at every pixel.
모든 픽셀들을 예측 하고 싶은것이 instance segmentation이라고 볼 수 있다.
FCN을 이해하기 위해서는 이 전의 모델들을 간단하게 알아야 할 필요가 있다.
FCN이 나오기전 발표된 주요 모델들이다.
공통점은 모두 Conv filter을 거친뒤에 FC(fully connect) layer을 포함하고 있다는 것이다.
분류를 위해 모든 layer을 거친 feature를 출력단계전에 FC layer을 통과하여 사용했다.
하지만 FC layer의 문제는 위치정보가 사라진다는 것에 문제가 있다.
애초에 CV 관련 deeplearning에서 CNN이 사용된 이유도 FC layer은 위치정보를 갖지 못하기 때문이다.
그런고로 기존 모델들을 가지고 instance segmentation을 하기에는 큰 문제가 있다.
또한 입력 사이즈가 고정된다는 문제점이 있다. dense layer의 가중치가 고정되어있기 때문에
연쇄적으로 입력 이미지 크기도 고정된 값을 이용해서 사용해야한다.
이 논문에서는 이 두가지를 문제점을 해결하기 위해 FCN을 제안 한 것이다.
To our knowledge, this is the first work to train FCNs end-to-end (1) for pixelwise prediction and (2) from supervised pre-training. Fully convolutional versions of existing networks predict dense outputs from arbitrary-sized inputs.
기법 소개
FCN에서는 문제점을 해결하기 위해 3가지 방법을 제안한다.
FC layer로 바뀔때 생기는 공간정보를 잃어버리는 문제를 해결하기 위해 제안한 방법으로 3가지를 제안하고
문제점과 효율성에 대하여 말한다.
3.1 Adapting classifiers for dense prediction
- 분류 모델의 FC layer을 conv layer로 바꾸어서 사용을 한다. (크기는 그대로 두고)
- convolutionalization이라는 용어를 사용하여 FC layer을 모두 conv layer로 바꾼다.
- FC layer은 공간정보를 잃어버리는 문제점이 있지만 이미지의 전체정보를 가지고 있다고 볼 수 있다.
- FC layer가 가지는 이미지 전체정보를 포함하면서 FC layer의 문제점인 입력값이 고정되는 문제를 conv layer로 바꿔 쓰면서 입력 값이 고정되는 문제는 해결하면서 FC layer의 특성은 이어서 사용할 수 있게 된다. 이런 과정을 convolutionalization이라고 함.
- 또한 conv layer로 바꿀 경우 연산의 효율도 증가하는 장점도 있었다.
3.2 Shift-and-stitch is filter rarefaction
- OverFeat에서 제안한 방법으로 upsampling을 하는 기법을 제시했다.
- max pooling을 할때 padding을 한채로 시작 위치를 다르게 하여 각각의 정보를 담은 채로 polling을 하게된다.
- 4개의 위치에서 시작하여 pooling을 하고 각각의 결과를 다시 조합하면 원래 값을 알 수 있다.
- FCN에서는 stride를 조절하여 같은 효과를 내는 trick을 제안 했다.
- 하지만 결과와 효율이 좋지 않은 관계로 사용하지는 않는다.
3.3 Upsampling is backwards strided convolution
- dense prediction을 활용하기 위해서는 upsampling이 필요하다. 3.2에서 한 작업도 upsampling을 하는것이었다.
- 또 다른 upsampling으로 deconvolution을 얘기했다.
- deconvolution이라고 했지만 실제로 사용한것은 transposed convolution이라고 한다.
- deconvolution은 conv를 통해 줄어든 feature map을 upsampling하는 것으로 입력 사이즈와 똑같은 사이즈로 upsampling을 한다.
- interpolation으로 upsampling을 사용할 수 있지만 deconvolution을 통해 upsampling을 하는 것이 backpropagation이 가능하므로 학습에 있어서 더욱 좋다고 한다.
3.4 Patchwise training is loss sampling
- 전체 이미지를 보는것이 아닌 patch 단위로 학습을 하는 것을 의미한다.
- patch를 이용해서 학습을 하는 경우 전체 이미지를 보는것보다 효율적일 수 있다.
- 필요없는 정보는 학습하지 않을 수 있기 때문이다. 예를 들어 특정 객체의 feature가 필요하지만 전체이미지를 사용할 경우 배경과 필요없는 부분 까지 한꺼번에 들어가기 때문이다.
- 당연하게도 전체이미지에서 패치를 따로 추출하는 일은 또 다른 작업이 들어가는것이다. 이미지를 구한 다음 패치를 또 나눠야 하기 때문
- 그래서 패치를 랜덤하게 crop를 하면 그때는 전체이미지를 사용하는 것보다 효율적이지 않게 된다.
- overlap하게 패치를 분할하면 한 이미지에서 더 많은 경우가 나오기 때문
- 또한 패치를 사용하다 보면 공간정보를 알 수 없게 된다. segmenatation에서는 중요한 정보
- 전체 이미지를 이용하여 학습하는 것이 효율적이라고 볼 수 있다.
FCN 구조
위에서 설명한것을 바탕으로 최종적으로 어떻게 만들었는지 설명한다.
결론만 간단하게 말하면 dense prediction을 활용한 conv layer로 사용한 뒤 upsampling을 deconvolution을 통해 하고 skip connection을 사용한다.
실험을 위해 googlenet, vgg, alex net을 finetuning해서 사용한다.
실험 데이터셋은 PASCAL VOC 2011 segmentation challenge을 이용했고
각각의 분류 모델별 적용을 위해 조금씩 fine tuning을 했다.
평가 지표는 mean pixel intersection over union을 이용했으며 데이터셋중 일부 이상한 데이터들은 제외하고 학습했다.
mean IU를 통해 봤을때는 vgg가 가장 좋게 나왔다. 하지만 forward time을 봤을때는 수행시간이 다른 모델에 비해 4배정도 크게 나왔다.
또한 skip connection을 통한 실험도 진행 했다.
polling을 할때마다 feature map이 줄어들고 이것을 upsampling을 하는 방법별로 구분지어서 실험을 했다.
pooling을 5번 한 feature map를 바로 upsampling을 한것부터 차근차근 올렸다.
32 -> 16 -> 8 세가지로 분류 할 수 있다.
32배는 pooling을 5번 한것을 바로 32배 올려서 사용하고 16은 그 전단계 4번 polling과 5번 pooling을 2배 올린다음 더해서 16배를 올리고 8배는 polling3번과 polling 4,5번을 통해 나온 feature map를 다시 합쳐서 만든다.
8배를 upsampling한 모델이 가장 좋은 성능을 보였다. 당연하게도 한번에 32배를 올리는 것보다 점진적으로 올리는 방법이 훨씬 좋을 수 밖에 없을 것이다.
patch sampling에 대해서도 성능 비교를 했는데 샘플링 해서 학습을 진행하는 경우 샘플링 한 경우가 loss가 더 빨리 줄어들지만 시간 측면에서는 전체이미지를 사용하는 것이 더 좋은 성능을 보였다.
다른 연구들과도 성능 비요를 했을때 FCN이 뛰어난 성능을 보임을 확인 할 수 있었다.
※ 참고
https://jlog1016.tistory.com/84
'paper(논문 정리)' 카테고리의 다른 글
SR-GAN 정리 및 코드 (0) 2021.10.06 Efficient net 정리 (0) 2021.10.04 UNIT (Unsupervised Image to Image Translation Network) (0) 2021.04.27