본문 바로가기

딥러닝/Semantic Segmentation

BiSeNet V2 : Bilateral Network with Guided Aggregation for Real-time Semantic Segmentation

초록

Semantic segmentation을 위해서는 low-level detail과 high-level semantics가 중요하다. 그러나 빠른 속도를 위해 많은 방법론에서 low-level details를 희생시켰다. 이 논문에서는 그 대신 spatial detail과 categorical semantics를 따로따로 분리해서 취급한다.

  • 구조
    1. Detail Branch : wide channels와 shallow layers가 있어서 low-level details와 high-resolution feature representation captur
    2. Semantic Branch : narrow channels와 deep layers로 high-level semantic context 취득
  • Guided Aggregation Layer : mutual connection을 강화시키고, 두 features를 fuse함
  • Booster 학습 전략 : 추가적인 inference 시간 없이 성능 향상
  • 2048x1024 인풋에 대해 Cityscapes test set에서 72.6% mIOU, 156 FPS (GTX 1080 Ti)

도입

Semantic segmentation의 정확도는 backbone 네트워크와 관련이 있다. Backbone으로는 두 가지 구조가 많이 사용된다.

  1. Dilation Backbone

    • down-sampling과 해당하는 upsampling을 없애서 high-resolution feature representation을 유지하는 방법
    • 단점 : dilation convolution이 오래 걸리며, down-sampling을 없애는 것도 오래 걸리고, 메모리도 많이 소요됨
    • img
  2. Encoder-Decoder Backbone

    • decoder에서 high-resolution으로 recover하기 위해 skip connections 사용
    • 단점 : 메모리 접근 cost가 높다
    • img

그러나 위 두 방법 모두 inference 시간에 대한 고려 없이 설계된 것이고, real-time application에 맞지 않다. 이 때문에 현재 real-time용 방법들은 주로 모델을 빠르게 하기 위해 다음 두 가지 방법으로 접근한다.

  1. Input Restricting

    인풋 이미지 자체가 작으면 얼마 안 안 걸린다

  2. Channel Pruning

    직관적인 가속화 방법. 특히 early stages에서 channel pruning을 하면 훨씬 속도를 줄일 수 있다.

그러나 이 두 방법 모두 low-level details은 포기한 것이고, 이 때문에 정확도 성능이 떨어진다. 그러므로 정확도와 속도를 모두 가져오기 위해 specific architecture를 만드는 것이 중요하다.

일반적인 semantic segmentation task에서는 deep and wide network가 low-level, high-level informations를 모두 encode했었다.

그러나 real-time semantic segmentation을 위해 spatial details와 categorical semantics를 분리했다. BiSeNet V2에서는 Detail Branch와 Semantic Branch로 분리했다. emantic Branch는 narrow (적은) channels을 사용해서 lightweight하고 빠르게 downsampling할 수 있다는 것이 특징이다. 두 branch에서 얻어진 features는 더 종합적인 representation을 위해 merge된다.

img

특히 이 논문에서 Guided Aggregation Layer를 사용해서 효과적으로 features를 merge한다. 또한 inference 단계에서는 사용하지 않는 series of auxiliary prediction heads를 사용하는 booster 학습 전략을 제안해서 inference 시간 증가 없이 성능 증가를 가져왔다.

img

Contribution은 다음과 같다

  1. two-pathway 구조 제안
  2. Semantic Branch : new light-weight network based on depth-wise convolutions 사용해서 receptive field를 키우고 rich contextual information을 capture함
  3. Booster 학습 전략
  4. Cityscapes, CamVid, COCO-Stuff에서 좋은 성능, Cityscapes test set에서 72.6% mIOU, 156 FPS

BiseNet에 비해 다음 사항이 변경되었다.

  1. 구조 단순화
    • 시간이 많이 소요되는 cross-layer connection을 없앰
  2. 전체적인 구조를 더 compact한 구조와 well-designed components로 변경
    • Detail Path를 더 깊게 만들어서 더 많은 detail을 encode할 수 있도록 함
    • Semantic Path에서 depth-wise convolution을 사용한 light-weight components을 설계
  3. comprehensive ablative experiment를 수행
  4. 성능 향상 많이 함

3. Core Concepts of BiSeNetV2

3.1 Detail Branch

low-level information인 spatial details를 위한 것이므로 rich channel capacity가 필요하다. 또한 low-level에만 집중하기 때문에 small stride를 가진 shallow layers를 가진다. 그 결과로 나오는 feature representation은 large spatial size와 wide channels를 가진다. 그러므로 메모리 access양 증가와 속도 저하를 가져오는 residual connection을 사용하지 않는 편이 낫다.

