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:\Anaconda3\labelme-master\cv2_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:\Anaconda3\labelme-master\labelme_json'
img_16to8(src_dir)
到此數據集就准備好了,建立images文件夾,在images文件夾中建立pic文件夾存放原圖,json文件夾存放圖片的json文件,label_json存放解析json文件產生的文件夾,cv2_mask存放8位圖。
3.2 訓練和測試
模型訓練:
訓練腳本參照下面的附件,在訓練自己的樣本時注意修改其中的訓練樣本地址,初始權重,以及修改類別數等信息。
腳本:
模型測試:
測試腳本參考下面的附件,在測試的時候,引用的是\samples\shapes中的ShapesDataset數據集類,因此根據自己的類別個數修改\samples\shapes中shapes.py中類別個數。
腳本:
目前只標了105張圖,5個類別,訓練了30代。測試效果不是很好,如下圖: