2016年3月28日月曜日

【Python × OpenCV】 はじめての歩行者検知

OpenCVインストールから歩行者検知までの概略まとめです。


はじめに



PythonユーザーなのでAnacondaにOpenCVをインストールしました。特に問題なし。

インストール後はチュートリアルを参考にコマンドを覚える作業。
(日本語サイトより公式チュートリアルの方が分かりやすかった。さすが公式。)


歩行者検知

ググッたら二つブログが出てきたので参考にしながら始めました。



Support Vector Machine(SVM)は聞いたことあるけどHOGは知らなかったので調べましたが。。。


”HOG(Histograms of Oriented Gradients)とは局所領域 (セル) の輝度の勾配方向をヒストグラム化したものです。”

”メリットとしては、勾配情報をもとにしているため、異なるサイズの画像を対象とする際も同じサイズにリサイズすることで比較可能になります。”



...分からない(^ ^;)

HOGの勉強はとりあえず後回しにして実装してしまいましょう!!


実装


OpenCVにはHOG+SVMを用いた人検出器が二種類用意されています。


1. cv2.HOGDescriptor_getDefaultPeopleDetector()
名前の通りデフォルトのこいつは、INRIA Person Datasetという64×128画素のデータセットで学習している検出器で、

2. cv2.HOGDescriptor_getDaimlerPeopleDetector()
こっちはDaimler Pedestrian Detection Benchmark Datasetという48×96画素データで学習している検出器。

二つ目の方が「画像内でサイズの小さい人」も検出できるよ、ということらしいです。


以上の情報を基に、デフォルトを使ったサンプルプログラムも用意されていたので、それをいじりながら書いたノートがこちらです。
Documentationそれに関するQ&Aも参考にしました。)

二つの検出器をそれぞれ実装して、パラメータをいじって性能を比べてみました。


実験(パラメータいじり)

OpenCV 2.4.6でHOGを試してみた」曰く、以下の2パラメータを調整すれば性能が変わるらしいですが。。。

  • hit_threshold : 特徴量とSVM分離超平面の間の距離に対する閾値。0が理想。
  • group_threshold : 似た検知を減らすための閾値。0だと全くグルーピングされない。
何を言っているのかさっぱりなので色々といじってみました。
データはCaltechが公開してるデータセットを使いました。


Default

1. hit_threshold=0, group_threshold=0(左), 2(中), 5(右)
確かにgroup_thresholdが0の時は検知したものは全て表示しているって感じですね。
値を上げていくとだんだんまとまって、5の時にはしっかり検出できているっぽくなります。

2. hit_threshold=1(左), 2(中), 3(右), group_threshold=0
hit_thresholdを上げると、一気に誤検知が減っている気がします。
しかし3まで上げてしまうと手前の男性の検知が消えてしまいました。
この理由はまだよく分かりませんが、hit_thresholdの方が感度が高そうということは分かりました。

Daimler

1. hit_threshold=0, group_threshold=0(左), 2(中), 5(右)
Daimlerの方はかなり誤検知が増えました。
group_thresholdを上げても奥の女性の検知はできていませんね。
この辺はもっと検知器に関する勉強が必要そうですね。。。


2. hit_threshold=1(左), 2(中), 3(右), group_threshold=0
ラストはDaimlerでhit_thresholdをいじりましたが、想像より良い感じです。
3まで上げた時はかなり正確に検知できています。
Defaultではhit_thresholdが感度高かった気がしたけれど、Daimlerではhit_thresholdの方がフレキシブルに変えられそうなイメージ。。。


おわりに

まだどちらが良いのかはよく分かりませんでした。とりあえずHOGについて勉強します。
動画でやりました→動画で歩行者検知
HOGとかパラメータについてまとめました→歩行者検知でやってること
Deep Learningも試しました→Windows 7(+GPU)でSSD-Keras動かしてみる



1 件のコメント:

  1. これは動画ファイルでも読み込みは出来るのでしょうか?
    もしよろしければ方法を教えてください。

    返信削除