오늘의 인기 글
최근 글
최근 댓글
Today
Total
12-28 07:00
관리 메뉴

우노

[DL] Semantic Segmentation (FCN, U-Net, DeepLab V3+) 본문

AI/Deep Learning

[DL] Semantic Segmentation (FCN, U-Net, DeepLab V3+)

운호(Noah) 2021. 3. 19. 15:46

Semantic Segmentation이란?

  • Semantic Segmentation 은 컴퓨터비젼 분야에서 가장 핵심적인 분야 중 하나이며,
  • 위 그림처럼, 이미지 내에 있는 물체들을 의미 있는 단위로 분할해내는 것입니다.
  • 더 구체적으로는 아래 그림처럼, 이미지의 각 픽셀이 어느 클래스에 속하는지 예측하는 것입니다.

  • Semantic Segmentation은 다른 컴퓨터비젼 문제들과 마찬가지로, Deep Convolution Neural Network (깊은 신경망)을 적용해서 많은 발전을 이루었습니다.
  • 이번 포스트에서는 Semantic Segmentation 에 대해서 자세히 설명하고, 자주 활용되는 몇가지 접근방법을 알아보겠습니다.

Semantic Segmentation의 의미와 목적

  • Semantic Segmentation 의 의미와 목적에 대해 알아보겠습니다.

  • 우선, 컴퓨터 비젼에서 가장 많이 다뤄지는 문제들은 아래와 같은 것들이 있습니다.

    • Classification (분류)
      • 인풋에 대해서 하나의 물체를 구분하는 작업
      • LeNet, AlexNet, VGG Nets, GooLeNet, ResNet, Xception 등의 모델
    • Object Detection (객체 탐지)
      • 물체를 구분함과 동시에, 그 물체가 어디에 있는지까지 Boxing하는 작업
      • RCNN, Fast RCNN, Faster RCNN, SPP Net, YOLO, SDD, Attention Net 등의 모델
    • Segmentation (분할)
      • 모든 픽셀에 대해, 각 픽셀이 어떤 물체의 class인지 구분하는 작업
      • FCN, DeepLab, U-Net, ReSeg 등의 모델
  • 따라서, Semantic Segmentation의 목적은 사진에 있는 모든 픽셀을, 해당하는 class로 분류하는 것입니다.

    • 이미지에 있는 모든 픽셀에 대한 예측을 하는 것이기 때문에, dense prediction 이라고도 불립니다.
  • 또한, Semantic Segmentation은 두 가지로 나뉩니다.

  • 바로, Semantic Segmentation과 Instance Segmentation입니다.

  • 예제를 통해 자세히 알아보겠습니다.

  • 만약, 위 예제처럼 가족사진이 주어졌을 때,

  • Semantic Segmentation은 오른쪽처럼, 픽셀 단위로 어떤 class인지만 구분하지만

  • Instance Segmentation은 왼쪽처럼, 픽셀 단위로 어떤 class인지 구분한 이후, 동일한 class 내에서도 다른 Instance를 구분합니다.

