본문 바로가기

프로젝트

무이메이커스_딥러닝을 활용한 Image Segmentation 프로젝트

프로젝트 진행 순서

  • 1. Image Segmentation 개요 (Overview)
  • 2. Custom Image Dataset 만들기 (Annotation)
  • 3. Segmentation 딥러닝 모델 (Modeling)
  • 4. Image 전처리 (Preprocessing)
  • 5. 다양한 모델 별 성능 평가 및 시각화 (Evaluation and Visualization)

 

안녕하세요 헬스케어 제품 개발회사 허니컴의 무이메이커스페이스 입니다.

저희는 딥러닝을 접목시킨 제품 개발을 위해 다양한 프로젝트를 수행하고,

이를 활용하여 인공지능을 지닌 다양한 헬스케어 제품을 생산하는데 그 목적이 있습니다.

이번 시간에는 딥러닝을 활용한 Pixel 단위 객체 인식 (Image Segmentation) 프로젝트를 소개하고자 합니다.

 

1. Image Segmentation 개요 (Overview)

 

이번주 저희의 목표는 Computer Vision 분야에 속하는 Image 와 관련된 문제입니다.

CS231n 에 소개된 Computer Vision Task

사진 속에 고양이가 존재하는지 (Classification), 그렇다면 해당 객체는 어디에 존재하는지 (Detection),

어떤 형상으로 존재하는지 (Segmentation) 에 관한 문제들이 존재합니다.

 

저번주 Detection 에 이어 이번주는 Segmentation 문제를 풀어볼 것입니다.

Towards Data Science 에 소개된 Classification, Detection, and Segmentation

Image Segmentation 을 통해 컴퓨터는 주어진 Image 속의 객체를 Pixel 단위로 분석하여 Object 의 위치를

보다 명확하게 해석할 수 있습니다.

Segmentation 은 또한 2가지로 나눠지는데, Pixel 단위로 전체 객체를 Classification 하는 Semantic Segmentation,

그리고 이를 기반으로 Object Detection 을 추가하여 각 객체 별로 Classification 하는 Instance Segmentation 입니다.

 

Segmentation 역시 CNN 기반의 네트워크들을 사용해 성능을 대폭 향상시켰으며,

FCN (Fully Convolutional Network) 의 개념을 시작으로 발전이 진행되고 있습니다.

FCN 의 Feature Extraction 구조

Segmentation 의 핵심은 위치 정보로, 기존 Classification 에서 사용하던 모델의 Classifier 를 제거하고

해당 Layer 에 1x1 Convolution Layer 를 추가하는 Convolutionalization 입니다.

이를 통해 위치 정보가 손실되지 않은 Image 속 Object 의 Heatmap 을 구하게 되고,

 

FCN 의 Upsampling 구조

Heatmap 을 다시 원래 Image 의 크기로 확대하는 Upsampling 을 통해 Segmentation 을 완료합니다.

 

Image Segmentation 을 하기 위한 딥러닝 모델들은 대부분 위와 유사한 개념으로

Image 를 압축시킨 Feature Map 을 추출한 뒤 다시 Upsampling 하는 과정을 지닙니다.

 

 

2. Custom Dataset 만들기 (Annotation)

 

인공지능이 Object 를 잘 검출했는지 확인하기 위해 Ground Truth 가 필요합니다.

Segmentation 된 Object Label 을 Mask 라고 부르며, 해당 정보를 만들기 위한 Toolbox 가 필요합니다.

 

