프로젝트 진행 순서
- 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 와 관련된 문제입니다.
사진 속에 고양이가 존재하는지 (Classification), 그렇다면 해당 객체는 어디에 존재하는지 (Detection),
어떤 형상으로 존재하는지 (Segmentation) 에 관한 문제들이 존재합니다.
저번주 Detection 에 이어 이번주는 Segmentation 문제를 풀어볼 것입니다.
Image Segmentation 을 통해 컴퓨터는 주어진 Image 속의 객체를 Pixel 단위로 분석하여 Object 의 위치를
보다 명확하게 해석할 수 있습니다.
Segmentation 은 또한 2가지로 나눠지는데, Pixel 단위로 전체 객체를 Classification 하는 Semantic Segmentation,
그리고 이를 기반으로 Object Detection 을 추가하여 각 객체 별로 Classification 하는 Instance Segmentation 입니다.
Segmentation 역시 CNN 기반의 네트워크들을 사용해 성능을 대폭 향상시켰으며,
FCN (Fully Convolutional Network) 의 개념을 시작으로 발전이 진행되고 있습니다.
Segmentation 의 핵심은 위치 정보로, 기존 Classification 에서 사용하던 모델의 Classifier 를 제거하고
해당 Layer 에 1x1 Convolution Layer 를 추가하는 Convolutionalization 입니다.
이를 통해 위치 정보가 손실되지 않은 Image 속 Object 의 Heatmap 을 구하게 되고,
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 를 사용하시면 됩니다.
그러나 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 을 진행합니다.
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 모델입니다.
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 를 통해 Test 를 진행하였습니다.
첫 번째 사진은 가장 이상적으로 구현된 결과물을 볼 수 있었으나,
두 번째의 경우 배경의 Blur 처리된 사람들의 일부도 인식하는 문제가 있고,
세 번째의 경우 FCN 과 Deeplabv3 에선 Car (회색) 과 Motorbike (청록색) 를 혼동하였고
동시에 차량 뒷부분에 대해선 인식하지 못하는 문제점이 있습니다.
Mask-RCNN 역시 차량을 완벽하게 Detecting, Masking 해내지 못했고,
이는 학습 때 사용된 차량의 대부분이 일반 승용차이기에 스포츠카의 특수함을 반영하지 못한 것 같습니다.
이렇듯 이미 학습된 모델은 학습 때 사용된 클래스와 다른 Image 의 경우 인식에 문제점이 있으므로,
Custom Dataset 을 구축하여 Transfer Learning 을 통해 학습하여 사용하는 것이 권장됩니다.
허니컴 메이커스페이스는 데이터에 따라 다양한 방향으로 딥러닝 모델을 적용해보며 '정답' 에 근접한 모델을 생성하고,
이를 사람들이 이해하기 쉽도록 시각화와 같은 방법을 통해 설명해나가고자 합니다.
........
시제품 제작 문의
'프로젝트' 카테고리의 다른 글
무이메이커스_간 (GAN) 을 활용한 인공지능 (AI) 이미지 생성 (Image Generation) 딥러닝 프로젝트 (0) | 2019.08.09 |
---|---|
무이메이커스_딥러닝을 활용한 자연어 처리 프로젝트 (NLP Classification) (1/2) (0) | 2019.07.12 |
무이메이커스_데이터를 활용한 이강인 플레이 분석 (1) | 2019.07.04 |
무이메이커스_딥러닝을 활용한 객체 인식 프로젝트 (Object Detection) (2/2) (0) | 2019.06.28 |
무이메이커스_딥러닝을 활용한 객체 인식 프로젝트 (Object Detection) (1/2) (0) | 2019.06.21 |