FCN(Fully Convolutional networks)

  • FCN은 Semantic Segmentation의 대표적인 모델 중 하나입니다.

  • 기존 Classification용 CNN 모델의 문제

    • AlexNet, VGG 등 분류에 자주 쓰이는 깊은 신경망들은, Semantic Segmentation 을 하는데 적합하지 않습니다.

    • 이러한 모델들은 아래 그림처럼, 일반적으로 convolution 층들과 fully connected 층들로 이루어져있습니다.

    • 따라서, 항상 입력이미지를 네트워크에 맞는 고정된 사이즈로 작게 만들어서 입력해줘야합니다.

    • 또한, 이러한 분류용 CNN 모델들은, 물체가 어떤 클래스에 속하는지는 예측해낼 수 있지만, parameter의 개수와 차원을 줄이는 layer들을 가지고 있어서, 자세한 위치정보를 잃게 됩니다.

      • 마지막에 쓰이는 Fully Connected Layer에 의해서 물체가 어디에 존재하는지 예측할 수 없게 됩니다.
    • 물론, 공간/위치에 대한 정보를 잃지 않기 위해서, Pooling 과 Fully Connected Layer 를 없애고 stride와 padding을 1로 설정해, 일정한 Convolution 을 진행할 수도 있을 것입니다.

    • 하지만, 이렇게 진행한다면 인풋의 차원은 보존하겠지만, parameter의 개수가 많아져, 메모리 문제나 계산비용이 너무 많이 들어, 현실적으로는 불가능 할 것입니다.

  • 따라서, 이러한 문제를 해결하기 위해, FCN 모델은 아래 그림처럼 fully connected 층을 1x1 convolution 층으로 바꿨습니다.

    • 이를 통해, 네트워크 전체가 convolution층들로 이루어지게 되며,
    • fully connected 층들이 없어졌으므로, 더 이상 입력 이미지 크기에 제한을 받지 않게 됩니다.
    • 즉, 이제 어떠한 사이즈(H x W)의 이미지든 네트워크에 입력될 수 있습니다.
    • 여러 층의 convolution층들을 거치고 나면, 특성맵(feature map)의 크기가 H/32 x W/32가 되는데, 그 특성맵의 한 픽셀이 입력이미지의 32 x 32 크기를 대표하게 됩니다.
    • 즉, 입력이미지의 위치 정보를 '대략적으로' 유지하고 있는 것입니다.
    • 여기서 중요한 것은, 이 convolution 층들을 거치고 나서 얻게 된 마지막 특성맵의 갯수는, 훈련된 클래스의 갯수와 동일하다는 것입니다.
      • 5개의 클래스로 훈련된 네트워크라면, 5개의 특성맵(heatmap)을 산출해냅니다.
      • 각 특성맵은 하나의 클래스를 대표합니다.
      • 만약, 고양이 클래스에 대한 특성맵이라면 고양이가 있는 위치의 픽셀값들이 높고,
      • 강아지 클래스에 대한 특성맵이라면 강아지 위치의 픽셀값들이 높게됩니다.
  • 이제 FCN 모델의 Architecture에 대해서 더 자세히 살펴보겠습니다.

  • 우선, FCN의 Architecture는 크게 4단계로 나뉩니다.

    1. Convolution Layer를 통해 Feature 추출
    2. 1 x 1 Convolution Layer를 통해, 낮은 해상도의 Class Presence Heat Map 추출
    3. Transposed Convolution 을 통해서, 이 낮은 해상도의 Heat Map을 Upsampling 한 뒤, 인풋과 같은 크기의 Map 생성
    4. Map의 각 pixel class에 따라 색칠 한 뒤, Segmentation 결과 반환
  • 1,2번 과정은 downsampling 단계로, convolution을 통해 차원을 줄이는 단계입니다.

  • 3번 과정은 upsampling 단계로, 1,2번 과정을 통해 만들어진 특성맵(heatmap)의 크기를 원래 이미지의 크기로 다시 복원해주는 단계입니다.

    • 이미지의 모든 픽셀에 대해서 클래스를 예측하는 것이, semantic segmentation의 목적이기 때문입니다.
  • 4번 과정은 upsampling된 특성맵(heatmap)들을 종합해서, 최종적인 segmentation map을 만드는 단계입니다.

    • 간단히 말해서, 각 픽셀당 확률이 가장 높은 클래스를 선정해주는 것입니다.
    • 만약, 클래스가 5개이며, (1, 1) 픽셀에 해당하는 클래스당 확률값들이 강아지 0.45, 고양이 0.94, 나무 0.02, 컴퓨터 0.05, 호랑이 0.21 라면
    • 0.94로 가장 높은 확률을 산출한 고양이 클래스를 (1, 1) 픽셀의 클래스로 예측하는 것입니다.
    • 이런 식으로 모든 픽셀이 어느 클래스에 속하는지 판단합니다.
  • 그런데 단순히 upsampling을 시행하면, 특성맵의 크기는 한 번에 원래 이미지의 크기로 복원되고, 그것들로부터 원래 이미지 크기의 segmentation map을 얻을 수 있지만, 디테일하지 못한 segmentation map을 얻게 됩니다.

    • 1/32만큼 줄어든 특성맵들을 한 번에 32배만큼 upsampling 했기 때문에, 당연히 coarse할 수 밖에 없습니다.
  • 이렇게 한 번에 32배 upsampling하는 방법을 논문에서는 FCN-32s라고 소개하고 있습니다.

  • 아래 그림을 보면, ground truth와 비교해, FCN-32s로 얻은 segmentation map은 많이 뭉뚱그려져 있고 디테일하지 못함을 알 수 있습니다.

  • 따라서, FCN의 개발자들은 좀 더 디테일한 segmentation map을 얻기 위해, skip combining이라는 기법을 제안했습니다.

  • 기본적인 생각은 다음과 같습니다.

  • 컨볼루션과 풀링 단계로 이루어진 이전 단계의 컨볼루션층들의 특성맵을 참고하여 upsampling을 해주면, 좀 더 정확도를 높일 수 있지 않겠냐는 것입니다.

  • 왜냐하면, 이전 컨볼루션층들의 특성맵들이 해상도 면에서는 더 낫기 때문입니다.

  • 따라서, 바로 전 컨볼루션층의 특성맵(pool4)과 현재 층의 특성맵(conv7)을 2배 upsampling한 것을 더합니다.

  • 그 다음 (pool4 + 2x conv7)을 16배 upsampling 해 얻은 특성맵들로 segmentation map을 얻는 방법을 FCN-16s라고 부릅니다.

  • 더 나아가서, 전전 단계의 특성맵(pool3)과, 전 단계의 특성맵(pool4)을 2배 upsampling한 것과, 현 단계의 특성맵(conv7)을 4배 upsampling 한 것을 모두 더한 다음에,

  • (pool3 + 2xpool4 + 4xcon7)을 8배 upsampling을 해 얻은 특성맵들로 segmentation map을 얻는 방법을 FCN-8s라고 부릅니다.

  • FCN-32s, FCN-16s, FCN-8s 그림

  • 아래 그림을 보면, FCN-8s가 FCN-16s보다 좀 더 세밀하고, FCN-32s보다는 훨씬 더 정교해졌음을 알 수 있습니다.

  • 다른 논문에서, 또는 웹상에서 누군가 FCN을 말할 때는 보통 이 FCN-8s를 의미한다고 봐도 무방합니다.

