본문 바로가기
AIML 분야/Segmentation

[Semantic Segmentation 조사 1] FastFCN 리뷰

by 포숑은 맛있어 2021. 2. 16.
반응형

 

 

당분간 Semantic Segmentation 최근 논문들을 살펴보고 실험할 예정이다.

각각 논문 contribution이 다르니 이것저것 조합하여 최적의 성능을 내는 것이 목표이다.

 

 

 

 

FastFCN은 저번 서베이에서 언급된 논문인데, 최신 모델이면서도 예전 FCN과 DilatedFCN에 대한 문제지적 덕분에 semantic segmentation을 처음 공부하는중에 이해가 많이 되어 추가하였다.


FastFCN

arxiv.org/pdf/1903.11816.pdf

github.com/wuhuikai/FastFCN

 

일단 이 논문을 아주 짧게 요약하자면 이러하다.

 

"원래 semantic segmentation에서 dilation을 쓰는 이유가 연산 코스트 때문이었잖음?
그래서 여기선 JPU를 제안해서 upsampling을 대체함.
이를 통해 성능은 비슷한데 연산량을 줄일 수 있었음.

 

Related Works.

먼저, semantic segmentation 분야에 대해 알아야하는데, 이 분야에서는 FCN이 국룰이다.

 

피쳐 인코딩 후 upsampling을 통해 segmentation 수행.

 

그야말로 대성공을 거두며 후속 연구에 막대한 영향을 미치게 되는데, 그 두가지 방향이 이러하다.

 

1. Encoder-Decoder 구조

피쳐를 뽑은 후에 어떻게 디코딩을 해서 픽셀단위로 label을 매길지.
그림을 보면 디코더에서는 인코더의 여러 scale의 feature를 같이 입력으로 받아 output 만들어내는데에 도움을 받는 것 같다.

U-Net이 떠오른다.
2. Dilation의 중요성
그러다보니 upsampling이 중요한데, 촘촘하게 늘려나가자니 모델이 너무 커진다.

그래서 메모리와 연산 코스트를 아끼기 위해 나온 대안이 dilation. (atrous conv)
그러면 파라미터수를 늘리지 않아도 넓은 영역을 아우를 수 있기 때문이다.

딥랩에서의 ASPP와 연관지을 수 있을 것이다.

 

한편으로는, 다른 Upsampling 방법에 대해서도 생각해볼만 하다.

 

1. Joint Upsampling

guidance image를 활용하는 upsampling.

논문에서는 이와 관련된 두편의 논문을 인용하였는데, 그 논문들은 3 channel을 가지고 다루는 반면에 이 논문이 가지는 특이점은 바로 많은 채널의 feature map 상에서 joint upsampling을 다룬다는 점이다.
2. Data-dependent Upsampling

Semantic label space 상에서의 redundancy를 활용한 upsampling.

DUpsampling 연구를 인용하였는데, DUsampling은 label space에 dependent한 점을 이 논문에서 지적하였다.
참고로 DUsampling은 CVPR 2019 논문이었다.

 

Methods.

이 논문은 DilatedFCN을 기반으로 하고 있기 때문에, 이에 대한 설명이 먼저 나온다.

 

일반적인 ResNet 모델의 경우 5 stage CNNs > GAP > linear 연산 순으로 구성되어있는데, FCN 아키텍쳐에서는 GAP+linear를 Convolution 연산으로 바꾼다. 어쨌거나 5 stage CNN block을 거치기 때문에 필연적으로 resolution은 factor 2씩 감소하는 것을 위의 그림에서 볼 수 있었다. 그러면 2^5=32니까 32배나 resolution이 감소하였으니 detail한 표현이 어려워지게 된다.

이를 해결하기 위해, DeepLab에서는 마지막 두 레이어에서는 downsample이 안 되도록 하였다. DilatedFCN의 경우, 이 두 레이어에서 dilated convolution을 사용했다. 그러면 최종적으로 resolution이 factor 8만큼만 감소하기 때문에 연구 성과가 있었다.

정리하면,

Dilated FCN : 원래 FCN 구조에서 마지막 2레이어에서 downsampling을 제외하였다.
=> feature map 크기가 커지니 연산량이 많이 늘어난다.

 

이런 특성을 기억하고 본론으로 들어가면 이렇다.

 

1. 기존 FCN처럼 dilated convolution이 아닌 '일반 convolution'을 사용한다.

그러면 기존에 있었던 문제, 바로 detail이 떨어진다는 성능문제가 그대로이지 않은가?

