FCN model - transpose convolution

Date:


FCN Fully Convolutaional Network

  • VGG 네트워크 백본을 사용(Feature Extracting Network)
    • Feature Extracting Network(backbone) : VGG, AlexNet, ResNet, EfficienctNet
  • VGG 네트워크의 FC Layer(nn.Linear)를 Convolution으로 대체
  • Transposed Convolution을 이용하여 Pixel Wise Prediction을 수행함

image

image

  • 백본으로 VGG를 사용하는 이유!
    • pretrained 된 모델을 그대로 사용할 수 있음 -> 원래는 가중치를 새로 학습시켜야함
    • 여러 parameter tuning에 들어가는 자원을 아낄 수 있음

FC Layer vs FCN

  1. 위치정보 보존
    • Fully Connected Layer의 경우 위치 정보가 지워지나
    • FCN의 경우 위치정보가 그대로 남아있음

image

image

  1. 입력 Size
    • FC Layer의 경우 정해진 Input Size가 정해져 있음
    • FCN의 경우 Input Size와 상관없이 학습 및 inference가 가능함

Transposed Convolution

  • Maxpooling으로 인해서 Feature map의 w,h의 사이즈가 작아지게 되는데, 우리가 원하는 output은 image의 원본 사이즈이기 때문에 upsampling하는 과정이 필요한데, 이 연산을 도와주는게 Transposed Convolution
  • Transposed Convolution의 연산도 Convolution과 동일하게 Kernel을 학습하여 사용하게 됨(Backprobagation과정으로 update됨)

❓ 왜 Transposed Convolution이라고 부를까?

  • 사이즈를 키운다는 의미로 upsampling, deconvolution, transposed convolution등 여러가지 용어로 설명하게 되는데, deconvolution이란 단어는 맞지 않다고 하는 사람들도 있음
  • Transposed Convolution 계산 방법

image

  • Transpose Convolution이라고 불리는 이유는 Convolution 연산을 Transposed한 형태와 동일한 연산 결과를 얻을 수 있음

image

  • Transposed Convolution의 경우 완벽한 Convolution를 되돌리는 연산이 아니기 때문에Deconvolution란 용어는 잘못된 표현이지만, 여러 논문이나 설명하는 글에서 혼용하여 사용하고 있음

Transposed Convolution의 Stride와 Padding 방법

  • Stride

image

  • Padding : 연산을 진행하여 나온 결과에 Padding을 진행함

image


📰code

import torch
import torch.nn as nn

x = torch.randn([1, 3, 3, 3])
print(nn.ConvTranspose2d(3, 3, kernel_size=2, stride=1, padding=0)(x).size())
print(nn.ConvTranspose2d(3, 3, kernel_size=2, stride=1, padding=1)(x).size())
print(nn.ConvTranspose2d(3, 3, kernel_size=3, stride=1, padding=0)(x).size())
print(nn.ConvTranspose2d(3, 3, kernel_size=3, stride=1, padding=1)(x).size())
print(nn.ConvTranspose2d(3, 3, kernel_size=2, stride=2, padding=0)(x).size())

🔍result

torch.Size([1, 3, 4, 4])
torch.Size([1, 3, 2, 2])
torch.Size([1, 3, 5, 5])
torch.Size([1, 3, 3, 3])
torch.Size([1, 3, 6, 6])


모델 구조

image

FCN(backbone:VGG)의 구조
conv1 : [conv→relu→conv→relu→maxpool] 이미지 크기 input의 1/2로 감소
conv2 : [conv→relu→conv→relu→maxpool] 이미지 크기 input의 1/4로 감소
conv3 : [conv→relu→conv→relu→conv→relu→maxpool] 이미지 크기 input의 1/8로 감소
conv4 : [conv→relu→conv→relu→conv→relu→maxpool] 이미지 크기 input의 1/16로 감소
conv5 : [conv→relu→conv→relu→conv→relu→maxpool] 이미지 크기 input의 1/32로 감소
FC6 : [conv(1×1)→relu→dropout]
FC7 : [conv(1×1)→relu→dropout]
score : [conv(input_channel, num_classes,1,1,0)]
upscore : [convTransposed2d(num_classes, num_classes, karnel_size=64, stride=32, padding=16)] 
        1/32가 된 이미지를 32배 키워 원본 사이즈로 복원
  • 결국 Upsampling으로 인한 문제로 해상도가 낮음, 이를 해결하기 위해 low level의 feature map을 가져와 합치는 작업을 진행하여 성능을 향상 시킴

image

📌reference

  • boostcourse AI tech


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

댓글