SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation 본문

ML & DL/Paper Review

SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation

eremo2002 2021. 2. 1. 19:59

arxiv.org/pdf/1511.00561.pdf

 

Abstract

  • SegNet이라는 pixel-wise segmentation 모델을 제안한다.
  • SegNet은 encoder-decoder로 아키텍처로 encoder는 f.c layer를 제외한 VGG16을 사용하고 decoder는 학습 파라미터가 필요 없는 un-maxpooling을 이용하여 upsampling한다.
  • decoder에서 upsampling 된 feature map은 convolution layer를 통해 dense feature map으로 만든다.
  • SegNet은 memory & accuracy 사이의 trade-off에서 FCN, DeepLab-LargeFOV, DeconvNet 보다 좋은 퍼포먼스를 낸다.
  • 제안하는 SegNet 아키텍처가 road scene segmentation, SUN RGB-D indoor scene segmentation task에서 더 좋은 성능을 낸다.

 

Introduction

max pooling, sub-sampling 연산을 수행하다보면 coarse feature map이 만들어지게 된다. coarse feature map은 pixel-wise prediction을 해야하는 segmentation task에서 정보가 부족하기 때문에 좋은 output을 내지 못한다.

SegNet은 이러한 low resolution feature로부터 input 이미지와 동일한 크기로 정확한 boundary localization이 가능한 아키텍처를 만들고자 제안되었다.

 

SegNet은 road scene segmentation task를 풀고자 하였으며, 해당 task는 appearance(road, building), shape(cars, pedestrians), spatial-relationship (context, road & side-walk) 같은 정보를 이해하는 것이 중요하다. 대다수의 픽셀은 크기가 큰 building, road class에 해당하기 때문에 class간의 boundary를 잘 구분할 수 있어야 한다.

  • 도로와 보도는 비슷한 점이 있지만 엄연히 다른 class이기 때문에 두 class간의 경계를 잘 구분하는 것이 중요하다.

 

우선, SegNet 구조는 아래 그림 2와 같으며 encoder 구조는 VGG16에서 f.c layer를 제외한 것과 동일하다. f.c layer를 제외한 이유는 SegNet이 메모리 사용량, 계산량 등 computation cost 측면에서 강점을 가지기 위해 f.c layer를 제외하였다. decoder의 경우 encoder의 mirrored 구조로 볼 수 있으며 upsampling을 위해 un-maxpooling을 사용하였다. DeconvNet과 비슷하지만 un-maxpooling 이후 일반 conv layer를 이용하여 feature를 추출했다는 점에서 차이가 있다.

 

 

 

SegNet의 main idea라 할 수 있는 un-maxpooling의 장점은 3가지로 추려볼 수 있다.

  1. boundary delineation(묘사) 측면에서 improve
  2. upsampling을 위해 deconvolution layer를 사용하지 않기 때문에 별도의 학습 파라미터가 없고 전체 모델은 여전히 end-to-end 학습이 가능하다.
  3. 다른 encoder-decoder 구조에 응용할 수 있고 modification이 용이하다.

 

Architecture

SegNet의 encoder-decoder는 각각 13개의 convolution layer로 구성되어 있고 encoder는 VGG16 구조를 따르기 때문에 encoder의 경우 pre-trained weight 활용이 가능하다. encoder에서 f.c layer를 제외한 이유는 VGG에서 대다수의 파라미터가 f.c layer에 존재하지만 f.c layer가 그만큼 중요한 역할을 하는 것도 아니고 메모리 사용량도 줄일 수 있기 때문에 f.c layer를 제외하였다. f.c layer만 제외하더라도 약 9배의 파라미터가 줄어들게 된다. 레이어 구조는 conv → BN → ReLU, stride가 2인 2x2 max pooling을 사용하였다.

 

convolution, pooling으로 feature map의 사이즈가 줄어들게 되면 디테일한 boundary 정보가 사라지게 되며 이러한 문제는 pixel 단위로 예측해야 하는 segmentation에서는 더욱 심각해진다. 이러한 문제를 해결하기 위해 feature map의 representation power는 살리면서 upsampling하는 것이 중요한데 SegNet에서는 un-maxpooling과 convolution을 이용하여 이러한 문제를 해결하였다.

 

만약 메모리 자원에 대한 제한이 없으면 encoder에서 만들어지는 모든 feature map을 저장해놨다가 skip connection을 이용해 decoder에서 나온 feature와 결합하는 것도 하나의 방법이 되겠지만 메모리는 제한적이기 때문에 현실적으론 어렵다. 그래서 max-pooling layer의 indices 정보를 이용한 un-maxpooling을 사용하는 것이 훨씬 효율적이다.

 

 

 

