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に手を出す所存です、おわり。