1. 程式人生 > >Mask R-CNN的程式碼實現

Mask R-CNN的程式碼實現

導言

這篇部落格主要記錄了我實現Mask R-CNN中demo的過程,及遇到問題的解決辦法。原始碼下載地址稍後給出。
實現Mask R-CNN的demo一共需要下載以下兩個檔案:

2、訓練好的權重mask_rcnn_coco.h5

一、環境配置資訊

關於基於pycharm的tensorflow環境配置在我之前的這篇部落格環境配置。這裡主要列出軟體和各種庫的版本:

1、配置資訊

ubuntu 16.04
pycharm 2018.1.2
python 3.5.2
tensorflow-gpu 1.4.0
cuda 8.0. #使用nvcc -V 檢視
cudnn

6.0
numpy 1.14.2
skimage 0.13.1
keras 2.0.8
scipy 1.0.1
pip 10.0.1

2、工具說明

1)、pycocotools

在Ms coco上訓練資料時需要安裝pycocotools,具體方法參見這個部落格

2)、關於Jupyter和Pycharm

這兩個都是使用python非常方便的工具,mask-rcnn的原始碼是在Jupyter上跑的,而我選擇的是Pycharm。所有會有部分地方的程式碼需要調整,主要就是從ipynb型別的檔案中把程式碼拷出來貼上到新的python檔案中。

3、在pycharm中安裝上述庫

pycharm作為一個強大的IDE,上面的大部分庫可以直接在pycham中安裝:
file->settings->Project->project Interpreter,出現如下效果:
這裡寫圖片描述
點選右上角的+符號,在出來的介面搜尋框輸入需要安裝的庫名稱,在右下角可以選擇安裝的版本。一切都很方便。

二、程式碼結構說明

1、專案目錄

首先把下載的mask rcnn原始碼解壓到任意檔案,在pycharm中新建專案,把解壓後的全部檔案拷貝到pycham中新建專案的根目錄中。同時把訓練好的權重檔案mask_rcnn_coco.h5也拷貝過去。
專案結構如下:
這裡寫圖片描述

2、檔案概述

圖片展示的目錄結構有部分是我自己新增的程式碼,沒有影響。
以ipynb結尾的檔案是基於Jupyter的,就是code+markdown的模式。
如果想要在pycharm中執行,可以把每個ipynb型別檔案中的程式碼拷貝出來,放到一個新建的python檔案中執行。
首先介紹一下每個檔案的大概作用,來源於matterport-Mask_RCNN官方教程翻譯

demo.ipynb 最簡單的開始方式。展示了使用一個在MS COCO上預訓練的模型在你的圖片上實現影象分割。包括了在任意圖片上實現影象檢測和例項分割的程式碼。
train_shapes.ipynb 展示了怎麼訓練Mask R-CNN用自己的資料集。這個教程包括了一個玩具資料集來演示訓練一個新資料集。
Visualize 檔案主要是實現視覺化的結果
inspect_data.ipynb 這個教程展示了不同的預處理步驟來準備訓練資料
inspect_model.ipynb 這個教程深度解析了mask rcnn執行目標檢測和語義分割的每一步。
inspect_weights.ipynb 這個教程考察了訓練模型的權重,尋找異常值和反常的模式。
這裡主要是實現demo.ipynb檔案。

3、執行demo.ipynb

demo.ipynb是一個簡單的mask-rcnn的小例子。它實現了從images資料夾中隨機選擇一個圖片進行檢測標記。
首先把demo.ipynb中程式碼拷貝出來放入新的python檔案中,如下:

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

import coco
import utils
import model as modellib
import visualize

%matplotlib inline 

# Root directory of the project
ROOT_DIR = os.getcwd()

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

# Local path to trained weights file
COCO_MODEL_PATH =  "mask_rcnn_coco.h5"


# 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()


# Create model object in inference mode.
model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=config)

# Load weights trained on MS-COCO
model.load_weights(COCO_MODEL_PATH, by_name=True)


# COCO Class names
# Index of the class in the list is its ID. For example, to get ID of
# the teddy bear class, use: class_names.index('teddy bear')
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']



# Load a random image from the images folder
file_names = next(os.walk(IMAGE_DIR))[2]
image = skimage.io.imread(os.path.join(IMAGE_DIR, random.choice(file_names)))

# 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'])

注意到%matplotlib inline這句程式碼出錯,解決辦法就是註釋掉這句程式碼,原因我寫在了第三部分。
這裡還需要在程式碼最後新增一句程式碼:

plt.show()

這樣就可以直接執行,會在images資料夾中隨機選擇一張圖片進行檢測,效果如下:

這裡寫圖片描述

4、demo.ipynb中程式碼詳解

首先,前面的import是引入的各種庫檔案以及實現mask rcnn的部分python檔案。

class InferenceConfig(coco.CocoConfig)
#整個訓練模型的配置資訊類,從coco.CocoConfig函式中讀取配置資訊。主要包括:GPU_COUNT,IMAGES_PER_GPU等。
#最後使用config.display()輸出配置資訊在控制面板。
#其中,model.py檔案開頭說明了tensorflow和keras的版本要求。

Create model object in inference mode.
#Model的建立,主要是呼叫model.MaskRCNN()。
#model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=config)

Load weights trained on MS-COCO
#給上一步建立的model物件載入weights,使用方式:
#model.load_weights(COCO_MODEL_PATH, by_name=True)

class names
#該模型將物件分類並返回類id,這些id是標識每個類的整數值。一些資料集將整型值分配給它們的類,而有些則沒有。例如,在MS-COCO資料#集中,“person”類是1,“teddy bear”是88。ID通常是連續的,但並不總是如此。例如,COCO資料集有與類IDs 70和72相關的類,而不#是71。

Load a random image from the images folder
#從名為images的資料夾中隨機載入要進行訓練的圖片

Run detection
#呼叫model.detect()函式進行目標檢測訓練。

Visualize results
#實現視覺化的結果,呼叫visualize.display_instances()函式。

Plt.show()
#import matplotlib.pyplot as plt,繪製出處理過的圖片。

三、遇到的問題及解決方法

%matplotlib inline程式碼出錯

這是因為%matplotlib inline是jupyter編輯器中的內建函式,使用它可以繪製出處理過的圖片。但是因為它是內建在jupyter中的,所以在pycharm中不可用。這裡在pycharm中的解決辦法主要就是註釋掉%matplotlib inline,然後在程式碼的最後加上:

plt.show()

關於這個問題的詳細介紹可以參考這個部落格

在pycharm中顯示訓練過的圖片

這個問題就是上面說的到%matplotlib inline程式碼出錯問題,加下列程式碼就可以了。

plt.show()