K(클래스 개수)개의 채널을 가진 decoder의 최종 output은 trainable softmax classifier로 입력되어 pixel 마다 독립적으로 확률값을 계산한다.

 

Decoder Variants

본 논문에서는 SegNet 구조를 조금씩 변형하여 성능을 비교한다.

 

SegNet-basic

  • 기존의 SegNet과 동일하며 layer 개수만 줄인 버전으로 4개의 encoder, 4개의 decoder를 사용한다.
  • wide context 정보를 추출하기 위해 모든 convolution layer에서 7x7 kernel을 사용하며 decoder에 bias, relu를 사용하지 않는다.

 

 

FCN-basic

  • encoder 구조는 SegNet-basic과 동일하고 decoder는 FCN에서 사용했던 구조를 사용

SegNet-Basic-SingleChannelDecoder

  • SegNet-Basic과 동일한 구조
  • decoder filter가 single 채널을 갖도록 함
  • 이렇게 하는 이유? 학습 파라미터 수를 줄일 수 있고 인퍼런스 속도 향상
  • 여기서 single channel이라는 것으로 봤을 때, depthwise convolution을 사용했다는 것으로 보임 

 

FCN-Basic-NoAddition

  • FCN에서 skip connection 제외

 

Bilinear-Interpolation

  • FCN-Basic-NoAddition모델에서 upsampling layer를 fixed bilinear interpolation weight 사용

 

SegNet-Basic-EncoderAddition

  • 채널 크기가 64인 모든 feature map을 가져와서 decoder feature map과 add 

     

FCN-Basic-NoDimReduction

  • encoder에서 채널 차원축소 x

 

 

Training

학습 데이터셋 : CamVid road scene

 

  • 367 train images, 233 test images
  • 11 classes (road, building, cars, pedestrians, signs, poles, side-walk ...)
  • weight init : He
  • optimizer : SGD
  • lr : 0.1(momentum = 0.9)

 

sky, road, building 처럼 크기가 큰 클래스의 경우 이미지에서 차지하고 있는 픽셀 수가 다른 클래스에 비해 많기 때문에 loss에 끼치는 영향도 클래스마다 달라지게 된다. class balancing이 필요하며 논문에서는 median frequency balancing을 사용하였다. 학습 데이터셋에서 특정 클래스가 차지하고 있는 비중에 따라 loss함수 계산 시 weight를 다르게 부여함 (클래스마다 비중 계산은 픽셀 수를 기준으로 계산한 것으로 보임)

 

sky, building, road 같이 크기가 큰 클래스의 경우 1보다 작은 값의 weight를 사용하고 크기가 작은 클래스의 경우 1보다 큰 값의 weight를 사용하여 loss function 계산 시 class balancing이 유지되도록 함

  • validation score가 가장 좋은 weight를 test에 사용함

 

Analysis

정량적 평가 척도로 총 3가지 metric을 사용함

  1. global accuracy

    데이터셋 전체의 픽셀 수에서 올바르게 분류된 픽셀의 수

  2. class average accuracy

    각 클래스마다 accuracy를 계산한 뒤, 평균낸 것

  3. boundary F1 Score

    boundary에 대한 예측이 중요하기 때문에 mIoU보다 정성적 평가에 더 적합하기 때문에 mIoU 대신 BF1 score를 사용함

    score = 2 * precision * recall / (recall + precision)

metric 참고자료

 

 

upsampling에서 bilinear-interpolation을 사용한 경우 성능 저조함

 

학습 파라미터를 이용하여 upsampling하는 FCN-Basic기반 모델이나, upsampling 이후 feature를 더 추출하는 모델(SegNet-Basic 기반 variant)들이 bilinear-interpolation 보다 더 좋은 성능을 보여줌 결과적으로 decoder 또한 학습 가능한 구조를 사용하는 것이 더 좋다.

 

SegNet-Basic과 FCN-Basic은 둘다 성능이 잘 나오는 편, 그러나 인퍼런스 시 SegNet은 max-pooling indices를 사용하기 때문에 메모리 사용량이 더 적음. SegNet 메모리 사용량이 1이라고 했을 때 FCN은 11배 이상의 메모리를 사용함

 

