ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Segmentation] 딥러닝을 이용한 Segmentation FCN
    CS 공부/AI 2023. 6. 6. 17:17

    요약

    1. VGG 네트워크 backbone을 사용하여 feature 추출
    2. VGG 네트워크의 FC layer을 Convolution으로 대체
    3. Transposed Convolution을 이용해서 pixel wise prediction 수행

     

    Fully Connected Layer vs Convolution Layer


    FC layer을 Convolution layer로 대체하였을 때의 장점

    • FC layer은 flatten 이후에 fc layer을 적용하기 때문에 각 픽셀의 위치정보를 해침
    • Convolution layer은 각 픽셀의 위치정보를 해치지 않은채로 특징을 추출
    • 1x1 convolution을 사용하면 kernel의 파라미터에 의해 영향을 받고, 이미지 혹은 layer 크기와 상관없이 학습됨
      • height, width와 상관이 없음
      • nn.Conv2d(input_channel, output_channel, kernel_size, ..) -> 항상 학습 가능
      • nn.Linear(input_channel * height * width, output_size) ->  height, width  안맞으면 학습 불가

     

    Transposed Convolution


    • 입력 이미지를 Upsampling하는 방법 중 하나 (Deconvolution)
    • Transposed Convolution의 값은 이전 Convolution의 값과 동일한 값이 아니라 Convolution처럼 학습이 가능한 값으로 Backpropagation 과정에서 Update되는 값
    • 중요한 점은 Convolution과 마찬가지로 학습 가능한 파라미터를 통해서 줄어든 이미지를 다시 키우는 Convolution이라는 점

     

    • Transposed Convolution으로 불리는 이유는 Convolution을 transpose하여 연산하기 때문이다

    convolution을 transpose하고 2x2 input을 flatten하여 연산한 것과 같음

     

    FCN에서 성능을 향상시키기 위한 방법


    • FC6 layer의 Convolution을 지나면, 이미지 크기가 1x1로 변동되는 문제 발생
    • 우선, 편의상 FC6 layer에 1x1 conv 적용한 것을 설명
    • FC6 layer(7x7 Convolution)을 적용했을 때 발생하는 이슈
      • FC6을 지나면 이미지의 크기가 변동되기 때문에 이 문제를 해결하기 위해 conv1의 첫번째 Conv에 zero padding=100을 넣어줌으로써 input size 키워주었는데 이렇게 되면 input=224x224, output=256x256으로 사이즈가 다름
      • 따라서 conv1의 첫번째 Conv에 padding을 주고 마지막에 Crop함 (기존 transposed convolution에 있는 padding은 모두 제거)

     

    FCN 구조

    •  conv block 한개는 Conv-ReLU-Conv-ReLU-Max pooling으로 구성됨
    • FC6
    self.fc6=CBR(512,4096,1,1,0)
    self.drop6=nn.Dropout2d()
    • FC7
    self.fc6=CBR(4096,4096,1,1,0)
    self.drop6=nn.Dropout2d()
    • Score / Upscore (stride=32)
      • 32배나 키우면 정보가 소실되는 문제를 어떻게 해결해야할까? => Skip-connection
    self.score_fr=nn.Conv2d(4096,num_classes,1,1,0)
    self.upscore32=nn.ConvTranspose2d(num_classes,num_classes,kernel_size=64,stride=32,padding=16)

     

     

    FCN에서 성능을 향상시키기 위한 방법

    1. Max Pooling에 의해서 잃어버린 정보를 복원해주는 작업을 진행
    2. Upsampled Size를 줄여줘 좀 더 효율적인 이미지 복원이 가능

    Score과 Upscore(x2)의 summation 진행하려면 채널의 크기가 같아야 함. 1x1 conv로 채널의 크기를 맞추고,Crop image를 통해 이미지의 크기를 통일시킴

     

    평가지표


    pixel 단위로 계산
    클래스별 GT와 Predict의 교집합/합집합의 평균

     

Designed by Tistory.