코딩하는 해맑은 거북이

[컴퓨터비전] Semantic Segmentation - FCN 한계를 극복한 Model 본문

AI

[컴퓨터비전] Semantic Segmentation - FCN 한계를 극복한 Model

#CJE 2023. 6. 13.
본 게시물의 내용은 '부스트캠프 AI Tech - Semantic Segmentation (김현우)' 강의를 듣고 작성하였다.
해당 글은 아래의 4가지를 다룬다.
📌 FCN의 한계점
📌 Decoder를 개선한 Model
  🔷 DeconvNet
  🔷 SegNet
📌 Skip Connection을 적용한 Model
  🔷 FC DenseNet
  🔷 Unet
📌 Receptive Field를 확장시킨 Model
  🔷 DeepLab v1
  🔷 DilatedNet
  🔷 DeepLab v2
  🔷 PSPNet
  🔷 DeepLab v3
  🔷 DeepLab v3+

📌 FCN의 한계점

1. 객체의 크기가 크거나 작은 경우 예측을 잘 하지 못하는 문제

  • 큰 Object의 경우 지역적인 정보만으로 예측
    • 버스의 앞 부분 범퍼는 버스로 예측하지만, 유리창에 비친 자전거를 보고 자전거로 인식하는 문제 발생하기도 함 
  • 같은 Object여도 다르게 labeling
  • 작은 Object가 무시되는 문제가 있음

 

2. Object의 디테일한 모습이 사라지는 문제 발생

  • Deconvolution 절차가 간단해 경계를 학습하기 어려움

(c) : DeconvNet

 

📌 Decoder를 개선한 Model

🔷 DeconvNet

🔹Architecture

- Decoder를 Encoder와 대칭으로 만든 형태

  • Convolution Network는 VGG16을 사용
    • 13개의 층으로 이루어짐
    • ReLU와 Pooling이 convolution 사이에서 이루어짐
    • 7 x 7 Convolution 및 1 x 1 Convolution 을 활용
  • Deconvolution Network는 Unpooling, deconvolution, ReLU으로 이루어짐

 

🔹Unpooling vs Deconvolution

- Decorder는 Unpooling과 Transposed Convolution이 반복적으로 이루어진 형태로 되어있다.

  • Unpooling : 디테일한 경계를 포착 - example-specific 구조를 잡아냄
    • cf) Pooling의 경우 우 노이즈를 제거하는 장점이 있지만, 그 과정에서 정보가 손실되는 문제가 생긴다.
    • Unpooling을 통해서 Pooling시에 지워진 경계에 정보를 기록했다가 복원
    • 학습이 필요 없기 때문에 속도가 빠르지만, Sparse한 Activation Map을 가지기 때문에 이를 채워 줄 필요가 있다.
      • 채우는 역할을 Transposed Convolution이 수행

Unpooling

  • Transposed Convolution (= Deconvolution) : 전반적인 모습을 포착 - class-specific 구조를 잡아냄
    • Deconvolution layers를 통해서 input object의 모양을 복원
    • 순차적인 층의 구조가 다양한 수준의 모양을 잡아냄
      • Low layer : 직선 및 곡선, 색상 등의 낮은 수준의 특징 (local feature) - 전반적인 모습
      • High layer : 복잡하고 포괄적인 개체 정보가 활성화 (global feature) - 구체적인 모습

Transposed Convolution = Deconvolution

🔷 SegNet

Road Scene Understanding applications라는 분야에서 Semantic Segmentation을 수행하기 위해 모델이 필요한 능력에 대한 고민하여 나온 모델이다.

🔹Architecture

- Decoder를 Encoder와 대칭으로 만든 형태

  • Convolution Network는 VGG16을 사용
    • 13개의 층으로 이루어짐
    • Convolution / BN / ReLU / Pooling
    • DeconvNet 중간의 1 x 1 Convolution 제거 → weight parameter 감소 → 학습 및 추론 시간 감소
  • Decoder Network가 Unpooling, Convolution, ReLU로 이루어짐
    • Deconvolution 대신 Convolution 연산 사용

 

📌 Skip Connection을 적용한 Model

cf) Skip Connection

: Neural network에서 이전 layer의 output을 일부 layer를 건너 뛴 후의 layer에게 입력으로 제공하는 것

 

🔷 FC DenseNet

cf) DenseNet 구조

🔹Architecture

FC DenseNet는 DenseNet에서 사용한 Dense Block을 사용한 모델이다. 구조 또한 DenseNet와 비슷하다.

 

 

🔷 Unet

🔹Architecture

- Decoder를 Encoder와 대칭으로 만든 형태며, 4개의 Skip Connection을 통해서 대칭 구조로 정보를 전달해준다.

(다음 게시글에서 깊게 다룰 예정)

 

📌 Receptive Field를 확장시킨 Model

cf) Receptive Field

Receptive Field가 작으면, 객체에 대한 정보를 전 포함하지 못해서 예측 정확도가 낮을 수 있다.

그래서 Receptive Field를 넓히기 위한 여러 방법들이 연구되고 있다.

아래 그림과 같이 Conv → Max pooling → Conv 반복하면, 효율적으로 Receptive Field를 넓힐 수 있다.

그러나,  Resolution 측면에서는 Low Feature Resolution을 가지는 문제점이 있다.

그래서 이미지의 크기는 많이 줄이지 않고, 파라미터 수도 변함이 없는 채로 Receptive Field만 넓게 하는 방식이 Dilated Convolution (atrous Convolution) 이다.

Dilated Convolution은 Kernel에 rate를 2로 중간에 zero padding을 추가하여 Receptive Field를 넓힐 수 있었다.

 

🔷 DeepLab v1

🔹Architecture

