SSDで動画の物体検出をやってみた！

# やること
- 動画における物体検出をやってみた
- 物体検出のアルゴリズムはSSD(Single Shot MultiBox Detector)を利用

# 手順概要
- 1. ソースコードのダウンロード
- 2. 学習済モデルのダウンロード
- 3. 環境構築
- 4. ソースコードの修正
- 5. 動画ファイルの指定
- 6. 物体検出の実行
- 7. 実行結果の変換(png -> gif)

# 動作環境
- macOS Catalina 10.15 beta
- anaconda 4.6.14
- Python 3.5.4
- tensorflow 1.3.0
- keras 1.2.2
- opencv-python 3.3.0.9
- imageio 2.4.1

# 1. ソースコードのダウンロード
- 下記コマンドでソースコードをダウンロードします

```terminal
$ git clone https://github.com/rykov8/ssd_keras.git
$ cd ssd_keras
```

# 2. 学習済モデルのダウンロード
- [こちら](https://mega.nz/#F!7RowVLCL!q3cEVRK9jyOSB9el3SssIA)に学習済モデルが公開されているので、```weights_SSD300.hdf5```をダウンロードします
<img width="955" alt="スクリーンショット 2019-08-19 8.04.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67194/e93147fb-bff4-507c-fe0e-60e29c645038.png">
- ダウンロードしたファイルは、プロジェクトの直下に格納します

# 3. 環境構築
- [こちら](https://gist.github.com/yampy/4e0fc4aea37cf0f432ab243d76285e98)のAnaconda環境構築用の設定ファイルをダウンロードして、プロジェクトの直下に格納します
- ダウンロードした設定ファイル(.yaml)を元に下記のコマンドでAnacondaの環境を構築します
- また、「imageio」を個別にインストールします
- その後、環境をアクティベートします

```terminal
$ conda env create -f ykov8_ssd_keras.yaml
$ conda install imageio
$ source activate rykov8_ssd_keras
```

# 4. ソースコードの修正
- 私の環境では、以下部分を修正しました
- コンソール上にも物体検出の結果を出力しています
- 物体検出した結果は「testing_utils」の「image」フォルダにpng形式で保存します(182行目)

```python:/testing_utils/videotest.py

#--------------
# 12行目
#--------------
# before
from scipy.misc import imread, imresize
# after
from imageio import imread

#--------------
# 87行目
#--------------
# before
vidw = vid.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)
vidh = vid.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)
# after
vidw = vid.get(cv2.CAP_PROP_FRAME_WIDTH)
vidh = vid.get(cv2.CAP_PROP_FRAME_HEIGHT)

#--------------
# 99行目
#--------------
# before

# after
num_frame = 0

#--------------
# 162行目
#--------------
# before

# after
print(text)

#--------------
# 182行目
#--------------
# before
# after
print(text)
cv2.imwrite("./image/frame_" + str('{0:04d}'.format(num_frame)) +".png", to_draw)
num_frame += 1
```

# 5. 動画ファイルの指定
- ```videotest_example.py```で動画ファイルの指定を行います
- 動画ファイルは[Pexels(フリー動画サイト)](https://www.pexels.com/videos/)からダウンロードしました

```python:/testing_utils/videotest_example.py
#--------------
# 24行目
#--------------
# before
vid_test.run('path/to/your/video.mkv')
# after
vid_test.run('../movie/1.mp4')
```

# 6. 物体検出の実行
- 指定した動画で物体検出の実行をします
- 4.の182行目で記載した通り、「testing_utils」フォルダ内に「image」フォルダを作成しておきます

```terminal
$ python videotest_example.py
```

# 7. 実行結果の変換(png -> gif)
- 実行が完了したら、「image」フォルダのpngファイルをgifに変換します
- gifへの変換は[PicGIF Lite](https://apps.apple.com/jp/app/picgif-lite/id844918735?mt=12)を使いました

# 結果(gifファイル)
1. 人混み
![sample1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67194/22bbc70c-0d60-d96f-fe70-fbdaaae498a2.gif)

2. 歩道と車道
![sample2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67194/a3e854b2-20dc-0aee-e1b1-34144a457ba6.gif)

3. 観光地
![sample3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67194/8157736e-7948-606c-772a-841bf4a04d4a.gif)

4. 談笑
![sample4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67194/b755d3e0-ddc0-4f0f-eb4f-e8f0c8def572.gif)

# ソースコード
https://github.com/hiraku00/ssd_keras_test

# 参考文献
- [SSD: Single Shot MultiBox Detector 高速リアルタイム物体検出デモをKerasで試す](https://qiita.com/PonDad/items/6f9e6d9397951cadc6be)