이미지 세그멘테이션(Image Segmentation)

박재한·2022년 6월 26일
1

Deep Learning

목록 보기
16/22

참고1
참고2
참고3

1. 이미지 처리(Image Processing)의 종류

Neural Network를 이용한 이미지 처리에는 다음과 같이 분류할 수 있다. 다음 그림을 예제로 들어 이미지 처리의 종류를 알기 쉽게 설명하였다.
Imgur

1) Image Classification : 사진의 이미지 객체가 어떤 것인지 구분하는 것(예를 들어 사진 속의 이미지가 고양이인지 강아지인지 코알라인지를 구분)
2) Image Localization : 사진 속 특정 객체에 box를 쳐서 객체가 어디있는지 표시(detection과 구분)
3) Object Detection : 사진 속 여러 객체를 각각 구별하여 각각을 box로 표시
4) Image Segmentation : 사진 속 객체를 box가 아닌 정확한 영역으로 표시 (object detection 보다 세부적). 특정 객체만 표시하는 것이 아니라 이미지 pixel전체에 걸쳐서 객체를 구분하여 각 객체의 영역을 표시.

2. 이미지 세그멘테이션(Image Segmentation)

2.1 개요

픽셀 기반의 이미지 분석(Image Segmentation) 문제는 컴퓨터 비전 분야에서 널리 알려진 문제이다. Image Segmentation의 목적은 이미지의 각각의 픽셀들을 특정 클래스로 분류하는 것이다. 이를 위해 Deep CNN을 활용한다.
딥러닝(Deep Learning)과 CNN(Convolution Neural Network)은 컴퓨터 비전(Computer Vision) 분야에서 굉장히 널리 쓰이고 있다. 딥러닝은 다른 분야에서도 그랬던 것처럼 이 이미지 분석 분야에 있어서 다른 접근 방식들을 뛰어넘는 성과를 내고 있다.

2.2 Image Segmentation이란?

Image Segmentation은 미리 정해진 클래스의 집합을 이용하여 주어진 이미지의 각 픽셀을 특정 클래스로 분류하는 작업이다. 아래의 예제에서 이미지 내의 각 객체들이 서로 다른 객체들로 분류되어 있는 것을 확인할 수 있다.
Imgur
위의 예제에서 침대에 해당하는 픽셀들은 '침대'클래스로 분류되며, 벽에 해당하는 픽셀들은 '벽' 클래스로 분류되어 각각이 서로 다른 라벨이 붙게 된다.
좀 더 자세히 말하자면, 우리의 목표는 H*W*3 크기(3은 RGB 3가지 색을 말한다.)의 이미지를 받아서 전체 픽셀의 예측 클래스를 담고 있는 H*W 배열을 생성하는 것이다.
Imgur
보통 여러 객체들을 담고 있는 이미지에서 우리는 특정 픽셀이 어느 객체 종류에 속하는지를 알고 싶어한다. 예를 들어 야외 이미징서 우리는 하늘, 땅, 나무들, 사람들 등을 분석해 낼 수 있다.
Image Segmentation은 이미지 주변에 감싸는 박스를 생성하는 이미지 인식(Object Detection)과는 다른 문제이다. 다시 말해 우리는 같은 클래스에 속하는 서로 다른 개체들을 분류할 필요가 없다. 예를 들어 같은 '차'라는 라벨을 가진 픽셀안에서도 여러 종류의 차를 분류하는 것이 object detection이라면 그냥 차라면 모아서 여러 객체들 중 다른 하나의 객체로 구분하는 것이 Image Segmentation이다.
Imgur
이미지를 분석하기 위해서는 이미지에 대한 더욱 높은 수준의 이해가 필요하다. 우리가 만들어낼 알고리즘은 객체가 존재한다는 것 말고도 어느 픽셀들이 그 객체를 나타내는지를 파악할 수 있어야 한다.
Image Segmentation은 전체적인 이미지를 해석하는데 있어 가장 중요한 작업 중 하나라고 할 수 있다.