5번의 Conv 연산 중 Conv1~Conv3에서는 stride=2, padding=1로 설정하여 Feature Map의 크기가 1/2이 되도록 하고, Conv4, Conv5는 Feature Map의 크기를 바꾸지 않는다.

마지막에는 1/8배로 줄어든 Feature Map을 8배로 UpSampling 해준다.

UpSampling을 할 때는 Bilinear Interpolation 을 사용한다.

Bilinear Interpolation

하지만, Bilinear Interpolation은 Pixel 단위의 정교한 Segmentation이 불가능하다. 이를 개선하기 위한 후처리 방법이 Dense CRF (Dense Conditional Random Field, Fully-Connected CRF) 이다. CRF란 색상이 유사한 픽셀이 가까이 위치하면 같은 범주에 속하고, 색상이 유사해도 픽셀이 멀리 위치한다면 같은 범주로 묶지 않는 방법이다.

Dense CRF는 CRF는 모든 픽셀 쌍에 대해 수행하는 것을 말한다. 이를 반복하면서 Score Map이 더욱 정교화된다.

 

🔷 DilatedNet

🔹Architecture

Dilated Convolution을 사용한 것은 DeepLab v1과 동일하지만, 차이점은 Conv1~Conv3에서 3x3 MaxPooling 대신 2x2 MaxPooling을 사용했다. 또한, Conv4, Conv5에서 MaxPooling을 사용하지 않는다. 또한, FC6에서 7x7 Convolution을 수행한다. 그리고 마지막에 Transpose Convolution을 사용하여 Feature Map의 크기를 8배로 Upsampling 해준다. 

DilatedNet (Only Front-End Module)

기존 DilatedNet에서 Score와 UpSampling 사이에 Basic Context Module을 추가하여 제안된 모델도 있다.

DilatedNet (Front + Basic Context module)

 

 

🔷 DeepLab v2

🔹Architecture

DeepLab v1과 달라진 점은 성능 향상을 위해 Backbone으로 ResNet-101을 사용한다.

그리고 DeepLab v2의 ResNet-101의 Conv4, Conv5에서 DownSampling을 진행하지 않고, Dilated Convolution을 사용한다. 기존 FC6, FC7, FC8에 ASPP(Atrous Spatial Pyramid Pooling) 모듈을 사용하여 더 다양한 레벨의 Feature를 함께 사용할 수 있도록 하였다.

 

🔷 PSPNet

🔹도입 배경 - 문제점 3가지

  • Mismatched Relationship
    • 호수 주변에 boat가 있는데 기존 모델(FCN)은 car로 예측
    • 이유 : boat의 외관이 car와 비슷하기 때문
    • idea : 주변의 특징을 고려 (e.g. water 위의 boat)
  • Confusion Categories
    • FCN은 skyscraper를 skyscraper와 building을 혼돈하여 예측
    • 원인 : ADE20K data set의 특성상 비슷한 범주인 building과 skyscraper 존재
    • idea : category 간의 관계를 사용하여 해결 (global contextual information 사용)
  • Inconspicuous Classes
    • FCN은 pillow를 bed sheet로 예측
    • 원인 : pillow의 객체 사이즈가 작을뿐만 아니라 bed sheet의 커버와 같은 무늬 예측에 한계
    • idea : 작은 객체들도 global contextual information을 사용

🔹Architecture

PSPNet은 Global Context를 고려할 수 있도록 하기 위해 Pyramid Pooling Module을 사용하고, Feature Map에 Average Pooling을 적용해 sub-region을 생성한다. sub-region 각각에 Conv를 진행하여 channel이 1인 Feature Map을 생성한다. 그리고 Feature Map과 Pyramid Pooling Module을 Upsampling한 Output을 서로 Concat하여 최종 Score Map을 예측한다. 

 

🔷 DeepLab v3

🔹Architecture

DeepLab v3은 DeepLab v2에서 사용한 ASPP 모듈 + PSPNet에서 사용한 Global Average Pooling 연산을 합친 것이다.

ASPP를 적용할 때는 zero padding을 줘서 Feature Map의 크기가 변화하지 않도록 하고, global Average Pooling 후 크기를 UpSampling 할 때는 bilinear interpolation을 사용한다.

 

 

🔷 DeepLab v3+

🔹Architecture

  • Encoder
    • 수정된 Xception을 backbone으로 사용
    • Atrous separable convolution을 적용한 ASPP 모듈 사용
    • Backbone 내 low-level feature와 ASPP 모듈 출력을 모두 decoder에 전달
  • Decoder
    • ASPP 모듈의 출력을 (bilinear) up-sampling하여 low-level feature와 결합
    • 결합된 정보는 convolution 연산 및 up-sampling 되어 최종 결과 도출
    • 기존의 단순한 up-sampling 연산을 개선시켜 detail을 유지하도록 함

(c) DeepLab v3+

  • Depthwise Convolution
    • Xception 구조는 Depthwise Separable Convolution 사용
    • Depthwise Separable Convolution = Depthwise Convolution + Pointwise Convolution
    • Depthwise Convolution : 각 채널마다 다른 filter를 사용하여 Convolution 연산 후 결합
    • Pointwise Convolution : 1x1 Convolution
    • 사용한 Xception 구조는 3개의 flow (Entry flow, Middle flow, Exit flow)로 구성
      • Entry flow
        • Maxpooling 연산을 (Depthwise Separable Convolution + BatchNorm + ReLU)로 변경
      • Middle flow
        • 8번의 block 반복을 16번의 block 반복으로 더 깊은 구조 사용
      • Exit flow
        • Maxpooling 연산을 (Depthwise Separable Convolution + BatchNorm + ReLU)로 변경
        • Depthwise Separable Convolution 연산 추가

Comments