Mask R-CNN Customize해서 나만의 디텍션 모델 만들기.
본문 바로가기
Coding Project

Mask R-CNN Customize해서 나만의 디텍션 모델 만들기.

by Migos 2020. 2. 21.
반응형

Mask R-CNN은 Instance Segmentation task를 위해 태어난 놈이다. 메디칼분야를 비롯해 많은 분야에 적용되는 딥러닝 모델로 나는 사람의 객체를 찾고 아웃라인 테두리를 오려내서 배경을 지우는 용도로 쓸 예정이다. 

 

나와 비슷하게 혹은 다른 용도로 사용하고싶은데 어디부터 시작해야할 지 모르겠다면 그대로 따라해보자.

 우선 이번 포스팅에서는 대표적으로 많이 사용하는 Balloon Dataset을 활용해서 라벨링하고 학습시켜서 풍선을 찾아내는 모델을 만들어 보고, 다음 포스팅에서 동일한 방법으로 사람을 찾고 테두리를 따내는 모델을 만들어 보자.

 

▶Loading the Dataset

1) Command 창에서 내 루트(root)폴더로 이동한다. (나는 바탕화면-coding 폴더로 이동했다.)

        ㄴ 이동방법은 커맨드창에서 cd 가고싶은 폴더/그다음 가고싶은 폴더/또 그다음 가고싶은 폴더 

            (예시 : > cd Dekstop/coding/ 하고 엔터)

 

2) 아래 코드 입력 (그러면 MaskRCNN 폴더가 생길 것이다.)

git clone https://github.com/matterport/Mask_RCNN.git 

이제 Root FolderMask_RCNN 폴더라고 하자.

그리고 samples - balloon 폴더로 이동하면 우리가 하고자 하는 풍선 디텍션 관련 페이지가 나온다.

아래 보이는 balloon.py 파일을 구동해서 학습을 진행할 것이다.

Training Dataset (훈련용 데이터셋 만들기)

▷balloon_dataset 이미지 다운 (링크)

다운받은 zip 파일을 Mask_RCNN-samples-balloon 폴더에 넣고 압축을 풀어준다.

(압축을 풀면 MAC OS용 데이터셋 폴더가 같이 있는데, 필자는 삭제하고 balloon 폴더만 위와 같이 빼서 저장했다.)

 

VGG Annotator 라벨링 하는 사이트 접속(링크) -사진 업로드(Add Files)-폴리곤(polygon 클릭)-풍선테두리 클릭-엔터-완료 후 상단 'Annotation'-'Export Annotation(as json)' 클릭 후 balloon 폴더에 train 이미지를 라벨링한 json파일은 train폴더에, val용은 val 폴더에 각각 저장하였다. 

 

               (아래 영상 참고)

 

 

▶Training

커맨드창에서 balloon.py가 있는 폴더로 이동 후 아래 코드 입력.

(Step1 폴더이동 : cd C:/Users/ICOMAN/Desktop/coding/Mask_RCNN/samples/balloon)

(Step2 balloon.py 구동:

python balloon.py train 

--dataset='C:\Users\ICOMAN\Desktop\coding\Mask_RCNN\samples\balloon\balloon' 

--weights=coco)

%cd C:/Users/ICOMAN/Desktop/coding/Mask_RCNN/samples/balloon

# python '실행파일(balloon.py)경로' train --dataset='데이터셋(balloon)경로' --weights=coco
python balloon.py train --dataset='C:\Users\ICOMAN\Desktop\coding\Mask_RCNN\samples\balloon\balloon' --weights=coco

 

▶학습된 모델 검증단계 (inspect_balloon_model.ipynb)

inspect_balloon_model.ipynb 를 열고 직접 수정해야 할 부분은 "여기 수정하세요 " 주석으로 표시해 두었다. 

  • 14번째 줄 ROOT_DIR 를 내 드라이브 상 Mask_RCNN 폴더 경로로 수정               
  • 34번째 줄 BALLON_WEIGHTS_PATH 를 내 weight가 저장된 경로로 수정                 