메모리 사용량 측면에선 SegNet-Basic이 더 효과적인데 인퍼런스 속도는 FCN-Basic이 더 빠르다. SegNet decoder의 경우 각 decoder layer에서 64개의 feature map을 사용하지만 FCN-Basic의 경우 각 decoder layer에서 feature map dimension reduction으로 인해 인퍼런스 속도는 FCN-Basic이 더 빠르다.

 

실험결과를 전체적으로 요약해보면,

  1. encoder feature map 전체를 저장하는 것이 BF(boundary F1 score) 성능이 가장 좋다. 여기서 feature map 저장은 skip connection을 위해 저장하는 것

  2. 인퍼런스 시 메모리 사용량이 제한된 경우, decoder에서 un-maxpooling을 사용하면 성능을 올릴 수 있음

  3. Larger decoders increase performance

 

Benchmarking

SegNet을 2가지 scene segmentation dataset에서 평가함

  • road scene segmentation
  • indoor scene segmentation

 

Road Scene Segmentation

  • class간 boundary 부분에서 SegNet이 다른 모델들보다 더 정교하게 boundary를 구분하고 small 객체도 잘 잡는다.
  • DeepLab-LargeFOV의 경우 크기가 작은 클래스는 제대로 segmentation하지 못했지만 그래도 competitive한 결과를 보여줌
  • FCN with deconv의 경우 고정된 bilinear upsampling을 사용한 FCN보다 더 better한 결과를 보여줌
  • DeconvNet의 경우 모델 자체가 굉장히 크고 학습이 비효율적이며 small class 객체는 segmentation하지 못함..

 

 

 

 

SegNet을 non deep-learning method와 비교한 결과로 확실히 딥러닝을 사용하는 것이 더 의미 있는 성능을 보여줌

그런데 CamVid dataset은 데이터가 그렇게 많지 않은 데이터셋인데 여기에 추가 데이터셋으로 학습시켜놓고 딥러닝 모델이 더 좋다! 라고 주장하는 건 좀... 학습은 CamVid trainset만 사용해서 학습시키고 비교하는 게 맞지 않나...

 

 

 

 

SUN RGB-D Indoor Scenes

SUN RGB-D 데이터셋은 실내 이미지에서 37개 클래스를 segmentation한 데이터셋 (실내 환경 같은 데이터는 증강현실 쪽에서 흥미롭게 사용되는 데이터셋이라고 함)

  • 5285 train images
  • 5050 testing images
  • class : wall, floor, ceiling, table, chair, sofa ...

 

객체의 shape, size, pose가 굉장히 다양하고 부분적인 occlusion도 존재하기 때문에 꽤나 challenge한 task임. 본 논문에서는 이미지의 depth 정보는 제외하고 RGB 정보만 사용

 

 

 

SegNet qualitative result(정성적 결과)

  • SegNet은 view가 달라지더라도 크기가 큰 객체들은 잘 잡아냄 다른 모델들보다 reasonable한 결과를 보여줌
  • It is also useful to segment decorative objects such as paintings on the wall for AR tasks. 라고 주장하는데 전혀 그렇지 않아보임
  • 특히 세 번째 컬럼 이미지의 경우 굉장히 난잡한 prediction이 만들어지는데, 이는 주방에 존재하는 객체들이 라벨링되지 않았기 때문에 발생하는 결과

 

 

 

Quantitative result(정량적 평가)

  • 모든 딥러닝 모델들이 mIoU, BF 성능 저조함(이 결과는 데이터셋 특성상 어쩔 수 없는 거 같다.)
  • SegNet의 G, C, BF 성능은 다른 모델들보다 훨씬 우수한 결과를 보임 (물론 >140K에서..)
  • iteration이 적을 때도 성능이 더 잘 나온다 (수렴이 빠르다?)

 

 

  • 사이즈가 큰 클래스의 경우 reasonable한 성능을 보여주지만 사이즈가 작은 클래스의 경우 성능이 매우 저조함
  • 클래스 수가 많고 이미지에서 사이즈가 작은 객체 또한 많기 때문에 성능이 잘 나오지 않는다.

 

 

Discussion and Future Work

딥러닝 기반의 모델들이 성능이 좋은 이유는 대규모 데이터셋으로 큰 model을 학습시키기 때문에 성능이 잘 나온다. 그러나 딥러닝 모델을 deploy하거나 임베디드 device에 포팅해야 하는 경우 메모리, 연산 속도와 같은 요소도 굉장히 중요하다. 또한 학습시간에 비례해서 성능이 지속적으로 증가하는 것도 아니다.

 

