관리 메뉴

TEAM EDA

Deconvolutional Network (DeconvNet) 본문

EDA Study/Image Segmentation

Deconvolutional Network (DeconvNet)

김현우 2021. 9. 21. 14:43

Deconvolutional Network (DeconvNet)

DeconvNet은 2015년도 CVPR에 소개된 논문으로 FCN의 한계를 극복한 논문입니다. FCN의 경우에는 큰 Object와 작은 Object를 구분을 못하는 문제가 있었습니다. 논문에서는 이를 고정된 Receptive Field를 가지는 Convolution과 단순한 Deconvolution 구조때문이라고 표현합니다. 이를, 해결하기위해서 Encoder-Decoder 구조를 통해서 해결하려고 하는데, 어떤식으로 네트워크가 발달되었는지 한번 살펴보도록 하겠습니다.

Abstract

  • 기존의 Fully Convolutional Network가 가지고 있는 한계점을 극복하기위해 Layer를 더 깊게 쌓음으로서 Deconvolution 구조를 복잡하게 사용합니다.

  • unpooling layers에서 Maxpooling 과 Transposed Convoltuion을 같이 도입하면서, Maxpooling은 디테일한 부분을 Transposed Convolution은 내부의 값을 채우는 작용을 합니다.

  • 두가지의 Contribution을 통해서, 성능적인 측면에서도 SOTA를 달성하고 특히 작은 Object와 큰 Object도 잘 맞추는 효과가 생겼습니다.

Fully Convolutional Networks의 한계

기존의 FCN은 아래의 한계점을 보유하고 있습니다.


네트워크는 기존에 정의된 고정된 Receptive field를 가집니다. 그렇기에 object의 크기가 receptive field 대비 크거나 작은 경우에 대해서 잘 못맞추는 경향을 보이는 문제가 있습니다.

figure1

위의 그림을 한번 살펴보면, Object size가 큰 경우에 대해서 어떤 문제가 나오는지 확인이 가능합니다. 버스를 분류할때, 버스 전체를 보는 것이 아니라 앞면, 유리 등 부분적인 특징을 가지고 분류를 하게되고, 그로인해서 유리창에 비친 자전거의 모습을 보고 자전거 등으로 분류되는 걸 확인할 수 있습니다.


마찬가지로 작은 Object에 대해서도 동일한 문제가 생깁니다. 다음과 같이 작은 사람들의 경우 예측 자체가 아예 안되는 것을 확인할 수 있습니다.

figure2

이는 고정된 Receptive Field도 있지만, (b)는 Maxpooling과 Convolution에 의한 문제입니다. Maxpooling의 5개 연산과 Convolution으로 크기가 줄어들고 그 과정에서 정보의 손실이 발생하기에 크기가 작은 사람의 경우는 정보의 손실이 많이 발생합니다. 이를 해결해주기위해서 FCN에서는 Skip Connection을 적용해서 FCN16s, 8s을 사용해서 Maxpooling에 의해서 정보가 손실되기전의 특징맵을 활용하는 모습을 보였습니다. 하지만, 이는 성능적으로 아직 불충분한 모습이 있습니다. 그로인해, 디테일한 모습보다는 포괄적인 모습으로 나오고 다음과 같이 강아지와 자전거의 디테일함이 없는 것을 확인할 수 있습니다.

image-20210921135947678

Deconvolutional Network의 구조

Architecture

figure3

DeconvNet의 구조는 크게 Convolution network 부분가 Deconvolution network 부분으로 나뉘고, 둘이 대칭인 모습을 보이고 있습니다. 각 부분의 특징을 한번 생각해보면 Convolution은 input image의 feature를 추출해서 multidimensional feature representation으로 변환하는 역할을 수행합니다. 이때, 위의 구성은 VGG 16-layer net에서 마지막 classification layer를 제거한 형태입니다.

이를, 좀 더 편한 그림으로 살펴보면 다음과 같습니다.

image-20210921140804577

이때, 하나의 Convolution 부분은 Conv-BN-ReLU 형태로 구성되어있습니다.