2.3 Image Segmentation의 적용 분야

  1. 의학 사진
    몸을 스캔(scan)한 사진을 자동으로 분석할 수 있게 된다면 의사들이 진단을 하는데에 있어 매우 큰 도움이 될 수 있다. 예를 들어 이미지에서 암을 감지하는데에 훈련될 수 있다.
    Imgur

  2. 자율주행차
    자기 스스로 움직이는 자율주행차나 드론들은 이런 이미지 분석의 도움을 받을 수 있다. 예를 들어 자율주행차들은 자기가 운전할 수 있는 영역을 인식할 수 있다.
    Imgur
    Imgur

  3. 위성 이미지 분석
    위성 이미지들은 지형을 분석하는데 사용될 수 있다.
    Imgur

3. 딥러닝(Deep Learning)을 통한 Image Segmentation 모델의 종류

다른 적용분에서도 마찬가지이겠지만 CNN은 이미지 분석에서도 중요한 요소이다. CNN을 이미지 분석에서 사용할 경우 출력은 고정길이벡터가 아닌 이미지(이차원 또는 삼차원 배열)가 된다.

3.1 FCN(Fully Convolutional Network)

그렇다면 이제 Image Segmentation의 가장 대표적인 모델 중 하나라고 할 수 있는 FCN에 대해서 알아보자.
FCN은 버클리 대학의 Jonathan Long등이 2015년 CVPR(Computer Vision and Pattern Recognition)에 발표한 Semantic Segmentation 알고리즘으로 이후에 출시된 알고리즘들은 사실상 FCN을 개선한 아류작(imitation)이라고도 할 수 있을 정도로 선두적인 역할을 한 알고리즘이다.
AlexNet, VGGNet 등 이미지 분류용 CNN 알고리즘들은 일반적으로 Convolution Layer와 Fully Connected Layer들로 이루어져 있다. 항상 입력 이미지를 네트워크에 맞는 고정된 사이즈로 작게 만들어서 입력해 준다.그러면 네트워크는 그 이미지가 속할 클래스를 예측해서 알려준다. 아래 그림에서 네크워크는 입력된 이미지의 클래스를 얼룩무늬 고양이(tabby cat)라고 예측하였다.
Imgur
이 분류용 CNN알고리즘들은 이미지에 있는 물체가 어떤 클래스에 속하는지는 예측해낼 수 있지만 그 물체가 어디에 존재하는지는 예측해 낼 수 없다. 왜냐하면 네크워크 후반부의 fully connected layer에 들어서면서 위치 정보가 소실되었기 때문이다. 따라서 AlexNet, VGGNet 등과 같은 알고리즘들은 추가 수정없이 이미지 분석에 그대로 사용하는 것은 불가능하다.

FCN 개발자들은 위치 정보가 소실되지 않게 하기 위해서, 또한 어떠한 크기의 입력 이미지도 허용하게 하기 위해서 다음과 같이 알고리즘을 발전시켜 나갔다. 먼저 고정된 크기의 input만을 허용하는 fully connected layer를 1*1 convolution layer로 바꿔준다.
Imgur
결과적으로 네트워크 전체가 Convolution Layer들로 이루어지게 된다. Fully Connected layer가 없어졌으므로 이제 더 이상 입력 이미지의 크기에 제한을 받지 않게 되었다.
Imgur
(즉 Fully Connected Layer를 Convolution Layer로 사용함으로써 위치 정보가 소실되지 않게 되었고 크기에 제약없이 사용할 수 있게 되었다.)