구글 코랩에서 경로 복사하는 방법 : 왼쪽 드라이브에서 원하는 폴더 우클릭-경로복사

 

import os
import sys
import random
import math
import re
import time
import numpy as np
import tensorflow as tf
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.patches as patches

# Root directory of the project
ROOT_DIR = os.path.abspath("C:\Users\ICOMAN\Desktop\coding\Mask_RCNN") # 여기 수정하세요

# Import Mask RCNN
sys.path.append(ROOT_DIR)  # To find local version of the library
from mrcnn import utils
from mrcnn import visualize
from mrcnn.visualize import display_images
import mrcnn.model as modellib
from mrcnn.model import log

from samples.balloon import balloon

%matplotlib inline 

# Directory to save logs and trained model
MODEL_DIR = os.path.join(ROOT_DIR, "logs")

# Path to Ballon trained weights
# You can download this file from the Releases page
# https://github.com/matterport/Mask_RCNN/releases
BALLON_WEIGHTS_PATH = "C:\Users\ICOMAN\Desktop\coding\Mask_RCNN/mask_rcnn_coco.h5"  # 여기 수정하세요
config = balloon.BalloonConfig()
# balloon dataset 있는 경로로 수정!
BALLOON_DIR = 'C:\Users\ICOMAN\Desktop\coding\Mask_RCNN\samples\balloon\balloon\' # 여기 수정하세요
# 그대로 실행
# Override the training configurations with a few
# changes for inferencing.
class InferenceConfig(config.__class__):
    # Run detection on one image at a time
    GPU_COUNT = 1
    IMAGES_PER_GPU = 1

config = InferenceConfig()
config.display()
# 못먹어도 GPU!
DEVICE = "/gpu:0"  # /cpu:0 or /gpu:0

# Inspect the model in training or inference modes
# values: 'inference' or 'training'
# TODO: code for 'training' test mode not ready yet
TEST_MODE = "inference"
# 그대로 실행
def get_ax(rows=1, cols=1, size=16):
    """Return a Matplotlib Axes array to be used in
    all visualizations in the notebook. Provide a
    central point to control graph sizes.
    
    Adjust the size attribute to control how big to render images
    """
    _, ax = plt.subplots(rows, cols, figsize=(size*cols, size*rows))
    return ax

 

검증용데이터셋 불러오기(Load Validation Datset)

# Load validation dataset
dataset = balloon.BalloonDataset()
dataset.load_balloon(BALLOON_DIR, "val")

# Must call before using the dataset
dataset.prepare()

print("Images: {}\nClasses: {}".format(len(dataset.image_ids), dataset.class_names))

 

학습된 모델 불러오기(Load model)

# Create model in inference mode
with tf.device(DEVICE):
    model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR,
                              config=config)
                              
# 그대로 실행
weights_path = model.find_last()

# Load weights
print("Loading weights ", weights_path)
model.load_weights(weights_path, by_name=True)

 

그림으로 표시해서 확인해보기

image_id = random.choice(dataset.image_ids)
image, image_meta, gt_class_id, gt_bbox, gt_mask =\
    modellib.load_image_gt(dataset, config, image_id, use_mini_mask=False)
info = dataset.image_info[image_id]
print("image ID: {}.{} ({}) {}".format(info["source"], info["id"], image_id, 
                                       dataset.image_reference(image_id)))

# Run object detection
results = model.detect([image], verbose=1)

# Display results
ax = get_ax(1)
r = results[0]
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'], 
                            dataset.class_names, r['scores'], ax=ax,
                            title="Predictions")
log("gt_class_id", gt_class_id)
log("gt_bbox", gt_bbox)
log("gt_mask", gt_mask)

 

ps. 구글 코랩에서 작동시킨 결과 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글