物体検出で動画検出に挑戦～出来たSSD300～

[前回の問題](https://qiita.com/MuAuan/items/8190b5f25e8a6f4491c1)*Yolo@ubuntu*は根が深そう。。。
。。。KerasSSD300@windowsなら、もう少し中身が分かるのでどうにかなりそう

ということでとりあえず乗り換えしました^^;

そしてついに出来ました♬、本日初公開のYoutubeです( ^)o(^ )
[SSD300 object detection2 ](https://www.youtube.com/watch?v=lHlgCunB2Mk)

一応、以下解説します。
その前に以下の参考を読んでくださいね。
ある意味、まんまです。

【参考】
 @PonDad 2018年02月22日に更新[SSD: Single Shot MultiBox Detector 高速リアルタイム物体検出デモをKerasで試す](https://qiita.com/PonDad/items/6f9e6d9397951cadc6be)の「リアルタイム物体検出」以下を参考にしました。

このままgitしても環境というか、ウワンの環境だといろいろエラー出たので、[ウワンの最初の記事](https://qiita.com/MuAuan/items/44d7babf1da92f9e822d)も参照してください。
特に以下のところ。。。

```
以下が今回実行できたバージョンのサイト
cory8249/ssd_keras
 This code was tested with Keras v1.2.2, Tensorflow v1.0.0, OpenCV v3.1.0-dev
 Also support newest Keras v2.0.1 (using ssd_v2.py)
```

ここまで環境さえ整えば簡単に出来ました。
【環境】
・OpenCVのインストールは苦労なく以前から使えていました。
　今回はやっていませんが、以下の通りです。
（versionは試してみてください）

```
　opencv_python‑3.4.1‑cp37‑cp37m‑win_amd64.whl
をダウンロードして、
　pip install opencv_python‑3.4.1‑cp37‑cp37m‑win_amd64.whl
```
因みに、ウワンは以下の通りでした。。

```
python
Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> print(cv2.__version__)
3.4.1
```
【参考】
[【Python3】OpenCV3をインストール（Windows編）](https://algorithm.joho.info/programming/python/opencv3-install-windows/)

いよいよ本論。。。
あんまり新しい情報はありませんが、少し苦労したところ。。。と動画検索についてのちょっと考察
###ソフトの構造
一部、上記記事の指摘を書き換えれば、まんま動きます。
が、あえて、同じ理由でclass VideoTest(object):の93行目のcv2.cv.CVをcv2に置き換えます。

```
        # Skip frames until reaching start_frame
        if start_frame > 0:
            vid.set(cv2.CAP_PROP_POS_MSEC, start_frame)
```
最も、start_frameの変更なんか。。。しないかな？？
ということで、実は何が指定できるかというと

```
 def run(self, video_path = 0, start_frame = 0, conf_thresh = 0.6):
```
ということで、検出するときの閾値をここで変更できます。
###入力画像サイズとfps
また、元画像のサイズと関係なく、検出時のサイズも変更できます。

```
videotest_example.py
input_shape = (300,300,3)
```
因みに、

| size | fps | 精度 |
|:-:|:-:|:-:|
| 150x150 | 30  |悪い   |
| 300x300 | 21  |オリジナル |
| 500x500 | 12  |良い  |
| 640x640 | 8  | 良い  |
入力画像大きくすると、一見精度が上がっているように見えます。
たぶん、本当に上がるんだと思う。
逆に小さい物体が正しく識別できないということなら、やはり検知したら拡大するという手法もありだと思う。
ということで、グラフにしてみると一見綺麗なスロープ♬
![fpsvsframe_size.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/6901be2c-3169-1ea8-b08f-b9e8f63236ab.jpeg)

こういう図を描くと、fpsと画像サイズの関係からそれぞれの性能の一端が見えるね。
この線にmAP(median or mean_Average_Precition)を記載すればいいと思う。。。
![mAP.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/27c46b9e-3a2a-075e-b0c9-03985bc4f005.jpeg)
[Measuring Object Detection models — mAP — What is Mean Average Precision?](https://towardsdatascience.com/what-is-map-understanding-the-statistic-of-choice-for-comparing-object-detection-models-1ea4f67a9dbd)
因みに、medianの場合は、中央値なので、平均ではなくて、順番に並べた時の中央の値だけど、カテゴリがたくさんあるときは、各カテゴリの中で中央値とって、それを平均するのが妥当だと思う（どこにも定義らしいものが無いので。。。たぶんみんな上記の単なる平均をとっているのだと思う）。

###標準出力と表示
一応、print(text)を１６２行目に入れろってことで、出力できます。
が、どのレイヤーで入れるのが適切なのか？
また、もうちょっと工夫できるでしょ。。って、思いましたが、どんどん出力が流れるのも綺麗なので、最下層で出力させました。
少し上の層でprint(text," ")や

```
sys.stdout.write(text)
sys.stdout.write(" ")
```
とかすると、出力変わって面白いです。
また、貯めたところで書き出すのも一つの工夫かなと思いますが、今回はやりませんでした。

###動画が無い
しかし、Youtubeは著作権が。。。ということで一応著作権フリーのものを持ってきましたが、。。それにしても無いですね。

<iframe width="640" height="360" src="https://www.youtube.com/embed/lHlgCunB2Mk" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
###まとめ
・動画から物体検出できた
・検出精度はたとえ同じモデルを使っていても、入力画像サイズ依存性がある
・KerasのサイトのGitすると、ちょっとバグっていた。しかし、どうやらssd_layers.pyがまずかったようだが、正しくはわからない。
※一つはKeras2対応コードとして以下が追記されていました。

```
118     # support for Keras 2.0 
119     def compute_output_shape(self, input_shape): 
120         return self.get_output_shape_for(input_shape) 
```

もう一つは、[rykov8/ssd_keras ](https://github.com/rykov8/ssd_keras/blob/master/ssd.py)のものは、以下の二つのもの(netとAtrousConvolution2D)が異なるので、。。。さてという感じなので、別途評価したい。。。

```
　net = {}
  net['fc6'] = AtrousConvolution2D(1024, 3, 3, atrous_rate=(6, 6),
```
次回は、カメラによる物体検出やろうっと。。。

###今回のコードは以下に置きました
[SSD / testing_utils /](https://github.com/MuAuan/SSD/tree/master/testing_utils)
###【追記】上記Youtubeの小さいけどGifアニメーション
![SSD300 object detection2-セグメント 1.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/386e61cc-b204-616c-c4a6-382f7ae28d2f.gif)

Youtubeは以下です。
[SSD300 object detection2 ](https://www.youtube.com/watch?v=lHlgCunB2Mk)