LoginSignup
23
32

More than 5 years have passed since last update.

5分でMask-RCNNを試す

Last updated at Posted at 2018-10-08

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);

参考

23
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
32