Python 에서 처리하고 싶다면 Labelme (https://github.com/wkentaro/labelme),

그 외는 Labelbox(https://labelbox.com), Rectlabel (https://rectlabel.com/) 등

자신의 컴퓨터 환경에 맞는 Toolbox 를 사용하시면 됩니다.

 

Labelme Github 에서 제공하는 Description

그러나 Custom Dataset 을 구성하는 것은 많은 시간이 소요됩니다.

이번 프로젝트에서는 기존에 제공되는 Dataset 을 사용하여 진행하고자 합니다.

 

 

3. 딥러닝 모델 (Modeling)

 

1) FCN (https://arxiv.org/abs/1411.4038)

 

FCN 은 Segmentation 에 딥러닝을 적용한 시초와 같은 논문입니다.

Overview 에 적은 Image 의 Downsampling, Upsampling 을 기반으로 Segmentation 을 진행합니다.

Backbone 으로 다양한 CNN 구조의 모델들을 사용할 수 있으나,

저희는 Pytorch 에서 제공하는 resnet50 과 101 이 있으나, 현재 resnet50 은 사용이 불가하여, 101을 사용해보았습니다.

해당 모델은 Pascal VOC Dataset 을 통해 학습되었고, 다음과 같은 20개의 클래스와 배경을 합친 21개의 클래스입니다.

Aeroplane

Bicycle

Bird

Boat

Bottle

Bus

Car

Cat

Chair

Cow

Dining Table

Dog

Horse

Motorbike

Person

Potted  Plant

Sheep

Sofa

Train

Tv/Monitor

사전에 학습된 모델을 그대로 사용할 것이므로, pretrain 을 True 로 바꾸고 eval 모드 설정을 해줍니다.

(Segmentation 을 원하는 Image 의 클래스가 존재하지 않는다면,

Detection 프로젝트에서 진행했던 Transfer Learning 을 참고하여 학습하거나

Classification 프로젝트에서 진행했던 CNN 모델을 쌓아 학습하시면 됩니다.)

   from torchvision import models
   
   fcn = models.segmentation.fcn_resnet101(pretrained=True)
   fcn.eval()

 

2) Deeplabv3 (https://arxiv.org/abs/1606.00915)

 

Deeplab 은 Downsampling 과정에서 Pooling 에 의한 공간 손실을 줄이기 위해,

Astrous Convolution 이라는 개념을 가져와서 Segmentation 을 진행합니다.

 

Astrous Convolution 적용 시 위치 정보 보존 정도

FCN 과 마찬가지로 Pytorch 의 모델을 그대로 가져옵니다.

from torchvision import models

deeplab = models.segmentation.deeplabv3_resnet101(pretrained=True)
deeplab.eval()

 

 

3) Mask R-CNN (https://arxiv.org/abs/1703.06870)

 

위 2가지 모델은 Overview 에서 소개한 Semantic Segmentation 의 종류입니다.

Mask R-CNN 은 Detection 에서 사용되었던 R-CNN 의 변형으로, Instance Segmentation 모델입니다.

 

Mask R-CNN 의 개념도

Detection 에서 사용된 개념처럼 Image 의 Region 을 지정해주고,

ROIAlign 이란 Bilinear Interpolation 방법을 적용하여 Feature Map 을 추출한 뒤

FCN 을 수행하여 Object 의 정보와 Mask 의 정보까지 얻을 수 있게 됩니다.

마찬가지로 Pytorch 에서 Pretrain 된 모델을 불러와 적용하겠습니다.

from torchvision import models

maskrcnn = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True)
maskrcnn.eval()

  

4. Image 전처리 (Preprocessing)

 

이번 프로젝트는 학습이 완료된 모델을 가져와 사용하는 것으로,

Segmentation 을 원하는 Image 를 가져와 Classification 프로젝트 때 사용한 Transform 을 적용하면 됩니다.

Image 의 크기나 화질 등을 고려하여 전처리를 진행하시면 됩니다.

import torchvision.transforms as T
from PIL import Image

image = Image.open('Dir')

transform = T.Compose([T.Resize(400), T.CenterCrop(224), T.ToTensor(),
                 T.Normalize(mean=[0.485, 0.456, 0.406],
                             std=[0.229, 0.224, 0.225])])
# Resize, Centercrop 등 ToTensor 를 제외한 수치들은 Image 에 맞게 바꿔주시면 됩니다.

img = transform(image)

 

5. 모델 별 성능 및 시각화 (Evlautaion and Visualization)

 

원본 Image
FCN (좌), Deeplabv3 (중), Mask-RCNN (우) 를 적용한 Image

 

 

원본 Image
FCN (좌), Deeplabv3 (중), Mask-RCNN (우) 를 적용한 Image

 

원본 Image
FCN (좌), Deeplabv3 (중), Mask-RCNN (우) 를 적용한 Image

 

인터넷에서 적당히 구한 Image 를 통해 Test 를 진행하였습니다.

첫 번째 사진은 가장 이상적으로 구현된 결과물을 볼 수 있었으나,

두 번째의 경우 배경의 Blur 처리된 사람들의 일부도 인식하는 문제가 있고,

세 번째의 경우 FCN 과 Deeplabv3 에선 Car (회색) 과 Motorbike (청록색) 를 혼동하였고

동시에 차량 뒷부분에 대해선 인식하지 못하는 문제점이 있습니다.

 

Mask-RCNN 역시 차량을 완벽하게 Detecting, Masking 해내지 못했고,

이는 학습 때 사용된 차량의 대부분이 일반 승용차이기에 스포츠카의 특수함을 반영하지 못한 것 같습니다.

 

이렇듯 이미 학습된 모델은 학습 때 사용된 클래스와 다른 Image 의 경우 인식에 문제점이 있으므로,

Custom Dataset 을 구축하여 Transfer Learning 을 통해 학습하여 사용하는 것이 권장됩니다.  

 

 

허니컴 메이커스페이스는 데이터에 따라 다양한 방향으로 딥러닝 모델을 적용해보며 '정답' 에 근접한 모델을 생성하고,

이를 사람들이 이해하기 쉽도록 시각화와 같은 방법을 통해 설명해나가고자 합니다.

 

........

시제품 제작 문의