【MMDetection】 学習済モデルで物体検出編

## 概要
まだまだ日本語情報が少ない物体検出フレームワーク"MMDetection"について、学んだことを記録していこうと思います。間違い等ありましたらぜひコメントで教えてください。よろしくお願いします。

前回：[環境構築&インストール編](https://qiita.com/bellpond/items/f4a32b0a8053250e0bc7)

## 学習済モデルについて
ありがたいことに、MMDetectionは多くの学習済物体検出・セグメンテーションモデルを用意してくれています。これらの学習済モデルを用いることで、私たちは簡単にモデルを動かして遊ぶことができます。
学習済モデルの一覧は[こちら](https://github.com/open-mmlab/mmdetection/blob/master/docs/model_zoo.md#baselines)。

## 学習済モデルのダウンロード
今回は物体検出モデルのFaster R-CNNとインスタンスセグメンテーションモデルのMask R-CNNを使って遊びます。

### 1. `checkpoints`ディレクトリの作成
まずは`mmdetection`の直下に`checkpoints`ディレクトリを作成します。

```bash
cd mmdetection
mkdir checkpoints
```

### 2. ダウンロード
`checkpoints`ディレクトリにFaster-RCNNとMask-RCNNの学習済モデルをダウンロードします。

```bash
# Faster R-CNN
wget -P ./checkpoints http://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth

# Mask R-CNN
wget -P ./checkpoints http://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth
```

## Faster R-CNNで物体検出
デモ用の画像が`mmdetection/demo/demo.jpg`に用意されているのでこの画像で物体検出してみます。

![demo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637162/2fc6ccc9-41fe-1725-9bb4-373817839569.jpeg "demo.jpg")


今回は試しに動かすことを目的にしているので詳細は触れませんが、MMDetectionは非常に便利なAPIが用意されているので、それを使って驚くほど簡単にモデルを使ってテストが行えます。

### 1. テスト用コードの作成
以下の内容の`mmdetection/demo/my_test.py`というファイルを作成します。

```my_test.py
from mmdet.apis import init_detector, inference_detector
import mmcv

# モデルの設定ファイルと学習済モデルへのパスを指定する
config_file = '../configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'
checkpoint_file = '../checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth'

# モデルの初期化
model = init_detector(config_file, checkpoint_file, device='cuda:0')

# テストする画像を指定
img = 'demo.jpg'

# テスト
result = inference_detector(model, img)

# 結果の保存
model.show_result(img, result, out_file='result_faster_rcnn.jpg')
```

### 2. 実行 
※ 仮想環境の起動`conda activate open-mmlab`を忘れがちなので気をつけましょう。

```bash
python my_test.py
```

### 3. 結果の確認
実行がうまくいくと（多分UserWarningは出てきます）、`mmdetection/demo`直下に`result_faster_rcnn.jpg`というファイルが生成されているはずです。
ファイルを開くと、、、
![result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637162/6126a527-b166-933d-147a-7dc292b80ff0.jpeg)
ご覧のように、正しく物体検出が行われていることがわかります。

## Mask R-CNNでインスタンスセグメンテーション
基本的にはテスト用コードの`config_file`と`checkpoint_file`を変更するだけで動きます。

### 1. テスト用コードの作成
`mmdetection/demo/my_test.py`の内容を修正します。

```my_test.py
from mmdet.apis import init_detector, inference_detector
import mmcv

# モデルの設定ファイルと学習済モデルへのパスを指定する
config_file = '../configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py'
checkpoint_file = '../checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth'

# モデルの初期化
model = init_detector(config_file, checkpoint_file, device='cuda:0')

# テストする画像を指定
img = 'demo.jpg'

# テスト
result = inference_detector(model, img)

# 結果の保存
model.show_result(img, result, out_file='result_mask_rcnn.jpg')
```

### 2. 実行 
```bash
python my_test.py
```

### 3. 結果の確認
![result_maskrcnn.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637162/a426a502-70ba-a860-e4ec-e45c94cb5c9b.jpeg)

とても簡単に実行できていることがわかります。

## おまけ
僕が大好きなあいみょんのライブ映像にセグメンテーションをかけてみました。
でもよく考えたら著作権的にあげられませんね、、笑

次は既存モデルの学習についてまとめようと思います。

## 参考文献
- [公式ドキュメント](https://mmdetection.readthedocs.io/en/latest/index.html)