3.2 Semantic Branch

Detail Branch와 병렬로 수행되며 high-level semantics를 capture한다. 이 논문에서는 Semantic Branch가 Detail Branch channel의 λ (λ < 1) 배의 개수를 가져서 branch가 lightweight될 수 있도록 실험했다. 기본적으로 Semantic Branch는 어떠한 lightweight convolutional model이 되어도 된다.

또한 semantic branch에서 fast-downsampling strategy를 사용해서 feature representation의 level을 높이고 receptive field를 확장시켰다.

그리고 큰 receptive field를 위해 global average pooling을 사용했다.

3.3 Aggregation Layer

Detail Branch와 Semantic Brach의 features는 서로 상호보완적이다. 그러므로 Aggregation Layer가 두 타입의 features를 merge하기 위해 사용된다. Fast-downsampling strategy때문에 Semantic Branch의 output의 spatial dimension이 Detail Branch output보다 작다.

4. Bilateral Segmentation Network

BiSeNet의 컨셉은 general해서 다른 models로도 구현가능하다. Key concept (Detail branch, Semantic Branch, Aggregation Layer)만 있으면 된다.

4장에서는 전체적인 구조를 설명하고 Fig 3에서 볼 수 있는 specific designs에 대해 다룰 것이다.

img

4.1 Detail Branch

img

Detail Branch는 3개의 stage로 구성되며, 각 stage는 convolution 다음에 BN, activation이 따르는 구조이다. 각 stage 의 첫 번째 layer는 stride=2이며, 같은 stage의 layers끼리는 같은 개수의 filters와 feature map size를 가진다. 이에 따라 이 branch는 인풋 사이즈의 1/8 크기의 output feature maps를 만들어낸다. Detail Branch가 high channel capacity랑 large spatial dimension이 크기 때문에 residual structure를 사용하면 메모리 접근 cost가 커진다. 그렇기 때문에 VGG 구조를 사용한다.

4.2 Semantic Branch

큰 receptive field와 효율적인 연산을 동시에 고려해서 lightweight recognition model인 Xception, MobileNet, ShuffleNet을 사용한다. Semantic Branch의 key features는 다음과 같다

Stem Block

Stem Branch의 첫 번째 stage로 Stem Block을 사용한다.

img

Stem Block에서는 두 가지 downsampling 방식을 사용해서 feature representation으로 shrink한다. 그 다음 output features를 concat시킨다. 이를 통해 연산양이 줄며 효과적으로 feature expression을 할 수 있다.

Context Embedding Block

이 블록에서는 global average poolingresidual connection을 사용해서 global contextual information을 효율적으로 embed한다.

img

Gather-and-Expansion Layer

img

depth-wise convolution의 이점을 취하기 위해 Gather-and-Expansion Layer를 사용한다.

참고) depth-wise convolution : 각 채널마다의 spatial features를 추출하기 위한 방법 (https://hichoe95.tistory.com/48)

img

4.3 Bilateral Guided Aggregation

4.4 Booster Training Strategy

5. 실험 결과

Training

  • trained from scratch with "kaiming normal" initialization

  • SGD, 0.9 momentum

  • batch size 16

  • weight decay : [Cityscapes, CamVid] 0.0005, [COCO-Stuff] 0.0001

    weight decay regularization은 convolution layer parameters에만 적용됨

  • initial rate : 5e-2, poly learning rate strategy

  • iterations : 150K(Cityscapes), 10K(CamVid), 20K(COCO-Stuff)

  • augmentation

    • random horizontal flip

    • random scale {0.75, 1, 1.25, 1.5, 1.75, 2.0}

    • random crop to fixed size 20481024 (Cityscapes), 960720 (CamVid), 640*640 (COCO-Stuff)

      Cityscapes 인풋은 1024*512로 resize되서 학습됨

Inference

  • 20481024 인풋에 대해 1024512로 resize하고 예측결과를 기존 사이즈로 resize해줌
  • 하나의 gpu로 인퍼런서하고 5000 interations 반복해서 error fluctuation을 제거함 (resize 시간까지 inference에 포함)
  • Cityscapes, CamVid에는 mIOU 쓰고, COCO-Stuff에는 mIOU랑 pixACC 사용

Setup

  • Pytorch 1.0
  • GTX 1080Ti
  • CUDA 9.0, CUDNN 7.0, TensorRT v5.1.5