U-Net

  • U-Net이란?

    • U-Net은 Semantic Segmentation Task 수행에 널리 쓰이는 모델 중 하나입니다.

    • 네트워크 형태가 알파벳 U와 비슷하다고 하여 붙여진 이름으로, 의생명공학 이미지 Segmentation을 위해 개발된 모델입니다.

    • 모델의 구조는 아래 그림과 같습니다.

  • U-Net의 장점

    • U-Net은 기존의 Segmentation 모델의 문제점을 해결할 수 있습니다.
    • 1) 빠른 속도
      • 기존 Segmentation 모델의 단점이었던 느린 연산 속도를 개선했습니다.
      • 속도 개선이 가능했던 이유는, 이미지를 인식하는 단위(Patch)에 대한 Overlap 비율이 적기 때문입니다.
      • 기존의 모델에서 많이 사용되었던 Sliding Window 방식의 경우, 이전 Patch에서 검증이 끝난 부분을 다음 Patch에서 다시 검증하게 됩니다. 이는 일종의 연산 낭비라고 볼 수 있습니다.
      • U-Net의 경우, 이전 Patch에서 검증이 끝난 부분을 다음 Patch에서 중복하여 검증하지 않기 때문에, 연산의 낭비가 없고 이로 인해 향상된 속도를 얻을 수 있습니다.
    • 2) Context와 Localization의 늪에서 탈출
      • Segmentation Network는 클래스 분류를 위한 인접 문맥 파악(Context)과 객체의 위치 판단(Localization)을 동시에 수행해야 합니다.
      • 각 성능은 Patch의 크기에 영향을 받는데, 이때 Trade-Off 관계를 가지게 됩니다.
      • Patch의 크기가 커지면 더 넓은 범위의 이미지를 한 번에 인식할 수 있어 Context 파악에는 탁월한 효과를 보이지만,
      • 많은 Max-Pooling을 거치며 Localization 성능에는 부정적인 영향을 미치게 됩니다.
      • 반대로 Patch의 크기가 작아지면 Localization 성능은 좋아지나, 인식하는 범위가 지나치게 협소해져 Context 파악 성능에 좋지 않은 영향을 미칩니다.
      • U-Net은 다층의 Layer의 Output을 동시에 검증해서 이러한 Trade-Off를 극복합니다.
  • 자세한 U-Net 구조

    • U-Net의 구조는 알파벳 U의 왼쪽 절반에 해당하는 Contracting Path와

    • 오른쪽 절반에 해당하는 Expanding Path의 2가지 Path로 분리할 수 있습니다.

  • 1) Contracting Path

    • Contracting Path는 Encoder의 역할을 수행하는 부분으로 전형적인 Convolution Network로 구성됩니다.
    • Contracting Path는 입력을 Feature Map으로 변형해 이미지의 Context를 파악합니다.
    • 이 경우에 Contracting Path의 앞단에 이미 잘 학습된 모델을 Backbone으로 사용해 학습 효율과 성능을 높일 수 있습니다. 주로 ResNet 등의 모델을 사용합니다.
  • 2) Expanding Path

    • Expanding Path는 Decoder의 역할을 수행하는 부분으로, 전형적인 Upsampling + Convolution Network로 구성됩니다.
    • 즉, Convolution 연산을 거치기 전 Contracting Path에서 줄어든 사이즈를 다시 복원하는(Upsampling) 형태입니다.
    • Expanding Path에서는 Contracting을 통해 얻은 Feature Map을 Upsampling하고,
    • 각 Expanding 단계에 대응되는 Contracting 단계에서의 Feature Map과 결합해서(Skip-Connection Concatenate) 더 정확한 Localization을 수행합니다.
    • 즉, Multi-Scale Object Segmentation을 위하여 Downsampling과 Upsampling을 순서대로 반복하는 구조입니다.