이를 해결하기 위해서, encoder 뒷부분에 이 논문에서 제안하는 JPU를 사용한다.

 

2. JPU는 encoder의 conv3, 4, 5 이렇게 세가지의 feature map을 input으로 받는다.

이 부분이 논문의 핵심 contribution일것이다.

여기 연산이 추가된 것이 기존 FCN을 보완하여 dilatedFCN과 유사하게 하려는 것.

 

3. 그 후에 (다들 많이 쓰는) ASPP, PSP와 같은 multi-scale context module을 거치면 최종적으로 segmentation result를 얻을 수 있다.

일종의 디코더 파트.

 

 

그렇다면 JPU는 어떤 구조인가?

 

  • Input : Low resolution target image + high resolution guidance image
  • Output : High resolution target image.
    guidance image에서 detailed information, structure 등을 transfer해오기 때문에 가능한 것이다.

 

설명이 자세히 나오기는 하는데, 그건 따로 정리하기보단 논문을 직접 읽는 게 나을 것 같다.

DilatedFPN과 유사한 결과를 얻기 위해서 dilation, stride 등을 디테일하게 설명한다. 왜 아래왜 같은 연산을 했는지에 대한 설명이라고 보면 된다.

 

결론만 보면 아래와 같다.

 

 

1. regular convolution 각각 적용

아직까지는 원래 conv3, 4, 5 output과 같은 사이즈일 것이다.

 

2. Upsampling.

feature map 사이즈를 맞춰준다.

 

3. separable conv를 각기 다른 Dilation parameter로 적용하여 4개의 피쳐맵 만들기

dilation parameter가 다른 연산을 여러개 쓰면 아래와같이 빈 공간이 채워진다고 설명하고 있다.

 

4. concat 후 conv 한번 추가

코드에 왜 없지? 아무튼 그림에는 있다.

 


 

output을 보면 conv3과 같은 스케일, 다시말해 dilated FPN과 유사한 output을 얻게 된다.

인코더에서 conv4, 5에서 input 사이즈는 줄어들었기 때문에 연산량이 감소한 것을 알 수 있다.

 

 

구현은 이러하다.

인코더 이후 JPU가 적용되고, 디코더가 적용된다.

 

 

 

 

Experiments.

실험 디테일은 언제 필요할지 모르니 캡쳐해놨다.

 

 

먼저 experiment파트는 ablation study로 시작한다.

왜냐하면 DilatedFPN같은 방식과, dimension이 줄어들었는데 upsampling을 추가하는 방식으로 나뉘기 때문인데, 사실 JPU가 아니라 다른 방식의 upsampling을 쓰더라 해도 같은 효과를 얻을 수 있기 때문이다.

 

그래서 이 논문에서는 FPN (feature pyramid network), bilinear와 비교한다.

아래 표를 보면, 디코터파트에 어떤 것을 쓰든 JPU가 좋았다고 한다. FPN과 bilinear는 성능이 저하되었으나 JPU는 오히려 DilatedFPN보다 성능이 증가했음을 알 수 있다. ASPP의 결과도 궁금했는데 안나와서 아쉽지만, Encoding이라고 적혀있는 저 논문이 CVPR 2018이기 때문에 ASPP보단 더 최신 모델에 대해서 잘 적용된거라 큰 상관은 없을 것 같기도 하다.

표에서 OS는 output stride를 말한다. 원래 32만큼 줄어들고, dilatedFCN에서는 8배 줄어든다고 했던 그 얘기다.

 

그림을 봐도 같은 인코더 디코더를 사용하고 중간에 upsampling만 다른걸 썼는데 결과가 이렇게 다르다는 것을 알 수 있다. bilinear는 정말 bilinear를 쓴 것 처럼 생겼다. ㅋㅋ

 

이렇게 JPU가 최소한 DilatedFCN만큼의 성능, 혹은 그 이상을 얻을 수 있다는 것을 알았으니 이제 computation을 확인해야한다.

encoder backbone과 head(decoder)의 구조에 따라 차이는 있으나, FPS가 2~3배 가량 나오는 것을 알 수 있다. FPN과도 별 차이 없는데 성능은 더 좋았다는 결론을 낼 수 있다.

 

다른 모델들과의 비교도 있다.

 

 

Appendix를 보면, evaluation 값 뿐만 아니라 실제 inference 결과 이미지도 제시되어있다.

 

 

 

 

직접 실험하고 적용하게 된다면 데이터셋, 실험 hyperparameter, 평가서버 제출에 관한 것, evaluation metric에 대해서는 다시 자세히 봐야할 것 같다.

반응형

댓글