Computer Vision/Semantic Segmentation

Depth-wise Separable Convolution (for DeepLab V3+ Xception)

진성01 2022. 8. 1. 13:17

DeepLab V3+ Xception은 Xception model을 BackBone으로 이용한 DeepLab V3+ 아키텍처이다. 이번 글에서는 DeepLab V3+ Xception을 이해하기 위해 필요한 개념인 Depth-wise Separable convolution에 대해 소개한다.

 

Depth-wise Convolution

 

기본적인 convolution 연산은 R, G, B 3개의 채널에 대하여 모두 같은 kernel을 이용하여 각각의 feature map을 뽑아낸 후 이를 합연산하여 하나의 feature map을 생성한다. 이렇게 convolution 할 경우 모든 채널에 같은 filter를 적용해야 하므로 해당 채널에 특이적인 filter를 만들 수 없다.

 

반면 Depth-wise Convolution은 채널별로 다른 filter를 사용하여 feature map을 생성한다. 3개의 channel이 input으로 들어올 경우 feature map의 개수도 3개가 된다. 기존 convolution은 3개의 feature map을 합연산하여 최종적으로 1개의 feature map이 형성되기 때문에 Depth-wise와 출력 feature map channel 수가 차이가 있다. Depth-wise Convolution을 사용할 경우 channel별로 다른 filter를 사용하기 때문에 특정 channel에 특이적인 filter를 생성할 수 있다는 장점을 가진다.

 

Depth-wise Separable Convolution

 

 

Depth-wise Convolution을 이용하여 여러개의 Feature map을 생성하고 싶은 경우 Depth-wise Separable Convolution을 

이용하면 연산량, parameter 수의 획기적인 감소를 이룰 수 있다.

 

Depth-wise Separable Convolution의 원리는 다음과 같다. 우선 Depth-wise Convolution을 이용하여 3 channels의 feature map을 생성한다. 이후 이 feature map을 이용하여 최종 feature map을 생성해 내는데 이 때 1 * 1 size의 kernel을 이용한다. 이러한 방식으로 feature map을 생성할 경우 연산량을 대폭 줄일 수 있다.

 

위의 그림의 Standard Convolution을 보면 M개의 feature map을 생성하기 위해 필요한 parameter의 수는 kernel size k * k와 input channel 수 C, feature map의 개수 M을 모두 곱한 값이 된다. Depth-wise Separable Convolution의 경우 우선 3channels feature map을 만들어내는 데 필요한 parameter의 개수는 kernel size k * k에 in channels C를 곱해 C * k * k 이고, 두 번째 단계로 원하는 feature map의 개수만큼 1 * 1 convolution을 진행하는 부분에서는 kernel size 1 * 1에 in channels C, output feature map의 channel 수인 M을 곱해 총 C * M개의 parameter가 사용된다. 

Standard Convolution: C(k * k * M)
Depth-wise Separable Convolution: C(k * k + M)

즉 Depth-wise Separable Convolution에서는 output channel의 수 M이 곱이 아닌 합연산으로 바뀌게 되고 대부분의 CNN모델에서 output channel의 개수가 몇 백에서 몇 천까지 늘어나기 때문에 parameter 수는 대폭 감소하게 된다. 

 

이렇게 연산량을 대폭 줄일 수 있는 원리는 무엇일까, Depth-wise Separable Convolution에서는 연산량이 높은 곳에서는 최대한 Feature map을 적게 생성하고, 연산량이 낮은 곳에서 Feature map을 원하는 만큼 생성한다. 이는 기존의 convolution이 spatial과 channel dimension을 1-step으로 진행하던 것을 2-step으로 나누는 것으로 실현된다. 첫 번째 step에서 Depth-wise Convolution을 이용하여 channel에 특이적인 feature map을 channel 수 만큼만 생성해내고, 두 번째 step에서 이 feature map에 연산량이 적은 1 * 1 kernel을 사용하여 원하는 만큼 feature map을 생성하기 때문에 전체적으로 적은 연산량을 가지게 된다. 

 

이렇게 연산량이 적어지면 성능이 떨어질 수 있다고 생각할 수 있지만 실제 실험 결과 두 방법 모두 성능은 비슷했으며 연산량 부분에 있어서만 큰 차이를 보였다고 한다.