DeepLab v3+

  • DeepLab 이라 불리는 semantic segmentation 방법은, version 1부터 시작하여 지금까지 총 4번의 개정본(1, 2, 3, 3+)이 출판되었습니다.
    • DeepLab V1Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs. ICLR 2015.
    • DeepLab V2DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs. TPAMI 2017.
    • DeepLab V3Rethinking Atrous Convolution for Semantic Image Segmentation. arXiv 2017.
    • DeepLab V3+Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation. arXiv 2018.
  • 전체적으로 DeepLab은 semantic segmentaion을 잘 해결하기 위한 방법으로 atrous convolution을 적극적으로 활용할 것을 제안하고 있습니다.
  • V1에서는 atrous convolution을 적용해 보았고,
  • V2에서는 multi-scale context를 적용하기 위한 Atrous Spatial Pyramid Pooling (ASPP) 기법을 제안하고,
  • V3에서는 기존 ResNet 구조에 atrous convolution을 활용해 좀 더 dense한 feature map을 얻는 방법을 제안하였습니다.
  • 그리고 최근 발표된 V3+에서는 separable convolution과 atrous convolution을 결합한 atrous separable convolution의 활용을 제안하고 있습니다.
  • 우선, 관련된 용어부터 살펴보겠습니다.

Atrous convolution

  • Atrous convolution은 기존 convolution과는 다르게, 필터 내부에 빈 공간을 둔 채로 작동하게 됩니다.
  • 위 예시에서, 얼마나 빈 공간을 둘 지 결정하는 파라미터인 rate r=1일 경우, 기존 convolution과 동일하고, r이 커질 수록, 빈 공간이 넓어지게 됩니다.
  • Atrous convolution을 활용함으로써 얻을 수 있는 이점은,
  • 기존 convolution과 동일한 양의 파라미터와 계산량을 유지하면서도, field of view (한 픽셀이 볼 수 있는 영역) 를 크게 가져갈 수 있게 됩니다.
  • 보통 semantic segmentation에서 높은 성능을 내기 위해서는, convolutional neural network의 마지막에 존재하는 한 픽셀이 입력값에서 어느 크기의 영역을 커버할 수 있는지를 결정하는 receptive field 크기가 중요하게 작용합니다.
  • Atrous convolution을 활용하면 파라미터 수를 늘리지 않으면서도 receptive field를 크게 키울 수 있기 때문에, DeepLab series에서는 이를 적극적으로 활용하려 노력합니다.

