ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Semantic Segmentation] DeepLab v3+ 원리
    Deep-Learning/[Vision] 논문 리뷰 2020. 2. 5. 17:24
    논문1. DeepLab V1 : https://arxiv.org/pdf/1412.7062.pdf
    논문2. DeepLab V2 : https://arxiv.org/pdf/1606.00915.pdf
    논문3. DeepLab V3 : https://arxiv.org/pdf/1706.05587.pdf
    논문4. DeepLab V3+ : https://arxiv.org/pdf/1802.02611.pdf

     

    1. Semantic Segmentation의 목적 : https://kuklife.tistory.com/118?category=872136

     

    2. Semantic Segmentation 알고리즘 - DeepLab V3+

     DeepLab V3+ 논문은 2018년 8월 경, 구글에서 작성된 논문이다.

     

     Semantic Segmentation을 해결하기 위한 방법론은 여러가지가 존재한다. 그 중 DeepLab 시리즈는 여러 segmentation model 중 성능이 상위권에 많이 포진되어 있는 model들이다. 그 중에서도 가장 성능이 높으며 DeepLab 시리즈 중 가장 최근에 나온 DeepLab V3+에 대해 살펴보자.

     

     전체적으로 DeepLab은 semantic segmentaion을 잘 해결하기 위한 방법으로 atrous convolution을 적극적으로 활용할 것을 제안하고 있다. 아래의 시리즈 별로 어떻게 변화해갔나 간단히 살펴보자.

     

     - DeepLab V1 : Atrous convolution을 처음 적용

     - DeepLab V2 : multi-scale context를 적용하기 위한 Atrous Spatial Pyramid Pooling (ASPP) 기법을 제안

     - DeepLab V3 : 기존 ResNet 구조에 Atrous Convolution을 활용해 좀 더 Dense한 feature map을 얻는 방법을 제안

     - DeepLab V3+ : Depthwise Separable Convolution과 Atrous Convolution을 결합한 Atrous Separable Convolution의 활용을 제안

     

     원논문을 읽어보면 Related Works로 V1에서 제시된 atrous convolution, V2에서 제시된 ASPP, 마지막으로 Depthwise Separable Convolution에 대해 언급하니 이 글에서도 언급 후 본문으로 들어가도록 하겠다.

     

    (1) Relation Works

    1) Atrous Convolution

    Atrous Convolution

     

     Atrous에서 trous는 구멍(hole)을 의미함으로써, Atrous Convolution은 기존 Convolution과 다르게 필터 내부에 빈 공간을 둔 채 작동하게 된다.

     

     위 그림에서 얼마나 빈 공간을 둘지 결정하는 파라미터값 r(rate의 약자)이 1인 경우, 기존 Convolution과 동일하고 r이 커질수록 빈 공간이 넓어지게 되는 것이다.

     

     이러한 Atrous Convolution을 활용함으로써 얻을 수 있는 이점은 기존 convolution과 동일한 양의 파라미터계산량을 유지하면서도, field of view(한 픽셀이 볼 수 있는 영역)를 크게 가져갈 수 있게 된다는 것이다.

     

     보통 Semantic Segmentation에서 높은 성능을 내기 위해서는 CNN의 마지막에 존재하는 한 픽셀이 입력값에서 어느 크기의 영역에서 커버할 수 있는지를 결정하는 receptive field 크기가 중요하게 작용한다.

     즉, 여러 convolution과 pooling 과정에서 디테일한 정보가 줄어들고 특성이 점점 추상화되는 것을 어느정도 방지할 수 있기 때문에 DeepLab series에서는 이를 적극적으로 활용하려 노력한다.

     

    2) Atrous Spatial Pyramid Pooling(ASPP)

    Atrous Spatial Pyramid Pooling(ASPP)

     

     Semantic segmentaion의 성능을 높이기 위한 방법 중 하나로, spatial pyramid pooling 기법이 자주 활용되고 있는 추세이다.

     

     DeepLab V2에서 feature map으로부터 rate가 다른 Atrous Convolution을 병렬로 적용한 뒤, 이를 다시 합쳐주는 ASPP기법을 활용할 것을 제안했었다. 최근 발표된 PSPNet에서도 Atrous Convolution을 활용하진 않았지만 이와 비슷한 Pyramid Pooling 기법을 활용하였다.

     

     이러한 이러한 방법들은 multi-scale context를 모델 구조로 구현하여 보다 정확한 Semantic Segmentation을 수행할 수 있도록 도우며, DeepLab V3부터는 ASPP를 기본 모듈로 계속 사용하고 있다.

     

    3) Depthwise separable convolution

    일반적으로 사용되는 Convolution 모습

     

     위 그림은 일반적으로 사용되는 Convolution을 나타낸 사진이다. 입력 이미지가 8*8*3(H*W*C)이고, Convolution 필터 크기가 3*3(F*F)이라고 할 때, 필터 한개가 가지는 파라미터 개수는 3*3*3(F*F*C)=27이 된다. 만약 필터가 4개라면, 해당 Convolution의 총 파라미터 수는 3*3*3*4(F*F*C*N)만큼 지니게 된다.

     

    Depthwise Convolution 모습

     

     Convolution 연산에서 Channel 축을 필터가 한 번에 연산하는 대신에 위 그림과 같이 입력 영상의 Channel 축을 모두 분리시킨 뒤, Channel 축 길이를 항상 1로 가지는 여러 개의 Convolution 필터로 대체시킨 연산을 Depthwise Convolution이라고 한다.

     

    Depthwise Separable Convolution 모습

     

     위의 Depthwise Convolution으로 나온 결과에 대해 1*1*C 크기의 Convolution 필터를 적용한 것을 Depthwise Separable Convolution이라 한다.

     이처럼 복잡한 연산을 수행하는 이유는 기존 Convolution과 유사한 성능을 보이면서도 사용하는 파라미터 수와 연산량을 획기적으로 줄일 수 있기 때문이다.

     

     예를 들어 입력값이 8*8*3이고 16개의 3*3 Convolution 필터를 적용할 때 사용되는 파라미터 개수는

     - Convolution : 3*3*3*16 = 432

     - Depth Separable Convolution : 3*3*3 + 3*16 = 27+48 = 75

    임을 확인 할 수 있다.

     

     Depthwise Separable Convolution은 기존 Convolution 필터가 Sepatial Dimension과 Channel Dimension을 동시에 처리하던 것을 따로 분리시켜 각각 처리한다고 볼 수 있다. 이 과정에서, 여러 개의 필터가 Spatial Dimension 처리에 필요한 파라미터를 하나로 공유함으로써 파라미터의 수를 더 줄일 수 있게 되는 것이다.

     

     두 축을 분리시켜 연산을 수행하더라도 최종 결과값은 결국 두 가지 축 모두를 처리한 결과값을 얻을 수 있으므로, 기존 convolution filter가 수행하던 역할을 충분히 대체할 수 있게 된다.

     

    4) Encoder-Decoder

     마지막으로 DeepLab V3+는 위에서 설명한 모듈을 Encoder-Decoder로 구조화시켰다.

     

    U-net구조(설명 : https://kuklife.tistory.com/119?category=872135)

     

     U-Net과 유사하게 intermediate connection을 가지는 encoder-decoder 구조를 적용하여 보다 정교한 object boundary를 예측 할 수 있게 하였다.

     

    (2) Method

     DeepLab V3+에서는 Encoder로 DeepLab V3를 사용하고, Decoder로 Bilinear Upsampling 대신 U-Net과 유사하게 Concat해주는 방법을 사용한다.

     

     DeepLab V3와 DeepLab V3+의 구조를 그림으로 먼저 간단히 살펴보면 다음과 같다.

     

    DeepLab V3 구조

     DeepLab V3는 기본적으로 ResNet을 Backbone으로 사용하였으며 구조는 다음과 같다.(추후 ResNet과 함께 VGGNet에 대한 게시글 업로드 예정)

     - Encoder : ResNet with Atrous Convolution

     - ASPP

     - Decoder : Bilinear Upsampling

     

    DeepLab V3+ 구조

     

     DeepLab V3+의 구조는 다음과 같다.

     - Encoder : ResNet with Atrous Convolution를 Xception으로 변경

     - ASP을 ASSPP (Atrous Separable Spatial Pyramid Pooling)로 변경

     - Decoder : Bilinear Upsampling을 Simplified U-Net style decoder으로 변경

     

     위의 설명을 조금 더 세부적으로 보면 다음과 같다.

     

     

    1) Encoder-Decoder with Atrous Convolution

     - Encoder

     DCNN에서 Atrous Convolution을 통해 임의의 resolution으로 feature map을 뽑아낼 수 있도록 한다.

     

     여기서 Output Stride의 개념이 쓰이는데 "input image의 resolution과 최종 output의 비"로 생각하면 된다. 즉, 최종 feature map이 input image에 비해 32배 줄어들었다면 output stride는 32가 되는 것이다.

     Semantic Segmentation에서는 더욱 디테일한 정보를 얻어내기 위해 마지막 부분의 Block을 1개 혹은 2개를 삭제 후 Atrous Convolution해줌으로써 Output Stride를 16 혹은 8로 줄인다.

     

     그리고 아래 사진과 같이 다양한 크기의 물체 정보를 잡아내기 위해 다양한 rate의 Atrous Convolution을 사용하는 ASPP(Atrous Spatial Pyramid Pooling)을 사용한다.

     

     

     - Decoder

     이전의 DeepLab V3에서는 Decoder 부분을 단순히 bilinear upsampling해주었으나, V3+에서는 Encoder의 최종 Output에 1*1 Convolution을 하여 Channel을 줄이고 bilinear upsampling 해준 후 Concat하는 과정이 추가되었다. 

     

     2) Modified Aligned Xception

     본론으로 들어가기 전, Xception은 Inception Module에 Depthwise Separable Convolution을 적용한 것이다.

     

     

    여기서 잠깐! 해당 논문에는 Inception Module이 무엇인지 친절히 설명해주지 않았기에 Inception Module이 무엇인지부터 살펴보자.(추후 다른 게시글에서 GoogLeNet 논문에 대해 리뷰하면서 자세히 다루어보겠다.)

     

    Inception Module, naive version

     

     

     보통 Convolution 연산을 통해 W, H의 크기를 줄이고 C는 늘리는 형태를 취하게 되는데, Inception은 위의 구조써 차원을 줄이는 효과를 얻을 수 있다. 조금 더 자세히 본다면 다음과 같다.

     - W, H는 Max-Pooling을 통해 줄인다.

     - C는 Convolution Filter에서 지정할 수 있다. (보통의 Convolution은 C를 늘리는 방향으로 진행된다.)

     - 이 때. 1*1 연산은 Convolution 연산에 사용하는 필터를 1*1로 하고 C는 늘리는 것이 아니라 크기를 줄이는 역할을 수행하도록 한다.

     이렇게 하면 C 단위로 FCL 연산을 하여 압축이 가능하다는 것이다.(이러한 Module을 Network in Network, NIN이라 부른다.)

     

     

     다시, DeepLab V3+로 돌아와서, DeepLab V3+에서는 Xception을 backbone으로 사용하지만 MSRA의 Aligned Xception과 다른 3가지 변화를 주었다.

     

    왼쪽 : 원래의 Xception 모델, 오른쪽 : 논문에서 사용된 변형 Xception 모델

     

     - 빠른 연산과 메모리 효율을 위해 Entry Flow Structure 를 수정하지 않았다.

     - Atrous Separable Convolution을 적용하기 위해 모든 Pooling Opearation을 Depthwise Separable Convolution으로 대체하였다.

     - 각각의 3*3 Depthwise Convolution 이후에 추가적으로 Bath-norm과 ReLU 활성화 함수를 추가해주었다.

     

     

    (3) Experiment

     

     다양한 파라미터와 세팅에 대해서 실험을 진행하였는데, 우선 ResNet-101 구조를 Encoder로 사용하였을 때, 성능을 측정한 것이다. Decoder 부분을 bilinear upsampling 대신, 단순화된 U-Net 구조로 변경할 경우 기존 대비 mIOU 1.64% 향상이 있음을 확인 할 수 있다.

     

     

    Decoder effect

     

     이후, Encoder를 Xception으로 교체 후 실험하였을 때는 약 2% 가량의 성능 향상을 가져왔다.

     ASPP 부분과 Decoder 부분에 사용되는 Convolution들을 모두 Separable Convolution으로 대체할 경우 성능은 기존 Convolution을 사용할 때와 거의 비슷하였지만, 모델이 사용하는 연산량 자체가 획기적으로 줄어들었음을 확인 할 수 있었다.

    댓글

by KUKLIFE