nn.Sequential(
    nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding),
    nn.BatchNorm2d(out_channels), 
    nn.ReLU()
)

이후, Deconvolution Network 부분은 살펴보면, Convolution network으로부터 추출된 특징을 가지고 세그멘테이션을 수행하는 형태입니다. 보면, Deconv와 Unpooling 두가지로 구성이 됩니다. Deconv는 이전에 FCN에서 본 것처럼 Transposed Convolution으로 진행이 됩니다. 그리고 Unpooling은 Pooling의 반대되는 연산을 수행합니다.

image-20210921141236487

다음과 같이 Pooling에 의한 연산을 거꾸로해서, Maxpooling시에 인덱스 부분을 기록했다가 해당 부분을 복원하는 것으로 볼 수 있습니다. 이는 Pooling의 경우 노이즈를 제거하는 장점이 있지만, 그 과정에서 정보가 손실되는 문제가 생기는 문제를 방지하는 것으로 생각할 수 있습니다. 이는 2가지 장점이 있습니다.

  • Unpooling을 통해서 Pooling시에 지워진 경계에 정보를 기록했다가 복원가능합니다.
  • 학습이 필요 없기 때문에 속도가 빠릅니다.

하지만 sparse한 activation map을 가지기 때문에 이를 채워 줄 필요가 있고 이를 채워줄 필요가 있습니다. 이를, 논문에서는 Transposed Convolution을 통해서 수행합니다.

nn.Sequential(
    nn.ConvTransposed2d(in_channels, out_channels, kernel_size, stride, padding),
    nn.BatchNorm2d(out_channels), 
    nn.ReLU()
)

이 과정을 한번 그림으로 살펴보도록 하겠습니다.

figure5

Deconvolution Network의 Deconvolution과 Unpooling에 의해서 활성화된 activation map을 보면 두가지의 특징을 가집니다.


첫째, (b), (d), (f), (h), (j)와 같은 Deconvolution의 결과는 dense하고 (c), (e), (g), (i)와 같이 Max unpooling의 결과는 sparse 합니다. Unpooling의 경우 “example-specific”한 구조를 잡아내고 (자세한 구조를 잡아냄) Transposed Conv의 경우 “class-specific”한 구조를 잡아냅니다. (위의 구조에 빈 부분을 채워넣음)

image-20210921142058591

둘째, lower layer은 전반적인 특징 (location, shape, region)을 잡는 반면 higher layer는 복잡한 패턴을 잡습니다.

figure6

결국, 위의 그림과 같이 FCN에 비해 디테일한 모습이 많이 살아나는 장점을 보입니다.

Training

Batch Normalization

  • DNN은 Internal-covariate-shift 때문에 최적화하기 어렵고, 이를 해결하기 위해서 batch normalization을 적용합니다.
  • 모든 layer는 표준 정규분포을 통해서 정규화됩니다.

Two-stage Training

  • 비록 normalization에 의해 local optimal를 탈출하는데 도움을 주지만, semantic segmentation의 공간은 학습 데이터의 수에 비해서는 크고 instance segmentation을 수행하는 deconvolution의 장점은 사라집니다.
  • 이를 방지하기 위해서, 2 stage의 학습을 진행합니다.
    • 1 stage에서는 쉬운 예제로 train하고 2 stage는 보다 어려운 데이터로 학습을 진행합니다.
    • 1 stage의 쉬운 예제는 object proposals 알고리즘으로 객체가 있을많나 영역을 자르고, 실제 정답 object를 crop하여 이를 중앙으로 하는 bounding box를 만듭니다.
    • 2 stage는 1 stage에서 잘라낸 이미지들 중 실제 정답을 crop하기 전에 실제 정답과 잘 겹치는 것들을 활용하여 2차 학습을 진행합니다. (실제 정답만 사용하는게 아니라 Iou가 0.5이상인 후보군을 전부 사용)
  • 일반적인 이미지 분류는 테스크가 쉽지만, Segmentation은 픽셀단위의 분류를 하기에 Optimal을 찾는 과정이 더 어렵고 local optimal을 탈출하기가 어렵습니다.
    • 그렇기에, 1stage에서는 하나의 객체만 포함하도록 해서 쉬운 테스크를 진행하고 2stage에서는 좀 더 어려운 이미지로 학습을 진행합니다.
  • https://www.facebook.com/groups/TensorFlowKR/permalink/1358930397781348/

