Mask R-CNN（keras）で人物検出 on Colaboratory

# はじめに
最新の物体検出手法というMask R-CNN（keras版）を動かしてみます。
せっかくなので、Google Colaboratoryでやってみることにしました。

実行ソースはこちら→[GitHub](https://github.com/nanako-ut/mask-rcnn/blob/master/maskr-cnn_keras.ipynb)

# Mask R-CNN

物体検出、セグメンテーションのみならず、人の骨格推定も可能なようです。
<img width="786" alt="mask_rnn.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/170139/e7760abc-7189-aa2a-20b5-762d2beba8bf.png">
<img width="703" alt="mask_rnn2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/170139/7a4cc2c3-375a-a1e2-5555-421c39e4bb4e.png">

出典：https://arxiv.org/pdf/1703.06870v1.pdf

処理内容についての説明は、以下サイトを参考に

- [最新の物体検出手法Mask R-CNNのRoI AlignとFast(er) R-CNNのRoI Poolingの違いを正しく理解する](https://qiita.com/yu4u/items/5cbe9db166a5d72f9eb8)
- [Mask R-CNN](https://mil-tokyo.github.io/paper-summary/papers/20170323-mask-r-cnn)

# 環境
Google Colaboratory（python3/GPU）

Google Colaboratoryのノートブックを新規作成し、「ランタイム」「ランタイムのタイプを変更」で、python3/GPUを選択。
<img width="354" alt="colaboratory.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/170139/5a782624-0580-16c3-7e81-e76eb0936479.png">


# インストール

今回試すのは、こちら→[Github](https://github.com/matterport/Mask_RCNN)
ReadMeの「Installation」に従って、作業を進めていきます。

## ■１.Clone this repository
githubからソースを取得します。

```maskRnn-keras.ipynb
# gitからソースを取得
!git clone https://github.com/matterport/Mask_RCNN.git

# 確認
!ls
```

## ■２.Install dependencies
Mask_RCNN-master/requirements.txt に記載されている関連ライブラリをインストールします。

```maskRnn-keras.ipynb
# フォルダへ移動
%cd Mask_RCNN

# 確認
!ls

# ライブラリを取得
!pip install -r requirements.txt
```

## ■３.Run setup from the repository root directory
Mask_RCNN-master/setup.py を実行します。

```maskRnn-keras.ipynb
# フォルダへ移動
%cd Mask_RCNN

# setup.pyを実行
%run -i setup.py install
```

## ■４.Download pre-trained COCO weights (mask_rcnn_coco.h5)
学習済の重み (mask_rcnn_coco.h5)を取得します。

```maskRnn-keras.ipynb
# フォルダへ移動
%cd Mask_RCNN

# 重みを取得
!wget https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5

```

## ■５.MS COCO install
Microsoft COCO が提供する画像データセット用APIをインストールします。

```maskRnn-keras.ipynb
# COCO 用ソースを取得
!git clone https://github.com/waleedka/coco.git

# 確認
!ls

# cythonをインストール
!pip install cython 

# python用APIをインストール
%cd Mask_RCNN/coco/PythonAPI
%run -i setup.py build_ext --inplace
%run -i setup.py build_ext install
```

上記で問題ないようなのですが、、、インストールしたpycocotoolsがない、とエラーになってしまうので、
パスを設定しました。

```maskRnn-keras.ipynb
import sys
sys.path.append('/content/Mask_RCNN/coco/PythonAPI')
```

# デモを実行

## ■１．kerasをインストール
Google Colaboratoryにはデフォルトで入っていないkerasをインストール

```maskRnn-keras.ipynb
!pip install keras
```

## ■２．demo.ipynbを実行
https://github.com/matterport/Mask_RCNN/blob/master/samples/demo.ipynb をコピペして実行

実行結果。キリンとシマウマを見分けてます。

<img width="526" alt="colaboratory-run.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/170139/3d52d007-be6d-1033-8d45-1fc2cd74af76.png">

# 人物検出
[openCVとKerasで画像から人物検出](https://qiita.com/nanako_ut/items/13849bd4cc087139a40c) でも使ったスポーツシーンの画像で試した結果
<img width="941" alt="mask-rnn-keras.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/170139/8730ce68-0e73-a514-9091-82bcf44ab625.png">


# まとめ
同じ形状のものが重なっている場合にうまく検出できていない？
（人が重なっている場合に、別人と判定したり、人が検出できていなかったり）
ただ、前回試したSSDでは検出できなかったボールやバット、グローブなど小さな形状まで検出できていて、すごい。
利用目的に合わせて、使い分けるのがよいのかな？？

# 参考サイト
- [Mask R-CNNを簡単にカメラ映像から試す方法](https://ai-coordinator.jp/mask-r-cnn) 
- [【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)