#VISION #SEGMENTATION #DeepLabV3+
Relation Works
1) Atrous Convolution

먼저 DeepLab v3+에서 사용되는 convolution 연산 중에 Atrous convolution에 대하여 알아보도록 하겠습니다. convolution 연산 시 receptive field 사이에 hole을 추가하여 receptive field를 확장하는 구조를 가집니다. 여기서 R을 크게 설절할 수록 필터 내부의 빈 공간이 넓어집니다. 이를 통해 기존 convolution과 동일한 양의 파라미터와 계산량을 유지하면서 넓은 영역을 볼 수 있습니다. 또한 convolution과 pooling 과정에서 디테일한 정보가 줄어들고 특성이 점점 추상화되는 것을 방지하는 장점이 있습니다.
2) Atrous Spatial Pyramid Pooling (ASPP)

두번째 관련 개념으로는 Atrous Spatial Pyramid Pooling, ASPP 입니다. 앞서 설명드린 애트로스 컨볼루션에 rate 값을 다르게 준 채로 병렬로 적용하여 다시 합쳐주는 기법입니다. Multi-scale context를 모델 구조로 구현하여 보다 정확한 semantic segmentation을 가능하게 합니다.
3) Depthwise separable convolution

세번째 관련된 개념은 Depthwise separable convolution입니다. Depthwise separable convolution은 convolution을 depthwise convolution과 pointwise convolution으로 factorize한 것입니다.(즉, 결합했다). 논문에서는 atrous convolution에 이를 적용하여 atrous depthwise separable convolution으로 적용했습니다.

일반적인 컨볼루션은 모든 커널 사이즈와 모든 채널에 대해서 한번에 진행되기 때문에 연산량 자체가 굉장히 많아집니다. 예를 들어, 입력 이미지가 8*8*3(H*W*C)이고, Convolution 필터 크기가 3*3(F*F)이라고 할 때, 필터 한 개가 가지는 파라미터 개수는 3*3*3(F*F*C)=27이 됩니다. 만약 필터가 16개라면, 해당 Convolution의 총 파라미터 수는 3*3*3*16(F*F*C*N)을 한 432개 만큼 지니게 됩니다.

하지만 Depthwise Separable Convolution을 적용하면 Sepatial Dimension과 Channel Dimension을 분리시켜 각각 처리하기 때문에 3*3*3 + 3*16을 해서 75 개의 파라미터 개수를 갖게 됩니다. 두 파라미터 개수를 비교해보면 Depthwise Separable convolution의 파라미터 개수가 현저히 낮고, 이는 연산량과 사용되는 파라미터 수를 줄이는데 도움이 되는 컨볼루션 방법임을 알 수 있습니다.
정리를 해보자면, Depthwise separable convolution은 Depthwise Convolution의 결과에 대해 1 * 1 * C 크기의 Convolution 필터, 즉 pointwise convolution을 적용함으로써 Sepatial Dimension과 Channel Dimension을 분리시켜 각각 처리합니다. 이처럼 복잡한 연산을 수행하는 이유는 기존 Convolution과 유사한 성능을 보이면서도 사용하는 파라미터 수와 연산량을 획기적으로 줄일 수 있기 때문입니다.
여러 개의 필터가 Spatial Dimension 처리에 필요한 파라미터를 하나로 공유함으로써 파라미터의 수를 더 줄일 수 있게 되는 것입니다. 두 축을 분리시켜 연산을 수행하더라도 최종 결과값은 결국 두 가지 축 모두를 처리한 결과값을 얻을 수 있으므로, 기존 convolution filter가 수행하던 역할을 충분히 대체할 수 있게 됩니다.
4) Encoder-Decoder

네번째 관련 개념은 Encoder-Decoder 입니다. 전에 배웠던 U-Net과 유사하게 인코더 디코더 구조를 적용하며, 이로 인해 정교한 object boundary를 예측할 수 있습니다.
Method
1) Encoder-Decoder with Atrous Convolution
이제 본격적으로 모델이 어떻게 구성되는지에 대해 설명드리겠습니다.

A <spatial pyramid pooling>은 deepLabV3의 구조입니다. A에서는 atrous convolution을 사용해서 보다 dense한 피쳐맵을 취득할 수 있습니다. 그러나, 연산을 하고 난 결과를 단순히 upsampling하여, 피쳐맵의 크기를 줄이지 않기 때문에 GPU 메모리와 관련한 문제가 생기게 됩니다.

반면에 두번째에 있는 B <encoder-decorder>구조는 encoder에서는 dilated(확장)된 피쳐가 없기 때문에 비교적 계산이 빠르고, decoder 단계에서 점진적으로 크기를 복원하기 때문에 디테일을 잘 잡을 수 있습니다.

그래서 Deeplabv3+에서는 기존 DEEPLABV3의 GPU메모리 한계 문제를 해결하기 위해 앞서 설명드린 A,B 두 방식의 장점들을 통합하여 사용했습니다. Atrous spatial pyramid pooling 모듈을 사용하여 multi-scale contextual 정보 추출이 가능했습니다. 즉, encoder는 기존의 DeepLab v3를 이용하여 atrous convolution를 이용하고, decoder에서는 Encoder-decoder 구조를 통해 점진적으로 공간 정보를 확장시켜 객체 경계를 세밀하게 복원하도록 하였습니다.
- Encoder

