MaskRCNN环境部署及训练自己数据
MaskRCNN是属于实物分割算法,进行多任务深度学习的算法,能够完成目标分类、目标检测、实例分割等多种任务,是一石多鸟的多任务网络模型的典型代表。接下来简单描述如何在windows/linux环境中部署和利用MaskRCNN完成自己数据集的训练。
1、环境
Mask R-CNN是基于Python3,Keras,TensorFlow。
- Python 3.4+(自行安装,或安装Anaconda也可,本文为Python 3.6)
- Jupyter Notebook
- TensorFlow>=1.3.0
- Keras>=2.0.8
- numpy、scipy、Pillow、cython、matplotlib、scikit-image、opencv-python、h5py、imgaug、IPython[all]
2、MaskRCNN算法部署
- 源代码下载
将代码文件夹命名为入Mask_RCNN
- 安装依赖环境
进入Mask_RCNN目录下,运行指令:
pip3 install –r requirements.txt
注:此步安装了numpy、scipy、Pillow、cython、matplotlib、scikit-image、tensorflow>=1.3.0、keras>=2.0.8、opencv-python、h5py、imgaug、IPython[all]。在安装过程中可能会遇到部分包安装不成功的情况,可以单独采用pip
install命令单独安装。也可能依旧出现同样的错误,比如window环境下安装shaply的时候容易报错,OS
Error:找不到指定模块。解决方法是:到https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely,下载和你的python版本对应的shapely.whl,比如我的是64位,python3.6,下载后接着运行如下命令:
python -m pip install Shapely-1.6.4.post1-cp36-cp36mwin_amd64.whl
于是Shapely安装成功。
- 下载训练好的COCO权重mask_rcnn_coco.h5
- 官网的下载地址为:https://github.com/matterport/Mask_RCNN/releases,下载mask_rcnn_coco.h5,把它放在Mask_RCNN-master目录下。
- 安装pycocotools
下载和运行命令:
- linux环境下:
git clone https://github.com/matterport/Mask_RCNN/releases
cd cocoapi/PythonAPI
python3 setup.py build_ext --inplace
python3 setup.py build_ext install
- window环境下
pip install
git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI
或者登陆网站,下载压缩包,cocoapi-master.zip,解压后进入PythonAPI,运行
python setup.py build_ext install
注:必须安装Visual Studio C++。
- 安装jupyter notebook
运行命令:
pip install jupyter
执行jupyter notebooks只需在命令行里输入:
jupyter notebook
- 运行demo.ipynb
至此Mask
R-CNN的环境就全部配置好啦,我们可以Mask_RCNN-master/samples/demo.ipynb开始运行。在浏览器打开页面,点击进入
samples目录,点击demo.ipynp进入代码运行页面
选择Cell菜单,在Cell下拉菜单选择Run
All,稍等片刻,在该页面底部或新窗口中会输出运行结果。
demo.ipynb展示了一个使用MS
COCO预先训练的模型来分割自己图像中的对象的例子, 它包括在任意图像上运行对象检测和实例分割的代码,在代码中,demo分割的图像随机来源于Mask_RCNN/images。也可以将demo.ipynb转化为demo.py进行运行。方式是打开jupyter
notebooks,从Mask_RCNNr/samples/demo.ipynb,在File中选择Download
as中点击Python(.py),
后台运行结果:
训练自己样本
3.1 制作数据集
- 安装labelme及使用
源代码及其他环境下的安装可参照:
https://github.com/wkentaro/labelme
在此主要介绍windows下的安装步骤,linux环境下可参考上述网址内介绍的。
- Anaconda的安装
首先安装Anaconda,
下载连接为:https://www.anaconda.com/download/#linux。
安装教程为:https://docs.anaconda.com/anaconda/install/windows。
安装成功后,打开Anaconda Prompt,然后依次输入以下命令。
# python3
conda create --name=labelme python=3.6
conda activate labelme
pip install pyqt5
conda install pillow
pip install labelme
以上都成功后,打开Anaconda
Prompt,进入Anaconda根目录下,输入labelme,打开labelme。
注意标注时,起点要和终端重合才能进行下一个目标的标注。
- 对json文件的解析
每张图片都会生成对应的json文件。接下里就是解析json文件。
以第一个样本为例,解析json文件时,在命令行输入以下进行转化:
在labelme打开的目录下新建一个json文件,存放所有需要解析的json文件,再建立labelme_json文件夹,存放解析后的文档。
执行语句如下(对2019_1.json解析):
labelme_json_to_dataset yes/2019_1.json -o labelme_json/2019_1
通过刚刚这个命令,你可以在labelme_json/2019_1子文件夹里找到5个文件,
分别为:img.png/info.yaml/label.png/label_names.txt/label_viz.png。
- 转化为8位位图
将填充后的label.png转为灰度图24位位图转8位位图,代码如下(python)
# -*- coding: utf-8 -*-
from PIL import Image
import numpy as np
import shutil
import os
def img_16to8(src_dir):
dest_dir = r'D:Anaconda3labelme-mastercv2_mask' #8位图存放位置
for child_dir in os.listdir(src_dir):
#new_name = child_dir.split('_')[0] + '.png'
new_name = child_dir + '.png'
old_mask = os.path.join(os.path.join(src_dir, child_dir), 'label.png')
img = Image.open(old_mask)
img = Image.fromarray(np.uint8(np.array(img)))
new_mask = os.path.join(dest_dir, new_name)
img.save(new_mask)
if _name_ == 'main':
#dir = raw_input('please input the operate dir:')
src_dir = r'D:Anaconda3labelme-masterlabelme_json'
img_16to8(src_dir)
到此数据集就准备好了,建立images文件夹,在images文件夹中建立pic文件夹存放原图,json文件夹存放图片的json文件,label_json存放解析json文件产生的文件夹,cv2_mask存放8位图。
3.2 训练和测试
模型训练:
训练脚本参照下面的附件,在训练自己的样本时注意修改其中的训练样本地址,初始权重,以及修改类别数等信息。
脚本:
模型测试:
测试脚本参考下面的附件,在测试的时候,引用的是samplesshapes中的ShapesDataset数据集类,因此根据自己的类别个数修改samplesshapes中shapes.py中类别个数。
脚本:
目前只标了105张图,5个类别,训练了30代。测试效果不是很好,如下图: