导言
这篇博客主要记录了我实现Mask R-CNN中demo的过程,及遇到问题的解决办法。源码下载地址稍后给出。
实现Mask R-CNN的demo一共需要下载以下两个文件:
1、Mask R-CNN源码
2、训练好的权重mask_rcnn_coco.h5
上面两个文件可以从网盘下载:
链接: https://pan.baidu.com/s/1qC5Rguvoyrppp4lZsa1TaQ 密码: satp
一、环境配置信息
关于基于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、工具说明
在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_DIR = os.getcwd()
MODEL_DIR = os.path.join(ROOT_DIR, "logs")
COCO_MODEL_PATH = "mask_rcnn_coco.h5"
IMAGE_DIR = os.path.join(ROOT_DIR, "images")
class InferenceConfig(coco.CocoConfig):
GPU_COUNT = 1
IMAGES_PER_GPU = 1
cOnfig= InferenceConfig()
config.display()
model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR, cOnfig=config)
model.load_weights(COCO_MODEL_PATH, by_name=True)
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']
file_names = next(os.walk(IMAGE_DIR))[2]
image = skimage.io.imread(os.path.join(IMAGE_DIR, random.choice(file_names)))
results = model.detect([image], verbose=1)
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)
Create model object in inference mode.
Load weights trained on MS-COCO
class names
Load a random image from the images folder
Run detection
Visualize results
Plt.show()
三、遇到的问题及解决方法
%matplotlib inline代码出错
这是因为%matplotlib inline是jupyter编辑器中的内置函数,使用它可以绘制出处理过的图片。但是因为它是内置在jupyter中的,所以在pycharm中不可用。这里在pycharm中的解决办法主要就是注释掉%matplotlib inline,然后在代码的最后加上:
plt.show()
关于这个问题的详细介绍可以参考这个博客。
在pycharm中显示训练过的图片
这个问题就是上面说的到%matplotlib inline代码出错问题,加下列代码就可以了。
plt.show()