효율성 측면에서 메모리 사용량, 연산 속도를 고려해야 실시간 application으로 활용이 가능할 것이다. 기존 모델들은 이러한 측면을 고려하지 않았던 것 같음. 따라서 모델을 경량화하면서 reasonable한 성능을 내는 모델을 만드는 것이 중요하며 이러한 측면을 고려해서 SegNet을 설계함

 

일반적인 PASCAL VOC, MS-COCO 데이터셋의 경우 test 이미지에 존재하는 클래스 수가 많지 않지만, Scene segmentation의 경우 test 이미지에서 등장하는 클래스 수가 더 많고 indoor scene segmentation은 high variability 특성 때문에 더 challenge하다.

 

 

Conclusion

  • road, indoor scene segmentation을 위한 효율적인 아키텍처 SegNet을 제안하였다.
  • SegNet은 메모리 사용량 연산 속도 측면에서 다른 모델보다 훨씬 효율적이다.
  • encoder에서 모든 feature map을 저장하는 아키텍처의 경우 성능은 우수하지만 메모리 사용량이 많아지는 단점이 있다. 그러나 SegNet은 un-maxpooling을 사용하여 메모리 사용량을 줄이면서 성능도 개선하였다.

 

 

 

My opinion

  • 일단 저널 논문이라 그런지 컨퍼런스 논문보다 텍스트가 굉장히 많음..

  • Table 1에서 train accuracy를 같이 제공해준 점이 좋았음

  • segmentation 모델을 메모리 사용량, 연산 속도 측면을 고려하여 아키텍처를 설계했다는 점에서 의미 있는 시도

  • 모델 구조가 심플하고 DeconvNet이랑 크게 다르지 않다. 그림도 명확해서 아키텍처를 이해하는데 어려움은 없었음

  • 본인들이 강하게 주장하는 메모리 사용량, 인퍼런스 속도를 고려했을 때, SegNet이 정말 dramatic한 성능 개선을 했다고 느껴지진 않음.. 인퍼런스 시 메모리 사용량이나 연산 시간이 효율적이라고 하는데 Table 6을 보면 DeepLab-LargeFOV보다 GPU inference memory만 좋고 나머지 지표는 다 밀림

  • 객관적이지 못한 실험

    • 이전 논문인 FCN, DeconvNet에선 Pascal VOC로 실험했는데 왜 여기선 Pascal VOC로 안했는지 의문임. Pascal VOC 데이터셋에서 성능이 안 나와서 일부러 scene segmentation 쪽으로 전환하고 그쪽에 의미부여를 한 건 아닌가 하는 생각이 듦
    • 비교 모델인 FCN, DeconvNet, DeepLab-LargeFOV은 논문에서 사용하는 Road scene segmentation, indoor scene segmentation 데이터셋으로 성능 평가를 한 적이 없음. 그러면 결국 저자가 기존 모델을 튜닝해서 해당 데이터셋으로 평가했다는 건데 그러면 이게 과연 객관적인 실험이라고 할 수 있을까?
    • Table 2에서 왜 SegNet은 large dataset을 사용하는지..?
  • un-maxpooling을 사용해서 메모리 사용량을 줄였다고 주장하는데 차라리 encoder network를 VGG가 아닌 다른 경량화된 network를 활용했다면 어땠을까

 

스터디원분들 의견

  • FCN, DeconvNet, bilinear interpolation 등 여러 모델이나 테크닉 등에 대한 비교가 많음, 제안하는 모델에 집중하기 보다 추가적인 실험이 굉장히 많았음
  • 제안하는 방법, 컨트리뷰션에 비해 설명이 너무 장황하다. 같은 말 너무 반복함
  • 해당 저널에 실릴 정도의 논문인가?
  • 활용도는 높아 보이지 않지만 논문에서 언급해주는 개념들을 공부해보기 좋음
  • DeconvNet의 연장선이지만 DeconvNet과 큰 차이가 없다.
  • DeconvNet과 비슷하지만 약간의 차이로도 성능이 개선될 수 있다.
  • 제안하는 방법이 fancy하기 보다 억지로 분량을 늘리려는 느낌을 많이 받음
  • road scene segmentation이라는 새로운 데이터셋에서 평가했다는 점
  • 도로, 차량, 사람 등 객체들간의 관계를 이해하는 것이 중요하다고 언급했는데 이에 대한 해석이 부족함
  • decoder단에서 튜닝하기 위한 노력은 좋으나 제안하는 방법이 그만한 메리트가 있는가
  • u-net의 history를 알고 가는 점
Comments