Edited at

5分でMask-RCNNを試す

More than 1 year has passed since last update.


Mask-RCNNを試すだけの記事

こぉいうのが動くようになります。learnopencvは面白い講座があるので是非受けてみたいですが、今回Mask RCNNを動かしてみるだけです。CPUの場合劇遅です。OpenCVでもGPU使えるようにできるので、やれば早いはずです。動かすだけの場合環境作るのに5分もかかりませんでした。

スクリーンショット 2018-10-02 18.29.41.png

Mask R-CNNについてはこの辺参考になります。

https://qiita.com/shtamura/items/4283c851bc3d9721ed96

https://engineer.dena.jp/2017/12/chainercvmask-r-cnn.html

Faster R-CNNにmask headが追加されてるようです。

Faster R-CNNはBackboneとRegionProporsalNetworkとHeadでできてます。

BackboneはCNN部分。RegionProporsalNetworkは物体らしき場所を検出する部分。Headがクラス分類とエリア検出に繋いでる部分です。

スクリーンショット 2018-10-05 12.11.20.png


とりあえず動かす

やった環境


  • mac

  • python3.5

git clone https://github.com/spmallick/learnopencv.git

あれ動かない。OpenCvのバージョン古いんでしょう。

(py35) miyamoto:Mask-RCNN miyamoto$ python3 mask_rcnn.py --image=cars.jpg

Traceback (most recent call last):
File "mask_rcnn.py", line 99, in <module>
net = cv.dnn.readNetFromTensorflow(modelWeights, textGraph);
AttributeError: module 'cv2' has no attribute 'dnn'

3.1.0は古いので自分でビルドか、新しいの入れる必要あり。

(py35) miyamoto:Mask-RCNN miyamoto$ conda list | grep opencv

opencv3 3.1.0 py35_0 menpo

menpoが古いので一旦消しす。

sudo conda update -c menpo opencv3 -n py35

sudo conda uninstall -c menpo opencv3 -n py35

conda-forgeでopencv入れる。

sudo conda install -c conda-forge opencv

やっぱりない。

Python 3.5.5 |Anaconda, Inc.| (default, Mar 12 2018, 16:25:05) 

[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'cv2'
>>> exit()

-nで環境指定指定れると良かった。

sudo conda install -c conda-forge opencv -n py35

無事3.4.3が入りました。

(py35) miyamoto:Mask-RCNN miyamoto$ conda list | grep opencv

opencv 3.4.3 py35_blas_openblash553dce0_200 [blas_openblas] conda-forge


画像で動かす

python3 mask_rcnn.py --image=cars.jpg

スクリーンショット 2018-10-02 18.29.41.png


動画で動かす

これはCPUだと劇遅です。

python3 mask_rcnn.py --video=cars.mp4


OpenCV追加機能をちょっとコード見る


python

#画像を読む

cap = cv.VideoCapture(args.image)
#動画を読む
cap = cv.VideoCapture(args.video)
#web cam
cap = cv.VideoCapture(0)


cpp

//画像を読む

str = parser.get<String>("image");
ifstream ifile(str);
if (!ifile) throw("error");
cap.open(str);
//動画を読む
str = parser.get<String>("video");
ifstream ifile(str);
if (!ifile) throw("error");
cap.open(str);
//web cam
cap.open(parser.get<int>("device"));


TFモデル読み込み

OpenCVにtensorflowから読み込む機能追加されてるんですね。


python

net = cv.dnn.readNetFromTensorflow(modelWeights, textGraph);

net.setPreferableBackend(cv.dnn.DNN_BACKEND_OPENCV)
net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)


cpp

Net net = readNetFromTensorflow(modelWeights, textGraph);

net.setPreferableBackend(DNN_BACKEND_OPENCV);
net.setPreferableTarget(DNN_TARGET_CPU);


検出コード

OpenCVは検出エリアを表示する関数があるので、簡単にかけます。


python

cv.drawContours(frame[top:bottom+1, left:right+1], contours, -1, color, 3, cv.LINE_8, hierarchy, 100)



cpp

drawContours(coloredRoi, contours, -1, color, 5, LINE_8, hierarchy, 100);

coloredRoi.copyTo(frame(box), mask);


参考

https://www.learnopencv.com/deep-learning-based-object-detection-and-instance-segmentation-using-mask-r-cnn-in-opencv-python-c/