이제 어떠한 사이즈 H*W의 이미지도 이 네트워크에 입력이 될 수 있다. 여러 층의 Convolution Layer들을 거치고 나면 특성 맵(feature map)의 크기가 H/32 * W/32 로 줄어드는데 그 특성맵의 한 pixel이 입력 이미지의 32 * 32 크기를 대표한다. 즉 입력 이미지의 위치 정보를 대략적으로 유지하고 있는 것이다.
여기서 중요한 것은 이 Convolution Layer들을 거치고 나서 얻게 된 마지막 특성맵의 갯수는 훈련된 클래스의 갯수와 동일하다는 것이다. 21개의 클래스로 훈련된 네트워크라면 21개의 특성맵을 산출해낸다. 각 특성맵은 하나의 클래스를 대표한다. 만약 고양이 클래스에 대한 특성맵이라면 고양이가 있는 위치의 픽셀값들이 높고 강아지 클래스에 대한 특성맵이라면 강아지 위치의 픽셀값들이 높다.
Imgur
이 대략적인 특성맵들의 크기를 원래 이미지의 크기로 다시 복원해줄 필요가 있다. 이미지의 모든 픽셀에 대해서 클래스를 예측하는 dense prediction을 해 주는 것이 Image Segmentation의 목적이기 때문이다. 이 원래 이미지로 복원하는 과정을 Upsampling이라고 부른다. Upsampling을 통해서 각 클래스에 해당하는 대략적인 특성맵들을 원래 사이즈로 크기를 키워준다. Upsampling된 특성맵들을 종합해서 최종적인 segmentation map을 만들게 된다. 간단히 말해서 각 픽셀당 확률이 가장 높은 클래스를 선정해주는 것이다. 만약 (1,1) 픽셀에 해당하는 클래스당 확률값들이 강아지 0.45, 고양이 0.94, 나무 0.02, 컴퓨터 0.05, 호랑이 0.21 이런 식이라면 0.94로 가장 높은 확률을 산출한 구양이 클래스를 (1,1) 픽셀의 클래스로 예측하는 것이다. 이런 식으로 모든 픽셀이 어느 클레스에 속하는지 판단한다.
Imgur
그런데 단순히 upsampling만 시행하면 특성맵의 크기는 원래 이미지 크기로 복원되고, 그것들로부터 원래 이미지 크기의 segmentation map을 얻게 되지만 여전히 대략적인 즉 디테일하지 못한 segmentation map을 얻게 된다. 1/32 만큼 줄어든 특성맵들을 단숨에 32배만큼 upsampling을 했기 때문에 당연히 대략적일 수 밖에 없다. 이렇게 단숨에 32배 upsampling하는 방법을 논문에서는 FCN-32s라고 소개하고 있다.
아래 그림을 보자. 실제 상황과 비교해서 FCN-32로 얻은 segmentation map은 많이 뭉뚱그려져 있고 디테일하지 못함을 알 수 있다.
Imgur

FCN의 개발자들은 좀 더 디테일한 segmentation map을 얻기 위해 skip combining이라는 기법을 제안한다. 기본적인 생각은 다음과 같은데, convolution과 pooling 단계로 이루어진 이전 단계의 convolution layer들의 특성맵을 참고하여 upsampling을 해주면 좀 더 정확도를 높일 수 있지 않겠냐는 것이다. 왜냐하면 이전 convolution layer들의 특성맵들이 해상도 면에서는 더 낫기 때문이다. 이렇게 바로 전 convolution layer들의 특성맵과 현재 층의 특성맵을 2배 upsampling한 것을 더한다. 그 다음 그것을 16배 upsampling으로 얻은 특성맵들로 segmentation map을 얻는 방법을 FCN-16s라고 부른다. 아래 그림을 참고하자.
Imgur
그림에서 pool1은 (H/2, W/2), pool2는 (H/4, W/4), pool3, pool4, pool5는 각각 (H/8, W/8), (H/16, W/16), (H/32, W/32) 크기의 특성맵에 해당된다.
pool5의 결과인 conv7을 그대로 32배(32*32) 확대시킨 것이 FCN-32s이고 가장 성능이 안좋다. 다음 conv7의 특성맵을 2배 확대(upsampling)시키고(H/16, W/16) 여기에 직전 convolution layer 특성맵인 pool4(H/16, W/16)를 더해준 다음 그것을 16배 확대(upsampling)시킨 것이 FCN-16s라고 부른다.
그 다음 FCN-16s의 결과를 다시 2배 upsampling해서(H/8, W/8)해서 직전의 직전맵인 pool3(H/8, W/8)를 더해주고 그것을 8배 확대(upsampling)시킨 것을 FCN-8s라고 부른다.
당연히 성능은 FCN-8s > FCN-16s > FCN-32s의 순으로 좋다.
Imgur