좀 더 자세한 DeepLab V3 + 구조에서 Encoder 부분을 보겠습니다.
먼저 DCNN을 이용해서 각각 디멘션을 줄여나가고, 어트로스 컨볼루션을 이용하는데 여기에SPATIAL PYRAMID POOLING 개념이 들어갑니다. 각각 다른 RACE로 풀링을 진행하고 이걸 전반적으로 컨캐티넷을 시킵니다. 그 다음 1 BY 1 컨볼루션을 통해 차원 축소를 한 뒤, upsampling 시 concat하는 방법을 가집니다.
- Decoder

이번에는 Decoder 부분을 보겠습니다. U-NET처럼 모든 각각의 인코더와 디코더를 원바이원으로 결합시킨 것 보다는 좀 더 간단한 모델입니다. LOW-LEVEL FEATURES를 유넷의 스킵커넥션과 비슷한 개념으로 생각하시면 될 것 같습니다. 1x1 convolution을 사용해서 백본의 low-level features의 channel 개수를 줄인 뒤, 인코더 파트에서 나왔던 결과 자체를 업샘플 시켜서 컨캐트네이트 시킵니다. concat함으로써 채널이 적은 encoder features의 중요도가 줄어들지 않도록 해줍니다. 이후 3 BY 3 컨볼루션을 거쳐서 업샘플링 하는 과정을 거칩니다.
2) Modified Aligned Xception
DEEPLABV3+는 백본으로 RESNET만 사용한 것이 아니라 XCETPION NET을 사용했습니다. 먼저 간단하게 백본과 RESNET, XCEPTION에 대해 말해보자면, 백본은 PRETRAIN 된 특징 추출기라고 표현할 수 있습니다. DeepLab v3+에서 사용된 backbone 네트워크는 ResNet-101과 Xception입니다.
Resnet은 VGG-19의 구조를 뼈대로 하여 컨볼루션 층들을 추가해서 깊게 만든 후에, shortcut들을 추가한 101개 계층의 컨벌루션 신경망입니다.
Xception은 Inception Module에 Depthwise Separable Convolution을 적용한 것입니다. 본 논문에서는 두 백본 네트워크 중, 사용 결과 성능은 유사하나 Xception에서 조금 더 좋은 성능이 나왔다고 하였고 이 때 적용한 Xception 구조는 약간 변경되어 적용되었습니다.

어떻게 Xception 구조를 바꿨나 보겠습니다. 먼저, 깊은 Xception을 사용하지만 네트워크의 초입 부분은 빠른 계산을 위해 이 Entry Flow Structure 부분은 수정하지 않았습니다. Atrous separable convolution을 적용하기 위하여 모든 Max pooling 연산은 depthwise separable convolution의 stride를 이용하도록 변경하였습니다.
그리고 각각의 3x3 depthwise convolution 이후에 추가적으로 batch normalization과 ReLU함수를 추가적으로 적용하여 변형한 Xception을 백본으로 사용했습니다.
Experiment
이제 논문에 소개된 실험 결과들에 대해 말씀드리겠습니다. 측정 평가는 mIOU로 했고 mIOU는 IOU의 평균이고 segmentation에서는 픽셀 단위 기준으로 IOU를 실시하게 됩니다.

[Decoder Design Choices : considered three places for different design choices]
먼저 디코더를 디자인 하기 위해 실험한 것들입니다.

1x1 convolution으로 채널 수로 얼마가 좋은가?에 대한 실험에서는 48개 채널 수를 설정하는 게 가장 좋은 Miou 결과를 냈습니다.

3x3 convolution을 어떤 feature 단계에서 사용하면 좋은가, 몇 개 이용하는게 좋은가? 에 대한 실험에서는 2개를 이용하였을 때 가장 좋은 결과를 얻었습니다.
[ResNet-101 as Network Backbone]

이 실험은 백본으로 ResNet-101 구조를 Encoder로 사용한 것입니다.
Baseline은 decoder를 적용하지 않은 것, adding decoder는 디코더를 넣고 진행한 것, 마지막은 atrous convolution을 training 단계에서 실행하지 않은 것입니다. Miou 값들을 보면 디코더를 넣었을 때 좀더 좋은 결과를 띄는 것을 볼 수 있습니다.
[Xception as Network Backbone]

이번 실험에선 백본으로 Xception을 사용했습니다.
테이블4를 보면 백본으로 resnet-101을 사용했을 때와 변형된 xception을 사용했을 때를 비교한 결과, Encoder를 Xception으로 교체 후 2% 향상된 것을 볼 수 있습니다.

테이블5에서는 ASPP 부분과 Decoder 부분에 사용되는 Convolution을 Separable Convolution으로 대체한 결과, 성능은 기존 Convolution 사용과 비슷하지만, 모델이 사용하는 연산량이 획기적으로 줄어듦을 알 수 있었습니다.
[Improvement along Object Boundaries]

다음으로 object boundaries에 대한 실험으로 4가지 모델을 비교했습니다.
디코더를 사용한 xception모델, 디코더 없이 바이니어 업 샘플링만 이용해서 디멘션을 확장시킨 xception 모델, 추가적으로 엑셉션과 레스넷을 비교했습니다.
결과적으로 디코더를 사용한 xception 모델이 가장 좋은 성능을 띄었습니다.
우측 segmentation 결과를 보면 가장 오른쪽의 w/ Decoder가 라인이나 상세한 정보들이 잘 세그멘테이션 된 것을 볼 수 있습니다.
[Experimental Results on Cityscapes]

마지막 실험으로 cityscape이라는 데이터셋 사용하여 실험했습니다.
Xception 모델에 해당하는 백본에서 71로 좀 딥한 넷을 쌓았을 때 가장 성능이 좋았고,
다른 네트워크랑 비교한 b test set results에서도 Deeplabv3+가 다른 모델에 비해 잘 나온 것을 볼 수 있습니다.