You are on page 1of 11

Các bước triển khai Mask R-CNN cho bài toán Image

Segmentation

1. Phân loại bài toán image segmentation


Bài toán image segmentation được chia làm 2 loại:
 Semantic segmentation: Thực hiện segment với việc phân chia từng lớp
khác nhau: ví dụ trong một ảnh đang xuất hiện 3 class bao gồm: người,
đèn giao thông , ô tô thì sẽ thực hiện segment với tất cả người vào 1 lớp,
ô tô vào 1 lớp và đèn giao thông 1 lớp.
 Instance segmentation: Thực hiện segment với từng đối tượng riêng biệt
trong cùng 1 lớp. Ví dụ: ảnh có 3 người thì sẽ thực hiện segment riêng
biệt 3 người này thành 3 vùng khác nhau.

2. Mask R-CNN
Mask R-CNN là phần mở rộng của Faster R-CNN. Faster R-CNN được sử dụng
rất nhiều trong các bài toán phát hiện đối tượng. Khi cho một hình ảnh vào
Faster R-CNN sẽ trả ra nhãn và bounding box của từng đối tượng cụ thể trong
một hình ảnh.
‘The Mask R-CNN framework is built on top of Faster R-CNN’. Khi cho một
hình ảnh vào ngoài việc trả ra label và bounding box của từng object trong một
hình ảnh thì nó sẽ thêm các object mask.

Cách hoạt động của Faster R-CNN:


 Trước tiên nó sẽ sử dụng ConvNet để trích xuất các đặc trưng từ hình ảnh
đầu vào.
 Các tính năng này sau đó được chuyển qua một Region Proposal
Network (RPN) sau đó sẽ trả về các bounding box tại các vùng có thể có
đối tượng với các kích thước khác nhau.
 Sau đó thêm vào lớp RoI pooling layer với mục đích gộp tất cả các
bounding box trên cùng 1 đối tượng với các kích thước khau nhau về
cùng 1 kích cỡ.
 Và cuối cùng được chuyển tới một fully connected layer để phân loại và
đầu ra là 1 bounding box cho đối tượng.
Backbone Model
Tương tự như ConvNet trong Faster R-CNN thì trong Mask R-CNN được tác
giả sử dụng kiến trúc Resnet101 để trích xuất thông tin từ hình ảnh đầu vào.

Region Proposal Network (RPN)


Trong bước này model sử dụng tính năng được trích xuất áp dụng vào mạng
RPN để dự đoán đối tượng có trong khu vực đó hay không. Sau bước này chúng
ta sẽ thu được bounding box tại các vùng có thể có đối tượng từ mô hình dự
đoán.

Region of Interest (RoI)


Các bounding box từ các khu vực phát hiện đối tượng sẽ có những kích thước
khác nhau nên qua bước này sẽ gộp toàn bộ các bounding box đó về 1 kích
thước nhất định tại 1 đối tượng. Tiếp theo, các vùng này được chuyển qua một
fully connected layer để dự đoán nhãn lớp và hộp giới hạn. Đối tượng sẽ có rất
nhiều bounding box với các kích thước khác nhau sau đó nó sẽ được loại bỏ dần
qua việc tính toán IOU như sau:

IoU = Area of the intersection / Area of the union

Hay là vùng giao nhau giữa bounding box dự đoán và bounding box thực tế
chia cho bounding box thực tế. Nếu IOU lớn hơn hoặc bằng 0.5 thì sẽ quan tâm
còn nhỏ hơn thì sẽ loại bỏ. Ví dụ
Ta có thể thấy box1 và box2 sẽ IOU nhỏ hơn 0.5 nên nó gọi là vùng loại bỏ còn
box3 và box4 là vùng lớn hơn hoặc bằng 0.5 nên nó sẽ gọi là vùng quan tâm.

