Semantic segmentation 에서 중요한 것은 모델의 output 인 segmentation mask 가 얼마나 clean 한 object boundary 를 추출해내는가입니다. noisy object boundary 는 semantic segmentation 의 성능 검증을 방해하는 요소 중 하나입니다. 따라서 이것을 해결하기 위해 여러 시도들이 있었습니다.
Figure 1. Noisy segmentation mask
첫째는 [1] atrous convolution 을 사용하는 것입니다. Atrous convolution 은 vanila convolution 에서 복잡도를 증가하지 않고 receptive fields 를 늘리기 위해 고안된 방법입니다.
Figure 2. Atrous convolution
도표와 같이 atrous convolution 은 pixel 사이에 stride 를 두어 연산의 적용범위를 넓힙니다. 이렇게 연산하면 같은 수의 레이어에서도 넓은 receptive fields 를 달성할 수 있고, 레이어를 깊게 쌓으면 생기는 co-adaptation 문제 또한 일정부분 해결할 수 있습니다. 하지만 단순히 atrous convolution 을 semantic segmentation 에 적용하면 문제가 발생합니다.
Figure 3. Deeper atrous convolution
Atrous convolution 은 입력 features 의 사이즈를 그대로 유지합니다. 따라서 기존의 네트워크 구조를 유지하면서 output stride 를 8 배, 혹은 16 배로 증가하는데는 한계가 있습니다. 예시로 ResNet-101 모델의 경우, output stride 를 8 배로 설정시 26 개의 residual blocks 를 모두 atrous convolution 으로 바꾸어야 합니다. 이는 연산 속도의 감소를 초래합니다. 그러므로 연산은 줄이면서 동일한 효과를 가져오기 위해 atrous convolution 위에 spatial pyramid pooling 을 더해 multi-scale contexts 를 추출하는 접근을 채택합니다.
둘째로 encoder-decoder 구조입니다. Encoder-decoder 구조는 decoding path 에서 sharp object boundary 를 recover 해냅니다. [2] Dense CRF 와 같이 segmentation mask 의 후처리를 통해 성능을 높이는 접근도 있지만, 이는 encoder 에서 학습된 정보를 활용하지 못하고 학습에 sampling 절차가 포함되므로 실시간 서비스에 사용하기는 부적절한 방법입니다.
따라서 두 접근 모두의 장점을 통합하기 위해 논문에서는 Encoder-Decoder with Atrous Convolution 구조를 제안합니다.
Figure 3. Encoder-Decoder with Atrous Convolution
Figure 4. Proposed DeepLab V3+ architecture
DeepLab V3+ 는 encoder 로 DeepLab V3 를 사용합니다.
Encoder 의 결과로 출력된 dense features 에 spatial pyramid pooling 을 사용하여 multi-scale features 를 얻습니다. 이 multi-scale features 들을 channel-wise 로 concatenate 한 후, projection 연산을 통해 dimension 을 낮춥니다.
상기의 features 를 4 배 upsample 한 후, encoder 단의 low-level features 들과 fuse 합니다. 이는 edge 나 texture 같은 1 차원적인 features 들이 segmentation mask 의 sharpness 를 결정하는데 중요한 역할을 하기 때문입니다.
Figure 5. Atrous separable convolution
Encoder 의 atrous convolution 으로 atrous separable convolution 을 사용했습니다. 이는 연산의 경량화를 위한 것으로, 입력 채널이 $M$, 출력 채널이 $N$, kernel 의 size 가 $k$ 인 vanila convolution 의 경우 $O(MNk^2)$ 의 시간복잡도를 가집니다. 하지만 separable convolution 의 경우 $O(MN * 2k)$ 의 시간복잡도를 가집니다.