Boostcamp AI Tech

[Boostcamp Day-28] Computer Vision - Semantic Segmentation

ju_young 2021. 9. 9. 18:06
728x90

Fully Convolutional Networks(FCN)

  • FCN은 end-to-end의 구조(처음부터 끝까지 미분가능한 neural network)를 가지는 첫 semantic segmentation이다.
  • 임의의 사이즈를 입력으로 넣고 입력값에 해당되는 segmentation map이 출력된다.

  • Fully connected layer : 고정된 vector값이 출력되어 spatial coordinate가 삭제된다.

  • Fully convolutional layer : spatial coordinate가 유지된 classification map이 출력된다.

  • FCN 연산

기존의 FC layer는 다음과 같이 Flattening을 통해 하나의 feature vector를 생성하였다. 하지만 공간에 대한 정보가 사라지는 문제가 발생하게 된 것이다.

그래서 해당 feature map에서 채널 축을 기준으로 Flattening을 수행하는 방법이 나왔고 이 방법을 바로 1x1 convolution으로 해결했다.

하지만 이러한 방법은 매우 작은 해상도의 score map을 가지게된다. 작아진 score map을 다시 키우기 위해 바로 upsampling이라는 방법을 사용한다.

  • Upsampling 
    • Unpooling
    • Transposed convolution
      • Transposed convolution 방법을 사용하면 uneven overlap(불균등한 오버랩)이 발생하는데 이 uneven overlap이 checkerboard artifact로 이어진다.
      • uneven overlap은 kernel 사이즈가 stride에 나누어 떨어지지 않을 때 발생한다.
    • Upsample and convolution
      • Transposed convolution의 overlap 문제를 피하기 위해 upsampling과 convolution을 분리하여 사용하는 방법이 나왔다.
      • 먼저 Nearest-neighbor (NN), Bilinear와 같은 interpolation을 사용하여 해상도를 키우고 convolution을 적용하여 학습이 가능하게 만들어주는 것이다.
  • enlarging score map

중간 단계의 feature map을 사용하는 정도에 따라 다음과 같은 결과가 나온다.

FCN은 손으로 만든 알고리즘에 의존하는 것이 아닌 end-to-end architecture를 사용하여 모두 neural net으로 구성되어 있기에 gpu를 사용한 병렬처리가 가능하여 빠르다. 또한 모델이 전반적으로 해당 task에 대해 학습되기 때문에 성능이 좋고 low level feature와 high level feature를 모두 고려하여 더 좋은 경계선을 찾는다.

Hypercolumns for object segmentation

낮은 layer와 높은 layer의 특징을 해상도를 맞추고 합쳐서 쓰는 방법이다. 하지만 이전의 end-to-end가 아니다. 다른 third party 알고리즘을 적용하여 바운딩 박스를 추출한 뒤에 적용하는 모델이다.

U-Net

  • fully convolutional networks이다.
  • FCN의 skip connection과 비슷하게 낮은 레이어와 높은 레이어를 잘 결합하는 방법을 제시하였다.
  • FCN보다 더 정교한 segmentation 결과를 얻는다.
  • Overall architecture
    • 대칭되는 feature map을 가져오는 skip connection을 사용하여 upsampling을 수행한다.

  • feature map이 홀수일 경우 다음과 같이 downsample과 upsample에서 해상도 차이가 난다.

  • Overlap-tile strategy

큰 이미지를 겹치는 부분이 있도록 일정크기로 나누고 모델의 Input으로 활용한다.

https://joungheekim.github.io/2020/09/28/paper-review/

  • Mirroring Extrapolate

이미지 경계에 위치한 이미지를 복사하고 좌우 반전을 통해 Mirror 이미지를 생성한 후 원본 이미지의 주변에 붙여 Input으로 사용한다. 논문에서는 biomedical 분야로 실험했고 대칭구도를 이루는 경우가 많은 세포 때문에 Mirroring 전략을 사용했을 것이라는 추측이 있다.

https://joungheekim.github.io/2020/09/28/paper-review/

DeepLab

  • Conditional Random Fields (CRFs) : pixel과 pixel과의 관계를 모두 이어주고 regular한 그리드를 그래프로 본 것이다.

  • Dilated convolution(Atrous convolution)

Dilated convolution의 경우 weight 사이를 한 칸씩 띄어서 실제 convolution kernel보다 더 넓은 영역을 고려할 수 있게 만든다. 이 때 paramter 수는 늘어나지 않는다.

[상]일반적인 Convolution [하]Atrous Convolution

위에서처럼 receptive field를 넓히는 이유는 일반적인 classification과는 달리 semantic segmentation은 픽셀 단위의 조밀한(dense) 예측이 필요하기 때문이다. 따라서 Deeplab에서는 Atrous convolution을 이용하여 receptive field를 확장시키는 효과를 얻었다.

  • Depthwise separable convolution

deeplab의 경우 입력 해상도가 크기 때문에 연산이 오래걸린다. 따라서 이런 연산을 줄이기위해 Atrous convolution과 Depthwise separable convolution를 결합하여 사용한다.

https://coding-yoon.tistory.com/122

Depthwise separable convolution는 각 채널별로 convolution을 수행하여 값을 뽑고 1x1 convolution을 수행하여 하나의 값을 뽑는 방법으로 분리하여 계산하는 방법이다.

https://coding-yoon.tistory.com/122

class depthwise_separable_conv(nn.Module): 
    def __init__(self, input_dim, output_dim): 
        super(depthwise_seperable_conv, self).__init__() 
        self.depthwise = nn.Conv2d(input_dim, input_dim, kernel_size=3, padding=1, groups=input_dim) 
        self.pointwise = nn.Conv2d(input_dim, output_dim, kernel_size=1) 
        
    def forward(self, x): 
        x = self.depthwise(x) 
        x = self.pointwise(x) 
        return x
728x90