Segmentation Mask
Chúng ta có ROI dựa trên những giá trị IOU qua việc tính toán nên tác giả đã
thêm một nhánh mask vào trong kiến trúc hiện đại.

Bước cuối cùng trong Mask R-CNN nơi chúng ta dự đoán mask cho tất cả các
đối tượng trong ảnh như hình dưới đây.
3. Các bước triển khai
Bước 1: Clone the repository

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

Bước 2: Cài đặt các thư viện liên quan

numpy
scipy
Pillow
cython
matplotlib
scikit-image
tensorflow>=1.3.0
keras>=2.0.8
opencv-python
h5py
imgaug
IPython

Bước 3: Download the pre-trained weights

https://github.com/matterport/Mask_RCNN/releases

Bước 4: Predicting for our image

Cuối cùng cta sử dụng Mask R-CNN với các weight để dự đoán và tạo mask
cho hình ảnh.

import os
import sys
import random
import math
import numpy as np
import skimage.io
import matplotlib
import matplotlib.pyplot as plt

# Root directory of the project


ROOT_DIR = os.path.abspath("../")

import warnings
warnings.filterwarnings("ignore")

# Import Mask RCNN


sys.path.append(ROOT_DIR) # To find local version of the library
from mrcnn import utils
import mrcnn.model as modellib
from mrcnn import visualize
# Import COCO config
sys.path.append(os.path.join(ROOT_DIR, "samples/coco/")) # To find local
version
import coco

%matplotlib inline
Tiếp theo chúng ta sẽ định nghĩa đường dẫn cho pretrained weight và hình ảnh
qua đoạn code dưới đây :

# Directory to save logs and trained model


MODEL_DIR = os.path.join(ROOT_DIR, "logs")

# Local path to trained weights file


COCO_MODEL_PATH = os.path.join('', "mask_rcnn_coco.h5")

# Download COCO trained weights from Releases if needed


if not os.path.exists(COCO_MODEL_PATH):
utils.download_trained_weights(COCO_MODEL_PATH)

# Directory of images to run detection on


IMAGE_DIR = os.path.join(ROOT_DIR, "images")

class InferenceConfig(coco.CocoConfig):
# Set batch size to 1 since we'll be running inference on
# one image at a time. Batch size = GPU_COUNT * IMAGES_PER_GPU
GPU_COUNT = 1
IMAGES_PER_GPU = 1

config = InferenceConfig()
config.display()
Chúng ta có thể nhìn thấy từ hình ảnh trên với model Mask R- CNN sử dung
resnet101 với kích thước mask trả về là 28x28 được training trên bộ dữ liệu
Coco và có tổng cộng 81 class bao gồm cả background. Tiếp theo chúng ta sẽ
tạo ra model và load pretrain weight

# Create model object in inference mode.


model = modellib.MaskRCNN(mode="inference",
model_dir='mask_rcnn_coco.hy', config=config)

# Load weights trained on MS-COCO


model.load_weights('mask_rcnn_coco.h5', by_name=True)
Định nghĩa các lớp của bộ dữ liệu coco

# COCO Class names


class_names = ['BG', 'person', 'bicycle', 'car', 'motorcycle', 'airplane',
'bus', 'train', 'truck', 'boat', 'traffic light',
'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird',
'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear',
'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie',
'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball',
'kite', 'baseball bat', 'baseball glove', 'skateboard',
'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup',
'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed',
'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote',
'keyboard', 'cell phone', 'microwave', 'oven', 'toaster',
'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
'teddy bear', 'hair drier', 'toothbrush']

Chúng ta cùng load hình ảnh lên và show xem ảnh nhé :

# Load a random image from the images folder


image = skimage.io.imread('sample.jpg')

# original image
plt.figure(figsize=(12,10))
skimage.io.imshow(image)
Chúng ta cùng đưa hình ảnh vào model và tận hưởng thành quả thôi nào:

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

# Visualize results
r = results[0]
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'],
class_names, r['scores'])

You might also like