Mask-RCNNを試すだけの記事
こぉいうのが動くようになります。learnopencvは面白い講座があるので是非受けてみたいですが、今回Mask RCNNを動かしてみるだけです。CPUの場合劇遅です。OpenCVでもGPU使えるようにできるので、やれば早いはずです。動かすだけの場合環境作るのに5分もかかりませんでした。
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がクラス分類とエリア検出に繋いでる部分です。
#とりあえず動かす
やった環境
- 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
動画で動かす
これはCPUだと劇遅です。
python3 mask_rcnn.py --video=cars.mp4
OpenCV追加機能をちょっとコード見る
#画像を読む
cap = cv.VideoCapture(args.image)
#動画を読む
cap = cv.VideoCapture(args.video)
#web cam
cap = cv.VideoCapture(0)
//画像を読む
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から読み込む機能追加されてるんですね。
net = cv.dnn.readNetFromTensorflow(modelWeights, textGraph);
net.setPreferableBackend(cv.dnn.DNN_BACKEND_OPENCV)
net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)
Net net = readNetFromTensorflow(modelWeights, textGraph);
net.setPreferableBackend(DNN_BACKEND_OPENCV);
net.setPreferableTarget(DNN_TARGET_CPU);
検出コード
OpenCVは検出エリアを表示する関数があるので、簡単にかけます。
cv.drawContours(frame[top:bottom+1, left:right+1], contours, -1, color, 3, cv.LINE_8, hierarchy, 100)
drawContours(coloredRoi, contours, -1, color, 5, LINE_8, hierarchy, 100);
coloredRoi.copyTo(frame(box), mask);
参考