Segmentation Model(Deconv,SegNet,Unet,DeepLabV1,DilatedNet) 소개

Date:


FCN 한계점


  • 객체 크기에 따른 한계점
    • 클경우 : 직역적인 정보만으로 예측

    image

    • 작을 경우 : 무시됨

    image

  • 해상도가 떨어짐(디테링한 부분들이 사라지는 문제 발생
    • Skip connection을 적용했지만, Deconvolution 절차가 간단해 경계 학습하기 어려움

image


Decoder를 개선한 Model

DeconvNet(2015)

  • 해당 논문에서 FCN의 문제는 bilinear interpolation upsampling에 문제가 있다고 생각, 이 문제를 해결하기 위해서 Unpooling 방법을 제안함


Architecture

image

image

  • Decoder를 Encoder와 대칭 모양으로 구성함
  • Encoder : ConvNet은 VGG16을 사용, Conv-Batch Normalization-ReLU로 구성되어 있고, 13개의 층으로 구성함
  • Decoder : Encoder와 대칭형태로 unpooling(디테일한 경계를 찾음), Deconvolution(Transposed convolution, 전반적인 형태를 찾음)로 구성되어 있음
  • Layer깊이에 따라 Feature map에서 뽑아낼 수 있는 물체의 정보가 다른데, Unpooling과 Deconv를 반복적으로 수행함으로써 물체의 구체적인 모습과 전반적인 형태를 모두 잡아낼 수 있도록함
    • 얕은 층 : 전반적인 모습을 잡아냄
    • 깊은 층 : 구체적인 모습을 잡아냄

image

  • Unpooling의 경우 Example-specific 한 구조를 잘 잡아냄
    • 자세한 구조
    • 아래 이미지에서 보면 특징이 있는 부분을 작게 잡아냄
  • Transposed Conv의 경우 Class-specific 한 구조를 잘 잡아냄(아래 이미지에서
    • Unpooling으로 비워진 공간을 메꿔줌

image


Unpooling

  • 기존 Upsampling방식의 문제점은 Encoder에서 Max pooling을 통한 receptive field늘려나가면서 정확한 위치정보가 지워지는 현상이 발생
  • FCN에서는 bilinear interpolation 방식으로 사용, 이 경우 하나의 위치정보가 여러 지역으로 나눠지며 blur 효과가 일어남
  • Unpooling은 Max pooling시 뽑은 위치 정보를 저장해 뒀다가 Upsampling시에 활용하는 방법

image

  • Encoder에서 Max pooling을 진행 시 Max를 뽑아낸 위치 정보를 기록해 뒀다 Unpooling시 활용하여 Pooling시 뽑은 위치에 다시 Max값만 복원시키는 방식
  • 다른 곳은 0으로 채워넣게 되는데, 이때 Sparse한 Activation map이 나오게 되는데, 이부분을 Transposed Convolution으로 보완해줌
  • Pooling의 경우 노이즈를 제거하고 연산량을 줄여주는 역할을 했지만 Segmentation Task에서는 Pooling으로 경계에 대한 정보를 잃게됨


Deconvolution(Transposed Convolution)

  • Unpooling으로 Sparse해진 Activation map을 보완해줌으로써 전반적인 형태를 잡아줌

image

FCN vs DeconvNet

  • FCN의 경우 특징이 뭉게지는 현상이 보이지만, DeconvNet은 좀 더 구체적인 모습을 잡아내는 것을 확인할 수 있음

image


구현

  1. Convolution & Deconvolution : 대칭 구조로 똑같은 형식으로 구현

image

  1. max indices : Unpooling시 Max pooling에서 저장한 indices를 불러와서 연산해줌

image



SegNet(2016)

  • 성능적인 향상보다는 속도적인 향상을 꾀한 모델로 Real time Semantic Segmentation Task를 가능하게 한 모델
  • Road Scene Understanding application 분야에서 발전하게됨
  • 자율주행에 있어서 차량, 도로, 차선, 건물, 보도, 하늘, 사람 등의 Class를 빠르고, 정확하게 구분하는 특징이 있음
  • 자율주행 중 배경이 변한뒤 예측하는건 의미가 없음


DeconvNet vs SegNet

  • 두 모델 모두 동일하게 VGG 16을 사용하였지만, SegNet의 목적상 속도를 빠르게 하기 위해서 DeconvNet의 중간 FC Layer로 7x7,1x1 Conv,Deconv 영역을 제거하여 연산량을 줄여줬음
  • Decoder에서 DeconvNet은 Deconvolution을 사용하였지만, SegNet의 경우 Convolution연산으로 대체됨

image

image




Skip Connection 적용한 모델

  • 이전 layer의 정보를 활용하여 물체의 전반적인 부분을 구분할 수 있도록 하는 방법
  • FCN-32, FCN-16, FCN-8로 Skip Connection 수를 늘릴 수록 성능이 향상되었음


FC DenseNet

  • DenseNet에 Skip Connection을 적용
  • DenseNet을 Backbone으로 Encoder, Decoder를 구성하였음
  • FCN의 Skip Connection과 다르게 Summation이 아닌 concatenation하여 Layer정보를 전달해줌

image


Unet

  • Skip Connection 4개,,

image




Receptive Field 확장

Recpetive Field

  • 뉴런이 얼마 만큼의 영역을 바라보고 있는지 나타냄
  • Class를 구분한다고 했을때, 어떤 부분만 보는것 보다는 물체의 전체 영역을 봐야 더 정확하게 구분할 수 있음

image

  • 아래 버스의 경우도 Receptive field가 작아 버스 전체를 보지 않고 부분으로 나눠서 보기 때문에 정확도가 떨어지게됨

image

  • Receptive Field를 넓히는게 detection, segmentation Task에서 중요함


Receptive Field 넓히기(Maxpooling)

  • Conv layer를 통해서 Receptive Field를 조정할 수 있음
  • 초기 딥러닝 모델의 AlexNet의 경우 11x11 Conv를 사용하였었지만, Parameter 수가 기하급수적으로 많아져서 요즘은 3x3 Conv를 사용하여 Layer를 깊게 쌓는 모델이 많음
  • 결국 Layer가 많아지면 모델이 무거워짐
  • 간단하게 Conv layer사이에 pooling을 넣어주면 Receptive field를 넗힐 수 있음

image

  • 하지만 Max pooling을 반복하다보면 Low Feature Resolution을 가지는 문제가 발생함


Receptive Field 넓히기(Dilated Convolution)

  • 기존 Max pooling의 단점인 Resolution 문제를 해결하기 위해 고안됨
  • 이미지 크기를 보존하고, 파라미터수도 비슷하게 Receptive Field만 넓히는 방법

image

  • Parameter의 수는 9개로 동일하지만, 바라보는 영역은 기본 Convolution(3x3)대비, Dilated Convolution(5x5)로 동일한 것을 확인할 수 있음
  • Dilated Conv의 kernel은 9개의 weight와 비어있는 중간을 0으로 채운 형태임
  • Dilated Conv의 0으로 채워진 부분이 있어서, Max pooling + Conv와 비슷하게 생각했지만 Max pooling을 하면 4칸중 한칸의 정보만 가져오게 되지만, Dilated conv는 4개의 정보를 모두 사용하기 떄문에 Max pooling + Conv 보단 해상도가 덜깨짐


DeepLabV1

image

DeepLabv1 (backbone:VGG)의 구조

conv1 : "conv→relu→conv→relu→3x3 maxpool(stride=2,padding=1)" 이미지 크기 input의 1/2
conv2 : "conv→relu→conv→relu→3x3 maxpool(stride=2,padding=1)" 이미지 크기 input의 1/4
conv3 : "conv→relu→conv→relu→conv→relu→3x3 maxpool(stride=2,padding=1)" 이미지 크기 input의 1/8
conv4 : "conv→relu→conv→relu→conv→relu→3x3 maxpool(stride=1,padding=1)" 이미지 크기 input의 1/8
conv5 : "conv(r=2)→relu→ conv(r=2) →relu→ conv(r=2) →relu→3x3 maxpool(stride=1,padding=1)" 이미지 크기 input의 1/8
FC6,FC7,Score : "conv(r=12)→relu→dropout→conv(1x1)→relu→dropout→conv(1x1,Classifier)"
Bilinear Interpolation : 1/8  이미지를 선형적으로 8 키워 원본 사이즈로 복원
  • 3x3 Max pooling 사용 : FCN의 경우 2x2를 사용하여 1/2로 줄이는 연산을 진행하였지만, DeepLabv1의 경우 3x3 Max pooling에 Stride 2를 적용하여 1/2로 줄여줌
  • Conv5 Layer에서는 Dilated Conv에 rate=2 사용하여 Receptive Field를 넓힘
  • FC6 Layer에서는 Dilated Conv에 rate=12 사용하여 Receptive Field를 넓힘
  • Upsampling의 경우 Bilinear Interpolation을 진행


Bilinear Interpolation

image


Dense CRF(Conditional Random Field)

  • Bilinear Interpolation의 경우 빈공간을 선형적으로 채워나는데, 이럴경우 Pixel 단위의 정교한 Segmentation이 불가능하게 됨
  • 이를 보완하기 위한 방법으로 Dense CRF 알고리즘을 사용함

image

  • 사용 방법은 원본 이미지와, 예측한 segmentation(pixel의 확률)결과를 사용하여 후처리하는 방식

image

  • 알고리즘 원리
    • 색상이 유사한 픽셀이 가까이 위치하면 같은 범주에 속함
    • 색상이 유사해도 픽셀의 거리가 멀다면 같은 범주에 속하지 않음
  • Dense CRF의 경우 논문에서는 10회 정도 사용하게됨

image


DilatedNet

image

DilatedNet (backbone:VGG16) 구조 (Front)
conv1 : "conv→relu→conv→relu→2x2 maxpool(stride=2,padding=0)" 이미지 크기 input의 1/2
conv2 : "conv→relu→conv→relu→2x2 maxpool(stride=2,padding=0)" 이미지 크기 input의 1/4
conv3 : "conv→relu→conv→relu→conv→relu→ 2x2 maxpool(stride=2,padding=0)" 이미지 크기 input의 1/8
conv4 : "conv→relu→conv→relu→conv→relu"` DeepLabv1의 Maxpooling영역 제거 
Conv5 : "conv(r=2)→relu→ conv(r=2) →relu→ conv(r=2)→relu" paddin을 조정해 Dilated conv이후에도 이미지 크기 변화 없음
FC6~Score : "conv(7x7,r=4,padding=12)→relu→dropout→conv(1x1)→relu→dropout→conv(1x1,Classifier)"
Deconv: "convTransposed2d(num_classes, num_classes, karnel_size=16, stride=8, padding=4)" 1/8  이미지를 선형적으로 8 키워 원본 사이즈로 복원
  • 2x2 Max pooling 사용 : DeepLabv1의 경우 3x3를 사용하여 1/2로 줄이는 연산을 진행하였지만, DilatedNet에서는 2x2 Max pooling을 사용함
  • Max pooling 제거 : DeepLabv1에서 Conv4,5 Layer의 Max pooling 부분이 DilatedNet에서 빠짐
  • FC6 Layer에서는 7x7 kernel size의 Dilated Conv에 rate=4 사용하여 Receptive Field를 넓힘
  • Upsampling의 경우 Transposed Convolution을 이용함


DilatedNet - Basic Context Module

image

  • Front 뿐만 아니라 성능을 개선하기 위한 Basic Context Module를 추가함
  • 단순히 Dilated Conv 8개로 이뤄져있고
  • Score 이후 추가적으로 연결하여 사용함
  • 여러 크기의 Dilated Conv를 사용하여 여러 Receptive Field를 생성하여 이미지의 작은 물체부터 큰 물체까지 구분할 수 있도록함
Basic Context Module : 
"conv(r=1)→relu→conv(r=1)→relu→conv(r=2)→relu→conv(r=4)→relu→conv(r=8)→relu→conv(r=16)→relu→conv(r1)→relu→conv(1x1,Classifier)"

image



📌reference


💡 수정 필요한 내용은 댓글이나 메일로 알려주시면 감사하겠습니다!💡 

댓글