아래 그림을 보면 FCN-8s가 FCN-16s보다 좀 더 세밀하고, FCN-32s 보다는 훨씬 더 정교해졌음을 알 수 있다. 다른 논문에서 또는 웹상에서 누군가 FCN을 말할 때는 보통 이 FCN-8s를 의미한다고 봐도 무방하다.
Imgur

지금까지 살펴본 모델인 FCN은 추상화된 정보를 다시 원래 이미지의 segmentation으로 풀어나갈때 별도의 복잡한 수학적 계산이 들어가 있지는 않다. 그러나 다른 대부분의 Image Segmentation 모델에서는 별도의 수학적인 연산들을 이용하여 결과를 내게 되는ㄷ 이러한 구조를 다른 말로 Encoder-Decoder 구조라고도 하며 아래 그림에서 확인할 수 있다.
Imgur

3.2 SegNet

SegNet 모델은 위에서 서술한 Encoder-Decoder 구조를 사용한다. 두 파트는 서로 대칭적이다. SegNet에서는 encoder 과정에서의 Max Pooling 작업의 과정을 기억했다가 decoder 과정에서 upsampling시에 사용하게 된다. 대신 skip combining 과정은 없다.
Imgur

3.3 UNet

UNet 역시 Encoder-Decoder 구조를 사용하는 모델로 skip combining을 통해서 decoding 을 하게 됩니다. encoding, decoding의 구조가 U자 모양을 이루었다고 해서 UNet이라고 한다.
Imgur

3.4 PSPNet(Pyramid Scene Parsing Network)

PSPNet은 이미지의 전체적인 문맥(전역 정보)를 더 잘 학습하기 위해 최적화된 모델이다. 먼저 이미지는 기반 모델로 입력되어 feature map을 얻게 되며 이는 여러가지 서로 다른 scale로 downsampling된다. 그후 convolution 작업을 거친 feature map들은 다시 같은 크기로 upsampling된 후 합쳐지게 된다. 마지막으로 또 다른 convolution 층을 통해서 최종 image segmentation 결과를 산출해 낸다. 여기서 서로 다른 크기의 특성 맵들을 통해서 다양한 크기의 개체들을 더욱 잘 분석해 낼 수 있게 된다.
Imgur

3.5 각 Image Segmentation 모델의 비교

  • 실내와 야외의 장면들을 포함하는 이미지에 대해서는 이미지가 보통 서로 다른 크기를 나타내므로 PSPNet이 선호된다. 보통 여기서 입력 이미지들은 상당히 큰데 500*500정도 된다.
  • 의학 분야의 이미지에서는 UNet이 보편적인 선택이다. skip combining 과정을 통해서 UNet은 섬세한 디테일을 놓치지 않는다. UNet은 작은 개체들이 있는 실내, 야외 이미지에서도 유용하게 쓰일 수 있다.
  • 간단한 데이터에서, 즉 큰 개체들이 조금 있는 이미지에서는 UNet과 PSPNet은 너무 과도한 투자일 수 있다. 여기서는 FCN이나 SegNet과 같은 간단한 모델들만으로도 충분하다.