Spatial Pyramid Pooling

  • Semantic segmentaion의 성능을 높이기 위한 방법 중 하나로, spatial pyramid pooling 기법이 자주 활용되고 있는 추세입니다.
  • DeepLab V2에서는 feature map으로부터, 여러 개의 rate가 다른 atrous convolution을 병렬로 적용한 뒤,
  • 이를 다시 합쳐주는 atrous spatial pyramid pooling (ASPP) 기법을 활용할 것을 제안하고 있습니다.
  • 최근 발표된 PSPNet에서도 atrous convolution을 활용하진 않지만, 이와 유사한 pyramid pooling 기법을 적극 활용하고 있습니다.
  • 이러한 방법들은 multi-scale context를 모델 구조로 구현하여, 보다 정확한 semantic segmentation을 수행할 수 있도록 돕게 됩니다.
  • DeepLab 에서는 ASPP를 기본 모듈로 사용하고 있습니다.

Encoder-Decoder

  • U-Net 구조 (Contracing Path : Encoder, Expanding Path : Decoder)

  • Encoder-decoder 구조 또한 semantic segmentation을 위한 CNN 구조로 자주 활용되고 있습니다.

  • 특히, U-Net이라 불리는 encoder-decoder 구조는 정교한 픽셀 단위의 segmentation이 요구되는 biomedical image segmentation task의 핵심 요소로 자리잡고 있습니다.

  • 왼쪽의 encoder 부분에서는 점진적으로 spatial dimension을 줄여가면서 고차원의 semantic 정보를 convolution filter가 추출해낼 수 있게 됩니다.

  • 이후 오른쪽의 decoder 부분에서는 encoder에서 spatial dimension 축소로 인해 손실된 spatial 정보를 점진적으로 복원하여 보다 정교한 boundary segmentation을 완성하게 됩니다.

  • U-Net이 여타 encoder-decoder 구조와 다른 점은, 위 그림에서 가운데 놓인 회색 선입니다.

  • Spatial 정보를 복원하는 과정에서, 이전 encoder feature map 중 동일한 크기를 지닌 feature map을 가져 와 prior로 활용함으로써 더 정확한 boundary segmentation이 가능하게 만듭니다.

  • 이번에 발표된 DeepLab V3+에서는 U-Net과 유사하게 intermediate connection을 가지는 encoder-decoder 구조를 적용하여, 보다 정교한 object boundary를 예측할 수 있게 됩니다

