5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-30

前回の問題Yolo@ubuntuは根が深そう。。。
。。。KerasSSD300@windowsなら、もう少し中身が分かるのでどうにかなりそう

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

そしてついに出来ました♬、本日初公開のYoutubeです( ^)o(^ )
SSD300 object detection2

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

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

このままgitしても環境というか、ウワンの環境だといろいろエラー出たので、ウワンの最初の記事も参照してください。
特に以下のところ。。。

以下が今回実行できたバージョンのサイト
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編)

いよいよ本論。。。
あんまり新しい情報はありませんが、少し苦労したところ。。。と動画検索についてのちょっと考察

ソフトの構造

一部、上記記事の指摘を書き換えれば、まんま動きます。
が、あえて、同じ理由で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

こういう図を描くと、fpsと画像サイズの関係からそれぞれの性能の一端が見えるね。
この線にmAP(median or mean_Average_Precition)を記載すればいいと思う。。。
mAP.jpg
Measuring Object Detection models — mAP — What is Mean Average Precision?
因みに、medianの場合は、中央値なので、平均ではなくて、順番に並べた時の中央の値だけど、カテゴリがたくさんあるときは、各カテゴリの中で中央値とって、それを平均するのが妥当だと思う(どこにも定義らしいものが無いので。。。たぶんみんな上記の単なる平均をとっているのだと思う)。

標準出力と表示

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

sys.stdout.write(text)
sys.stdout.write(" ")

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

動画が無い

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

### まとめ ・動画から物体検出できた ・検出精度はたとえ同じモデルを使っていても、入力画像サイズ依存性がある ・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 のものは、以下の二つのもの(netとAtrousConvolution2D)が異なるので、。。。さてという感じなので、別途評価したい。。。

 net = {}
  net['fc6'] = AtrousConvolution2D(1024, 3, 3, atrous_rate=(6, 6),

次回は、カメラによる物体検出やろうっと。。。

今回のコードは以下に置きました

SSD / testing_utils /

【追記】上記Youtubeの小さいけどGifアニメーション

SSD300 object detection2-セグメント 1.gif

Youtubeは以下です。
SSD300 object detection2

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?