다양한 분석 모델과 다양한 입력 사이즈의 이미지들로 여러 실험을 해 보면서 더 좋은 지식을 축적할 수 있다. 만일 custom 모델을 사용하고 싶지 않다면 Keras_segmentation에 있는 미리 준비된 모델을 사용할 수 있다.(예: from keras_segmentation.models.unet import vgg_unet)

4. 구현(Implementation)

이미지 Segmentation은 Keras API나 Pytoprch API등을 이용해서 직접 모델을 구현하거나 기존의 모델을 활용할 수 있다.

4.1 모델 구현

encoder 층과 decoder 층을 차례로 만들어 준다.
자세한 과정은 여기의 'Building the model' 항목을 참조하면 된다.

4.2 기존 모델 활용

Image Segmentation을 위해 기존에 잘 만들어진 모델을 활용하는 방법도 있다. 이를 Transfer Learning이라고 한다.
모델을 고를 때 주요한 고려해야 할 점은 다음과 같다

  • 훈련 이미지의 갯수
  • 이미지의 사이즈
  • 이미지의 종류(The domain of the images)

4.2.1 기반 모델 고르기

여기서 기반 모델들은 최종적인 Image Segmentation 모델의 encoder 부분의 초기 층들로 사용된다.
ResNet, VGG, MobileNet과 같은 모델들이 CNN을 사용한 주요한 기반 모델이다.

  • ResNet : Microsoft에 의해 제안된 모델로 2016년 ImageNet(ILSVRC) 경언에서 96.4%의 정확도를 달성하였다. ResNet은 여러 분야에서 기반 모델로 선택되고 있다. ResNet은 매우 많은 갯수의 층을 가지고 있다.
  • VGG-16 : Oxford에 의해 제안된 모델로 2013년 ImageNet 경연에서 92.7%의 정확도를 달성하였읍니다. ResNet과 비교하자면 이 모델은 훨씬 적은 수의 층을 가지고 있어 훈련에 소요되는 시간이 훨씬 적다. 실제로 현장에서의 적용 결과를 보자면 VGG는 ResNet만큼의 정확도를 보여주지는 못한다. ResNet이 등장하기 전에는 VGG가 가장 널리 쓰이는 모델이었다고 한다.
  • MobileNet : Google에 의해 제안된 모델로 작은 사이즈로 최적화되어 빠른 수행시간을 자랑한다. 이는 자원이 한정된 기기들이나 모바일 기기들에서 동작하기에 이상적이다. 작은 사이즈로 인해서, 정확도에서는 약간의 감점이 있을 수 있다.
  • CustomCNN : ImageNet 데이터들로 미리 훈련된 모델을 사용하지 않고 자신이 직접 만든 모델을 기반 모델로 사용할 수 있다. 만약 분석 모델을 적용할 분야가 간단하다면 ImageNet을 이용한 사전 훈련은 꼭 필요하지는 않다. 자신만의 모델을 사용하는 것의 또다른 이점은 적용할 분야에 따라 세부적으로 조정을 할 수 있다는 점이다.

4.2.2 Image Segmentation 모델 고르기

기반 모델을 선정했으면 다음은 Image Segmentation 모델을 고를 차례이다. Image Segmentation 모델에 대해서는 이미 앞에서 언급하였다. FCN, SetNet, UNet, PSPNet 등이 있다. 앞의 기반 모델의 경우와 마찬가지로 Image Segmentation 모델도 분석할 이미지에 따라 자신이 직접 custom으로 구현해서 적용할 수도 있다.

5. 정리

본 포스트에서 딥러닝을 통한 Image Segmentation의 개념에 대해서 알아보았다. 그리고 널리 쓰이는 유명한 모델들을 알아 보았다. 또한 모델을 구축하는 전체적인 과정을 짜는 방법과 적절한 모델을 선정하는 법도 알아보았다.

profile
바쁘게 부지런하게 논리적으로 살자!!!

0개의 댓글