画像中から個々の物体を切り出し、それぞれ何であるか判別するセマンティックセグメンテーションの分野で現在最も注目されているアルゴリズムであるMask R-CNNを動かした備忘録を残しておきます。

→動画で試した結果はこちら

mask_rcnn


result


○文献
Mask R-CNN Box Predictor. He, K., Gkioxari, G., Dollar, P., & Girshick, R. (2017). Mask R-CNN. arXiv preprint arXiv:1703.06870.

○環境
Windows10
Anaconda3
Python3.5
Keras
Tensorflow
Nvidia GForce GTX1070

○ソース
https://github.com/matterport/Mask_RCNN

○インストール、実行
1.Mask R-CNNのダウンロード
https://github.com/matterport/Mask_RCNN

2. 学習済みモデルのダウンロード
mask_rcnn_coco.h5
https://github.com/matterport/Mask_RCNN/releases

3 . COCOAPIのインストール
https://github.com/cocodataset/cocoapi
ダウンロードしてきて、PythonAPI内のsetup.pyを開き、
以下の部分を修正する。
--------------------
#14行目
#extra_compile_args=['-Wno-cpp', '-Wno-unused-function', '-std=c99'],
#修正後
extra_compile_args
=['-std=c99'],
--------------------
その後、
python setup.py install

4. 実行
demo.ipynb

5. 任意の画像で認識させる
認識部分を以下のように書き換えればよい。
import cv2
image = cv2.imread("my_image.jpg") #画像のパス
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Run detection
results = model.detect([image], verbose=1)

# Visualize results
r = results[0]
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'], 
                            class_names, r['scores'])

○実行サンプル
入力:友人の結婚式の写真
input

出力
result


○メモ
・実行時間は640x480画像で約1秒、2048x1536で約5秒
・画像サイズを変更しても認識性能はあまり変わりませんでした。
・顔にモザイクをかけたまま実行してもほぼ精度低下起きることなく実行されました






○他の結果(自前の画像)
result
渋滞写真。手前の車はよく見つかる。

result
人混み一人ひとりを見つけるのは難しいようだ。
おそらく学習データがあまり無いのだと思われる。

ダウンロード (1)
ジャンプした写真。普通の格好じゃなくても破綻なく認識された。


result (2)
この躍動感でもいける。デジカメは携帯電話と誤って認識されているが、そもそもデジカメは学習データに無いのでしょうがない。 スノーボードは履いていないが足元にスノーボードの認識結果が出ている。雪、および人の足元ということで認識したのか?