ラベル python の投稿を表示しています。 すべての投稿を表示
ラベル python の投稿を表示しています。 すべての投稿を表示

2016年11月13日日曜日

【Python × OpenCV】 歩行者検知でやってること

はじめに


前回の投稿でよく分からず使った歩行者検知について少し調べました。


  1. HOGってなんですか
  2. パラメータ調整の意味わからん

という二つの問題を今回解決していきます。


Histogram of Oriented Gradients (HOG)


MRPGのスライド53ページからの説明が分かりやすかったです。

ざっくりまとめると、

  • 人って大体同じシルエットだよね
  • シルエットはエッジとして検出できるよね → HOGと呼ぼう


これだけだと分かったつもり感溢れてるので、scikit-image使って可視化しました。

(実際に書いたコードはこちら)


左から順に 入力画像、HOG、HOG強調verの3枚です。
シルエットだけ取れてる感ありますね、すばらしい。


服のしわもエッジとして検出されるので、黒っぽい服の方が人として検出されやすいかも?


歩行者検知のパラメータ


以下のサイトにまとめてありました。
HOG detectMultiScale parameters explained

まず、歩行者検知のステップとして

1. 画像のサイズ変えて増やす                         2. HOGゲット                     3. 上から下までスキャン・分類 (SVM)
           

の大きく3つがあり、

  • scale       :  ステップ1の枚数決める
  • winstride  :  ステップ3のスライド窓の大きさ決める

ので、この二つがかなり大事でした。

枚数少なくて窓大きければ高速だけど性能悪い
枚数多くて窓小さければ低速だけど性能良い

というトレードオフです。

ちなみに前回いじった二つのパラメータはあまりいじるべきではないっぽいです(笑)

参考:Image Pyramid, Sliding Windows


おまけ:Non-Maximum-Suppression (NMS)


これは余分な検出をまとめるための処理です。


窓同士のかぶってる割合がthresholdより大きければ消す、というだけのものです。
Pedestrian Detection OpenCVを参考に実装してみました。

左がNMSなしで、右がNMSありです。 (finalThreshold=0の時)


ただ、finalThresholdを1以上に設定すればgroupingされるのでNMSはいらないかもです。

(左がNMSなしで、右がNMSあり :finalThreshold=1)



おわりに


以上、HOGとパラメータについて少し調べたまとめでした。
SVMについてはHOG特徴量とSVMを使った自動車の検出の説明が良い感じでした。
次はDPMかCNNに手を出す所存です、おわり。

2016年10月25日火曜日

【Python × OpenCV】 動画で歩行者検知

リクエストがあったので動画で歩行者検知してみました。

結果

中々良い感じ。

動画ファイル読み込み


動画の処理についてはいつも通りチュートリアルを参考にしました。プログラムの流れは

  1. cv2.VideoCaptureで動画を読み込んで
  2. frame毎に画像表示させる

という簡単な手順です。

ただ私の環境ではVideoCaptureが機能しなかったので、StackOverflowを見たところ、
OpenCVフォルダ内のffmpeg関連の名前変更してpythonフォルダにコピペする必要がありました。

VideoCaptureが動いたら、前回のコードと合わせて「動画で歩行者検知」完成です。


使った動画


問題点

とにかく重いです。
ただでさえ重い歩行者検知に加え、動画を読み込んでいるからだと思います。
なので一般的には、動画をフレーム毎に画像にしたデータ群を使って検証するみたいです。

結果は動画読み込みと同じですが、倍以上早いプログラムがこちらです。

パラメータは前回良かった

  • hit_threshold = 0
  • group_threshold = 5

を使いました。

おわりに


想像以上にこのデフォルト検出器の性能が良かったので、改良意欲が湧いてきました。
とはいえ専門家でもないので、実装しながら色々考えてみるつもりです、おわり。

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動かしてみる