관리 메뉴

TEAM EDA

Rethinking Atrous Convolution for Semantic Image Segmentation (DeepLabv3) 본문

EDA Study/Image Segmentation

Rethinking Atrous Convolution for Semantic Image Segmentation (DeepLabv3)

김현우 2021. 9. 23. 17:32

Rethinking Atrous Convolution for Semantic Image Segmentation

DeepLabv3는 DeepLabv1, v2와 굉장히 유사합니다. 그래서, 기존의 논문을 안읽으신 분들은 DeepLabv1의 글을 먼저 읽고 DeepLabv2을 읽으시기 바랍니다. 해당 글에서는 DeepLabv2와의 차별점에 대해서 주로 살펴볼 예정입니다.

DeepLabv2 vs DeepLabv3

DeepLabv2와 v3의 차별화 지점은 두가지가 있습니다.

  • ASPP (Atrous Spatial Pyramid Pooling)의 Rate 비율이 달라집니다.
  • Global Average Pooling이 도입됩니다.
  • ASPP가 Sum이 아닌 Concat을 사용합니다.

DeepLabv2는 아래와 같은 모습을 보였습니다.

image-20210923105828581

하지만, DeepLabv3으로 넘어오면서는 ASPP에 다른 모습을 보입니다.

그림2

보이는 것과 같이 ResNet-101 부분은 차별점이 없습니다. 하지만, ASPP 부분에서 1x1 Conv와 GAP가 추가되고 Dilated Rate의 비율이 [6, 12, 18, 24]에서 [12, 24, 36] 으로 바뀐 것을 확인할 수 있습니다. (참고로, 논문에서는 이에 대한 비율은 [6, 12, 18] 3가지를 사용했지만, Torchvision 기준으로 [12, 24, 36]을 사용했습니다.) 또한, GAP가 새로 추가되었는데, PSPNet에서 Average Pooling의 활용에서 영향을 받은 것으로 보입니다. 또한, 기존에는 ASPP를 한 후 Sum을 했는데 이제는 Concat을 하는 것을 볼 수 있습니다. 이럴경우에, 메모리의 소모는 늘어나지만 성능적인 측면에서는 이를 전부 활용하기에 많이 늘어났을 것 같습니다.

Experiments

DeepLabv3에서는 다양한 실험을 많이 진행했습니다.

  • Conv Block 내의 Dilation 비율 (Ms-Grid)
  • ASPP의 Rate 비율
  • Output Stride에 대한 실험 (Input 크기 대비 Output의 크기)

MS-Grid

image-20210923133220006

논문에서는 Block4부터 7까지에 Dilation Rate 비율을 다르게해서 실험을 진행했습니다. 아래의 표와 같이 (1,1,1) 부터 (2,2,2)까지 다양한 실험을 진행했고, (1, 2, 1)이 가장 좋은 성능을 거두었습니다.

image-20210923133320190

단, Torchvision의 코드를 살펴봤을때는 아래의 그림에서 Conv3까지는 1, Conv4는 Dilation 2, Conv5는 2와 4가 적용되어있었습니다.

그림2

ASPP Rate

위의 Multi-Grid (1, 2, 4)에 대해서 ASPP의 실험은 다음 표와 같습니다. 맨 마지막 줄처럼 Multi-Grid (1, 2, 4)에 ASPP (6, 12, 8)과 image Pooling을 함께 적용한게 77.21로 가장 높습니다.

image-20210923133633329

기존과 다르게 ASPP의 Dilation Rate의 크기가 많이 줄어든 것을 볼 수 있습니다. 기존은 6, 12, 18, 24 인 반면에 현재는 6, 12, 18에 1x1 Convolution과 Image Pooling을 추가한 구조입니다. 24처럼 큰 Dilation이 사라지는데, 그 이유는 아래의 실험에 의해서입니다.

image-20210923135001329

위의 그림은 atrous rate에 따라서 유효한 weight가 몇개인지 비율을 계산한 것입니다. 보면 atrous가 30근방부터는 9개 모두가 유효한 경우는 0이되고, 1개만 유효한게 급증하는 것을 볼 수 있습니다. (weight 중 1개만 feature에 계산에 쓰이고 나머지는 모두 0으 값을 가진다는 것 같습니다.) 즉, 위의 실험에 따라서 24 이내의 값인 [6, 12, 18] 3가지 값을 선택했고 [6, 12, 18, 24] 보다도 76.58과 76.46으로 더 높은 것을 볼 수 있습니다.

Output Stride

마지막으로 위의 세팅에 Output Stride를 16과 8로 두가지의 실험을 진행합니다. Output Stride가 말그대로 8과 16이라는 의미인데, 입력 이미지의 크기를 몇까지 줄일지에 대한 의미입니다. (16배까지 감소, 8배까지 감소). 8배까지 감소했을때가 16배보다 mIOU 1.3이 오른 것을 확인할 수 있습니다. 논문에서는 8부터 256까지 2배수씩에 대한 실험은 진행했는데, 4에 대한 내용은 나와있지 않았습니다. 아마 메모리의 문제때매 해당 부분은 실험을 안한게 아닐까 생각합니다.

image-20210923133754279

Results

확실히 성능이 많이 좋아진 것을 볼 수 있습니다. 작은 Object부터 큰 Object까지 예측이 잘 되었고, 디테일한 부분도 기존에 비해 잘 된 것을 확인할 수 있습니다.

image-20210923134108951

Conclusion

DeepLabv3는 기존의 DeepLab 논문에서 가장 실험이 잘 되어보입니다. ASPP Rate의 선택을 실험과 유효한 웨이트의 개수를 통해서 파악하고, Multi-Grid와 Output Stride 모두 실험을 통해서 확인했습니다. 그리고, Global Average Pooling과 1x1 Conv 을 Concat하는 구조로 성능또한 많이 상승했습니다. 하지만, 아직 Object의 매우 디테일한 부분은 표기가 안되거나 뭉뚱그려서 예측되는 것을 볼 수 있습니다. 이러한 한계들을 DeepLabv3+에서 멋지게 해결하는데, 다음 글에서는 DeepLabv3+가 어떻게 구성되었는지 살펴보겠습니다.