Inference

  • DeconvNet은 개별의 instance에 대해서 semantic segmentation을 수행합니다.
  • 개별 instance를 생성하기 위해 input image를 window sliding을 통해서 충분한 수의 candidate proposals를 만듭니다.
  • 이후, 이에 대해 semantic segmentation을 수행하고 proposals에 대해서 나온 모든 결과를 aggregate해서 전체 이미지에 대한 결과를 생성합니다.
  • 추가적으로, FCN과 앙상블시에 성능이 향상됩니다.

Aggregating Instance-wise Segmentation Map

  • 몇몇 Proposals는 부정확한 예측을 가지고 있기에, aggregation동안에 suppress 해줍니다.
  • Pixel-wise Maximum or average를 통해서 충분히 robust한 결과를 만듭니다.
  • 이후, output map에 fully-connected CRF를 적용합니다.

Ensemble with FCN

  • DeconvNet은 fine-details를 잘 잡는 반면에, FCN은 overall shape를 추출하는데 강점을 가지고 있습니다.
  • instance wise prediction은 object의 various scales을 다루고, FCN은 coarse scale에서의 context를 잡는데 강점이 있습니다.
  • 둘을 독립적으로 시행후에 Ensemble 하고, CRF를 적용하면 가장 좋은 결과가 나옵니다.

Experiments

  • PASCAL VOC 2012 segmentation dataset과 Microsoft COCO 으로 실험한 결과 아래와 같이 좋은 결과를 얻습니다.

figure7

  • Optimization은 SGD를 이용하고, learning rate, momentum, weight decay는 각각 0.01, 0.9, 0.0005으로 설정. ILSVRC 데이터셋으로 pre-trained된 모델을 사용했으며 deconvolution networks는 zero-mean Gaussians으로 initialize 함. 또한, drop out을 제거하고 batch normalization을 활용합니다.

  • 또한, proposals의 수를 늘릴 수록 결과가 좋아지는 것을 볼 수 있습니다.

figure8

Discussion

논문의 주된 목적 자체는 단순했습니다. FCN의 단순한 Deconvolution 과정을 깊게해서 기존에는 못잡았던 디테일함과 크고 작은 Object를 잘 맞추는 과정을 수행합니다. 이를 해주기위해서, 논문에서는 Layer를 깊게해주고 2배씩 키우는 구조를 반복적으로 사용합니다. 이때, Unpooling을 통해서 디테일함을 복원하고, Transposed Convolution을 통해서 내부를 채워주면서 Dense한 맵을 만듭니다. 논문 자체가 그림이 잘 나와서, Unpool과 Deconvolution이 어떠한 차이점을 보이는지 같이 사용하면 어떠한 효과가 있는지 확인이 가능합니다.


하지만, 읽으면서 몇가지의 아쉬움이 있었습니다.

  • 첫째, 논문 자체의 코드를 구현할때 백본 네트워크는 구현이 쉬웠지만 Object를 Proposal해서 다양한 크기에 대해서 예측하는 부분은 구현이 어려웠습니다.
  • 둘째, 네트워크 또한 깊기에 많은 코스트가 드는 문제가 있습니다. 그리고 개인적으로 위의 아이디어가 문제점을 해결하는데 적합한지에 대해서는 의문이 듭니다.
  • 셋째, Unpooling 자체가 object의 디테일한 부분을 잡고, 이전 특징맵의 정보를 가져와서 복원하기에 좋다는 것은 동의합니다. 하지만, Sparse하게 만든 정보는 외각의 경계만 살아있는 정보이고 이를 Transposed Convolution을 통해서 채워넣는 것은 내부의 정보를 너무 활용하지 않는다는 생각이 들었습니다.

다음 글에서는 DeconvNet의 구현을 살펴보도록 하겠습니다.