前回の問題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 | 良い |
入力画像大きくすると、一見精度が上がっているように見えます。 | ||
たぶん、本当に上がるんだと思う。 | ||
逆に小さい物体が正しく識別できないということなら、やはり検知したら拡大するという手法もありだと思う。 | ||
ということで、グラフにしてみると一見綺麗なスロープ♬ | ||
![]() |
こういう図を描くと、fpsと画像サイズの関係からそれぞれの性能の一端が見えるね。
この線にmAP(median or mean_Average_Precition)を記載すればいいと思う。。。
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),
次回は、カメラによる物体検出やろうっと。。。
今回のコードは以下に置きました
【追記】上記Youtubeの小さいけどGifアニメーション
Youtubeは以下です。
SSD300 object detection2