这篇博客主要记录了我实现Mask R-CNN中demo的过程,及遇到问题的解决办法。源码下载地址稍后给出。
实现Mask R-CNN的demo一共需要下载以下两个文件:
上面两个文件可以从网盘下载:
链接: https://pan.baidu.com/s/1qC5Rguvoyrppp4lZsa1TaQ 密码: satp
关于基于pycharm的tensorflow环境配置在我之前的这篇博客环境配置。这里主要列出软件和各种库的版本:
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
在Ms coco上训练数据时需要安装pycocotools,具体方法参见这个博客。
这两个都是使用python非常方便的工具,mask-rcnn的源码是在Jupyter上跑的,而我选择的是Pycharm。所有会有部分地方的代码需要调整,主要就是从ipynb类型的文件中把代码拷出来粘贴到新的python文件中。
pycharm作为一个强大的IDE,上面的大部分库可以直接在pycham中安装:
file->settings->Project->project Interpreter,出现如下效果:
点击右上角的+符号,在出来的界面搜索框输入需要安装的库名称,在右下角可以选择安装的版本。一切都很方便。
首先把下载的mask rcnn源码解压到任意文件,在pycharm中新建项目,把解压后的全部文件拷贝到pycham中新建项目的根目录中。同时把训练好的权重文件mask_rcnn_coco.h5也拷贝过去。
项目结构如下:
图片展示的目录结构有部分是我自己添加的代码,没有影响。
以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文件。
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文件夹中随机选择一张图片进行检测,效果如下:
首先,前面的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是jupyter编辑器中的内置函数,使用它可以绘制出处理过的图片。但是因为它是内置在jupyter中的,所以在pycharm中不可用。这里在pycharm中的解决办法主要就是注释掉%matplotlib inline,然后在代码的最后加上:
plt.show()
关于这个问题的详细介绍可以参考这个博客。
这个问题就是上面说的到%matplotlib inline代码出错问题,加下列代码就可以了。
plt.show()