5分でMask-RCNNを試す


# Mask-RCNNを試すだけの記事

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

![スクリーンショット 2018-10-02 18.29.41.png](https://qiita-image-store.s3.amazonaws.com/0/64334/4628b655-613e-347a-ccb5-67264e4de025.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がクラス分類とエリア検出に繋いでる部分です。


<img width="706" alt="スクリーンショット 2018-10-05 12.11.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/5ea660f5-616e-c74d-970a-00a637628d8b.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](https://qiita-image-store.s3.amazonaws.com/0/64334/b05ea61b-bb0d-c6a8-9a91-7c04bdcbbdb9.png)


# 動画で動かす

これはCPUだと劇遅です。

```
python3 mask_rcnn.py --video=cars.mp4
```

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



```py:python
#画像を読む
cap = cv.VideoCapture(args.image)
#動画を読む
cap = cv.VideoCapture(args.video)
#web cam
cap = cv.VideoCapture(0)
```

```cpp: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から読み込む機能追加されてるんですね。


```py:python
net = cv.dnn.readNetFromTensorflow(modelWeights, textGraph);
net.setPreferableBackend(cv.dnn.DNN_BACKEND_OPENCV)
net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)
```


```cpp:cpp
Net net = readNetFromTensorflow(modelWeights, textGraph);
net.setPreferableBackend(DNN_BACKEND_OPENCV);
net.setPreferableTarget(DNN_TARGET_CPU);
```

## 検出コード

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

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

```cpp: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/