Depthwise Separable Convolution

  • 위 그림처럼, 입력 이미지가 8×8×3 (H×W×C) 이고, convolution filter 크기가 3×3 (F×F) 이라고 했을 때, filter 한 개가 가지는 파라미터 수는 3×3×3 (F×F×C) = 27 이 됩니다.

  • 만약 filter가 4개 존재한다면, 해당 convolution의 총 파라미터 수는 3×3×3×4 (F×F×C×N) 만큼 지니게 됩니다.

  • 위 그림처럼, Convolution 연산에서 channel 축을 filter가 한 번에 연산하는 대신에,

  • 아래 그림처럼, 같이 입력 영상의 channel 축을 모두 분리시킨 뒤, filter의 channel 축 길이를 항상 1로 가지는 여러 개의 convolution filter로 대체시킨 연산을 depthwise convolution이라고 합니다.

  • 이제, 위의 depthwise convolution으로 나온 결과에 대해, 1×1×C 크기의 convolution filter를 적용한 것을 depthwise separable convolution 이라 합니다.

  • 이처럼 복잡한 연산을 수행하는 이유는 기존 convolution과 유사한 성능을 보이면서도 사용되는 파라미터 수와 연산량을 획기적으로 줄일 수 있기 때문입니다.

    • 예를 들어, 입력값이 8×8×3 라면
    • 16개의 3×3 convolution 필터를 적용할 때 사용되는 파라미터의 개수는
    • Convolution: 3×3×3×16 = 432
    • Depthwise separable convolution: 3×3×3 + 3×16 = 27 + 48 = 75
    • 임을 확인할 수 있습니다.
  • Depthwise separable convolution은 기존 convolution filter가 spatial dimension과 channel dimension을 동시에 처리하던 것을 따로 분리시켜 각각 처리한다고 볼 수 있습니다.

  • 이 과정에서, 여러 개의 필터가 spatial dimension 처리에 필요한 파라미터를 하나로 공유함으로써 파라미터의 수를 더 줄일 수 있게 됩니다.

  • 두 축을 분리시켜 연산을 수행하더라도 최종 결과값은 결국 두 가지 축 모두를 처리한 결과값을 얻을 수 있으므로, 기존 convolution filter가 수행하던 역할을 충분히 대체할 수 있게 됩니다.

  • 픽셀 각각에 대해서 label을 예측해야 하는 semantic segmentation은 난이도가 높은 편에 속하기 때문에 CNN 구조가 깊어지고

  • receptive field를 넓히기 위해 더 많은 파라미터들을 사용하게 되는 상황에서, separable convolution을 잘 활용할 경우, 모델에 필요한 parameter 수를 대폭 줄일 수 있게 되므로

  • 보다 깊은 구조로 확장하여 성능 향상을 꾀하거나, 기존 대비 메모리 사용량 감소와 속도 향상을 기대할 수 있습니다.

DeepLab V3

  • DeepLab V3+ 바로 이전 논문인 DeepLab V3의 경우, 아래 요소들로 이루어져있습니다.
    • Encoder: ResNet with atrous convolution
    • ASPP
    • Decoder: Bilinear upsampling

DeepLab V3+

  • DeepLab V3+는 제목에서도 알 수 있듯이 V3에 비해서 약간의 변화만이 존재합니다.
    • Encoder: ResNet with atrous convolution → Xception (Inception with separable convolution)
    • ASPP → ASSPP (Atrous Separable Spatial Pyramid Pooling)
    • Decoder: Bilinear upsampling → Simplified U-Net style decoder
  • 우선, ResNet을 사용하던 encoder가 앞서 소개드린 separable convolution을 적극 활용한 구조인 Xception으로 대체됩니다.
  • Multi-scale context를 얻기 위해 활용되던 ASPP에는, separable convolution과 atrous convolution을 결합한 atrous separable convolution이 적용된 ASPP로 대체되었습니다.
  • 또한, 기존에 단순하게 bilinear upsampling으로 해결했던 decoder 부분이 U-Net과 유사한 형태의 decoder로 대체됩니다.
  • Encoder와 ASPP, 그리고 decoder 모두 separable convolution을 적극 활용함으로써 파라미터 사용량 대비 성능 효율을 극대화시키려는 노력이 보이는 구조입니다.

Segmentation Dataset

참고

Comments