Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

ShuyaVision

[논문 리뷰] DeepLabV3+ (Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation) 본문

Vision AI

[논문 리뷰] DeepLabV3+ (Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation)

Sangbro 2023. 11. 19. 02:12

DeepLabV3+는 이전 DeepLab 들과 유사하다.

DeepLabV2(https://sangbro.tistory.com/11)

DeepLabV3(https://sangbro.tistory.com/24)

 

다만, 기존 DeepLabV2, V3에서는 ResNet을 활용했는데, V3+에서는 Xception을 사용한다. Xception은 Depthwise Separable Conv를 처음으로 소개, 및 사용하는 모델이고, DeepLabV3+에서는 Depthwise Separable Conv에 Atrous 를 결합하여 사용한다. Depthwise Separable Conv에 대한 자세한 내용은 MobileNet 포스팅을 참조하면 된다.

MobileNetV1, V2 (https://sangbro.tistory.com/21)

 

이번 포스팅에서는 DeepLabV3+의 전체적인 Architecture에 대해 작성하려고 한다. DeepLab 논문들은 output_stride나, channels의 개수, conv의 구성등을 여러가지로 실험해보는 부분이 많은데, 이 부분은 생략한다.

 

Xception

Xception에 대해서 간략하게 짚고 넘어가자면, Google에서 발표한 Inception 모델의 발전된 형태이다. Inception 모듈을 Depthwise Separable Convolution으로 수정해 이를 통해 cross-channels correlations와 spatial correlations를 독립적으로 계산하며, 더 적은 수의 parameters를 가지고 더 좋은 성능을 가져온다. 

 

 

Modified Xception

모든 Maxpooling 연산을 Depthwise Separable Convolution으로 대체하고, MobileNet에서 활용한바와 같이 BatchNorm + Relu를 추가한다. Middle flow에서는 8 times 구조를 16 times로 늘려 모델을 더 깊게 만든다. 또한 끝부분에 Depthwise Separable Convolution을 하나 더 추가하여 사용한다.

 

 

본 논문에서는 위 Figure의 Atrous depthwise conv를 Exit Flow에서의 Depthwise Separable Convolution을 대신해서 사용한다.

 

Encoder - Decoder

모델의 Architecture는 위 그림과 같다. DCNN으로 Modified Xception을 사용해서 512x512의 image를 입력으로 받아 16배를 줄여 32x32를 만든다. 이의 결과가 DeepLabV3과 똑같은 구성의 ASPP를 통과하여 output을 만든다(Upsampling 직전).

 

다음으로, Modifed Xception에서 Entry Flow 내 첫번째 블록의 결과, 128x128을 Decoder에 전달한다. 이는 input image에 비해 4배 줄어든 크기이며, 그림에서 왼쪽 상단부터 첫번째 +에서 빼낸다고 생각하면 된다.

 

이제, 32 x 32의 ASPP 결과를 Upsample by 4를 해준 다음 128x128과 함께 concat한 후에 3x3 Conv를 하고, 이를 다시 Upsample by 4를 해서 512x512를 만들어 준다.

 

정리하면, Encoder 부분은 DCNN, 즉 backbone을 제외하고는 DeepLabV3과 동일하다. DeepLabV3에서 정리한바와 같이 output_stride는 수정이 가능하며, 연산량의 상황에 따라 다르게 줄 수 있다. 위의 예시에서는 output_stride를 16으로 준 경우이며, output_stride를 8로 주면 성능은 향상되나, 연산량이 증가한다.

 

Results

DeepLabV3에서 ASPP의 결과물에 대해 BU(bi-linear upsampling)을 적용한 것에 비해, Decoder를 적용했을 때, 더 높은 성과를 보이는 것을 정리한 Figure이다. (b)를 보았을 때, 특히 Object의 Boundary 부분이 많이 살아나는 것을 확인할 수 있다.