메뉴 바로가기 본문 바로가기

Semantic Segmentation

  • Dahee Kim
  • 2023.02.15

Semantic Segmentation

들어가며

 

[그림1] MNIST Dataset 일부 (출처: https://morioh.com/p/e9539c98d631)

현대 기술에서 컴퓨터는 위 사진과 같은 단순한 이미지는 분류를 잘 합니다. 

 

 [그림2] 컴퓨터의 생각 (출처: unsplash.com)

또한 위의 왼쪽 사진과 같이 하나의 물체만 포함하고 있는 이미지라면, 컴퓨터는 훈련을 통해 쉽게 판단할 수 있을 것입니다. 그러나 만약 오른쪽 사진처럼 한 이미지 안에 여러 동물과 식물, 사람, 물체 등 다양한 객체들이 포함되어 있다면 컴퓨터가 파악하기 쉬울까요? 그리고 입력받은 이미지에서 만약 한 물체가 다른 물체에 의해 일부 가려져 있다면, 컴퓨터가 그 가려진 물체도 올바르게 판단할 수 있을까요? 또한, 이미지에서 ‘찾고자 하는 객체가 ‘어디에’ 있는지 정확히 판단할 수 있을까요? 사람들에게 이와 같은 판단은 매우 쉽고 단순한 일이지만, 컴퓨터에게는 생각보다 어려운 과제입니다. 

컴퓨터 비전 과제들

컴퓨터가 이미지를 받아서 수행할 수 있는 과제를 Semantic Segmentation, Classification + Localization, Object Detection, Instance Segmentation으로 크게 네 가지로 분류할 수 있습니다. 

 

[그림3] 컴퓨터 비전 과제들 (출처: http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture11.pdf)

첫 번째로, Classification & Localization은 입력받은 이미지에서 보여지는 하나의 객체를 분류하고, 어디에 위치해있는지 bounding box로 나타내는 과제입니다. 두 번째로, Object Detection은 입력받은 이미지에서 여러 객체들이 무엇인지 탐지해내고 어디에 위치해 있는지 bounding box로 나타내는 과제입니다. 마지막으로 Instance Segmentation은 입력받은 이미지에서 여러 객체들이 무엇인지 탐지하며, 정확히 어느 픽셀이 그에 해당하는 객체인지 표시하는 과제입니다. 그 중에 Semantic Segmentation에 대해 설명드리도록 하겠습니다.

Semantic Segmentation이란?

Semantic Segmentation(시멘틱 세그멘테이션)은 직역하자면 ‘의미론적인 분할’이라는 뜻이지만, 딥러닝에서는 인공지능이 이미지의 모든 픽셀들을 보여지는 객체에 해당시켜 레이블링(labeling)하는 것을 말합니다. 아래의 이미지처럼 찾고자 하는 대상들을 클래스로 명명하여 픽셀마다 해당하는 클래스로 레이블링하여 표시합니다. 

 

[그림4] An Overview of Semantic Segmentation (출처: https://www.v7labs.com/blog/semantic-segmentation-guide)

Semantic Segmentation의 적용 예시

Semantic Segmentation은 현재 많이 연구되는 주제 중 하나이며, 우리 실생활에서 생각보다 많이 적용되어 쓰이고 있습니다. 예를 들어, 자율주행 자동차가 도로를 달리면서 주변에 사람이 있는지, 방지턱이 있는지, 달리고 있는 차선이 어디있는지를 파악할 수 있습니다. 그리고 의료 분야에서는 MRI 이미지를 전달받아 부위별 이름을 파악하거나, 의심되는 증상이 나타나는 부위를 표시할 수 있습니다. 또한 사진 보정 어플에서 눈매 교정, 입꼬리 교정 등 원하는 신체 부위를 인위적으로 조정할 수 있습니다.

 

[그림5] Semantic Segmentation - 자율 주행 (출처: https://towardsdatascience.com/semantic-segmentation-with-gans-for-self-driving-cars-8534c216bfe9)

 

[그림6] Semantic Segmentation - Medical Imaging (출처: https://www.biorxiv.org/content/10.1101/2020.03.14.992115v1.full)


컴퓨터가 이미지에서 객체를 분리/분할하는 방법

Semantic segmentation에는 세 단계가 있습니다.

    1. 분류하기(Classification): 입력 이미지 안에 등장하는 객체를 예측하기
       

    2. 위치 찾기(Localization): 해당 객체를 찾고 그 주변에 bounding box를 그리기
       

    3. 분할하기(Segmentation): 특정 객체에 해당하는 픽셀들을 그룹화하여 Segmentation Mask를 만들기

      *Segmentation Mask: 이미지 내의 픽셀을 특정 클래스로 표시하는 레이블
       

초창기 semantic segmentation 방법: Sliding Window

이를 구현한 고전적 방법으로 sliding window라는 방법이 있습니다.

 

[그림7] Sliding Window 설명 예시 (출처: unsplash.com)

딥러닝의 stride처럼 네모난 창이 옆으로 한 칸씩 이동하며 가장 가운데에 있는 픽셀을  해당하는 클래스로 레이블링하는 방법입니다.

그러나 이 방법은 매우 비효율적이고, 처리해야할 연산량이 너무나도 많기 때문에 딥러닝의 은어적 표현으로는 매우 비쌉니다. 그리고 두 가지의 대상이 겹쳐있는 픽셀을 재사용하지 않기 때문에 정확히 레이블링하는 것에 대한 한계가 존재합니다.

이러한 비효율적인 문제로 더 나은 방법들이 등장하는데요, 여러 방법들 중 대표적인 세 가지의 방법들을 소개하겠습니다. 


이후 등장한 방법들: (1) Fully Convolutional Network (FCN)

일반적으로 classification을 해결하기 위한 딥러닝 네트워크 구조는 마지막에 FC (Fully Connected) 레이어를 처리합니다. 그 이유는 입력된 이미지에 어떤 물체가 있는지 판단하기 위한 최종 평가 점수를 매기는 레이어로 사용되기 때문입니다. 그러나 semantic segmentation에서  FC 레이어를 사용하게 되면, 기존 입력 이미지의 픽셀마다 가지고 있는  위치 정보를 손실하는 문제가 발생합니다. 이러한 문제를 해결하기 위해 마지막 최종 평가 레이어를 컨볼루션 레이어로 대체하는 것입니다. 

 

[그림8] Fully Convolutional Network
(출처: Stanford University cs231n https://www.youtube.com/watch?v=nDPWywWRIRo&t=1349s)

*argmax: 최대함수값을 만들어주는 x값을 찾는 것

 

[그림9] Fully Convolutional Network (출처: https://openaccess.thecvf.com/content_cvpr_2015/papers/Long_Fully_Convolutional_Networks_2015_CVPR_paper.pdf)

이 방법으로 네트워크를 여러 개의 컨볼루션 레이어로 설계하여 모든 픽셀을 한 번에 예측할 수 있게 됩니다. 그러나 이 방법 또한 여전히 연산량들이 매우 많기 때문에 또다른 효율적인 방법을 찾아야만 했습니다.


이후 등장한 방법들: (2) Encoder-Decoder 구조 (Hourglass 구조)

이후 등장한 다른 방법으로 Encoder-Decoder 구조가 있습니다.

 

[그림10] SegNet: Encoder-Decoder 구조
(출처: https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7803544)

위 구조는 앞서 소개한 FCN보다 연산량을 줄여 메모리 사용량을 효율적으로 만들기 위해 SegNet 논문에서 제시한 구조입니다. 왼쪽 파란색 네모로 둘러싸인 부분이 인코더(encoder) 부분이고 오른쪽 빨간색 네모로 둘러싸인 부분이 디코더(decoder) 부분입니다. 인코더 부분은 기존 classification 모델로 자주 사용된 VGG-16 모델에서 마지막 FC(Fully Connected) 레이어를 뺀 나머지 레이어들을 활용하였고, 디코더 부분은 인코더를 대칭시킨 구조입니다. 이러한 구조가 모래시계를 닮았다 하여 Hourglass 구조라고 부르기도 합니다. 

이 구조는 인코더에서 이미지를 입력받으면 공간 해상도(spatial resolution)를 줄인 후, 디코더에서 다시 원래의 공간 해상도까지 확장시키는 구조입니다. 레이어마다 컨볼루션, pooling, 업샘플링(upsampling), softmax과 같은 방법들로 각 픽셀마다의 레이블을 예측하는 것입니다.

*공간 해상도(spatial resolution): 영상이나 사진에서 아주 가까운 별도의 물체를 구별하는 능력

 

 [그림11] Nearest Neighbor, “Bed of Nails” (출처: Stanford University cs231n https://www.youtube.com/watch?v=nDPWywWRIRo&t=1349s)

*업샘플링(upsampling): 인코더에서 pooling 레이어를 거친 후 축소된 피쳐 맵(feature map)을 다시 원본 이미지의 크기로 복구하기 위한 방법 (Nearest Neighbor, “Bed of Nails”, Max Unpooling 등이 이에 속함)


이후 등장한 방법들: (2)-1 Max Unpooling

 

[그림12] Max Unpooling (출처: Stanford University cs231n https://www.youtube.com/watch?v=nDPWywWRIRo&t=1349s)

그리고 이 논문에서 업샘플링 방법으로 제안한 것이 Max Unpooling입니다. Max Unpooling이란, 인코더에서 max pooling으로 알게 된 max pixel 값의 해당 위치 인덱스를 기억한 후, 디코더에서 max unpooling할 때 max pixel 값의 해당 위치 인덱스에 max pixel 값을 집어넣고 나머지 빈 픽셀에는 0으로 채우는 방법입니다.

 

[그림13] SegNet: Encoder-Decoder 구조
(출처: https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7803544)


이후 등장한 방법들: (3) Dilated Convolution (Atrous Convolution)

 

[그림14] Dilated Convolution (출처: https://arxiv.org/pdf/1606.00915.pdf)

어떠한 이미지가 앞서 소개한 Encoder-Decoder 구조에서 일반적인 업샘플링을 거쳐가면 맨 위 오른쪽 이미지처럼 결과가 sparse((밀도가)희박한)하게 나타납니다. 이러한 단점을 보완하고 보다 밀도가 높은 결과 이미지를 만들어내기 위해 Dilated Convolution이라는 방법이 등장했습니다. 

 

[그림15] Dilated Convolution gif (출처: https://commons.wikimedia.org/wiki/File:Convolution_arithmetic_-_Dilation.gif)

업샘플링할 때 사용되는 Dilated Convolution은 위의 그림처럼 이전 레이어보다 더 큰 레이어에 픽셀 값을 투영하는 것입니다. 여기에서 새로운 파라미터인 dilation rate(=r)를 설정함에 따라 투영하는 간격을 조정할 수 있게 됩니다.

 

[그림16] Dilated Convolution (출처: https://arxiv.org/pdf/1511.07122.pdf)

이 방법을 통해 입력 이미지의 크기를 줄이지 않아도 전체적인 특징들을 잘 잡아낼 수 있습니다. 그리고 파라미터 수와 연산량이 증가하지 않으며, 앞서 언급했듯이 upsampling할 때 이미지의 해상도가 낮아지는 문제를 잡을 수 있는 장점들이 있습니다.


최근에 제시된 방법들 / What’s Next

최근(2021년) SETR (SEgmentation TRansformer) 논문은 앞서 언급된 FCN에 의존하지 않는 방법을 제시하였습니다. 그리고 이미지 말고도 3D 포인트 클라우드(point cloud)를 semantic segmentation하는 RandLA-Net(2020년)은 다운샘플링을 하고도 특징들을 유지할 수 있는 방법을 제시하였습니다. 현재 이미지에서 최대한 많은 대상들을 더욱 디테일하게 분할할 수 있는 방법들이 활발히 연구 중에 있습니다.


나가며

지금까지 Semantic Segmentation이 무엇이고, 이를 수행하기 위한 다양한 방법들을 알아보았습니다. 현재까지도 활발히 연구되는 주제인 만큼, 더욱 효율적이고 세부적으로 segmentation을 할 수 있는 방법들이 소개되어 자율주행이나 의료분야와 같은 다양한 분야에 더 나아가는 발전이 있길 바라봅니다. 


참고 자료

 


 

블로그:

논문자료:

영상 자료:

 

About Author

 

김 다 희

 

 


Pro, AI 1팀

dhkim@cubox.ai