質問
マルチコア CPU 向けの最速のオープンソース HOG 抽出コードは何ですか?
動機
リアルタイムのオブジェクト検出アプリケーションに取り組んでいます。具体的には、 30fps のオブジェクト検出をターゲットとする変形可能パーツ モデル カスケードのバリアントを開発しました。HOG 機能の抽出は、残りのパイプラインを合わせたものよりもコストがかかるところまで来ました。HOG 抽出には [ Felzenzwalb、Girshick など] のパラメーターを使用しています。つまり、HOG 記述子の多重解像度ピラミッドであり、各記述子には方向と他のいくつかの手がかり用に合計 32 個のビンがあります。
目標マルチコア CPU で 640x480 の画像に対して60fps (16ms)
でマルチスケール HOG 特徴抽出を実行したいと考えています。
関連作業
私は、6 コア Intel 3930k CPU でいくつかの市販のマルチスケール HOG 実装のベンチマークを行いました。640x480 の画像の場合、次のパフォーマンス数値が観察されます。
- DuboutのFFLD DPMコードのHOG : 19fps (52ms) -- OpenMP を使用した C++、ただしベクトル化なし
- voc-release5 DPMコードのHOG : 2.4fps (410ms) -- シングルスレッド C++ と Matlab ラッパー
また、 OpenCV HOG 抽出コードも試しました。OpenCV バージョンは機能しますが、Dalal-Triggs の HOG セットアップ用にハードコーディングされているようで、OpenCV では [Felzenzwalb,ガーシックら]。また、OpenCV バージョンはマルチスケール HOG をネイティブにサポートしていませんが、自分でダウンサンプリングを行い、スケールごとに OpenCV HOG を呼び出すことができます。OpenCV HOG のパフォーマンスがどのようなものだったか覚えていません。
最終的な考え
- 最速の HOG 実装であるFFLDは、多くのパフォーマンスをテーブルに残しているようです。私は GFLOP/s の推定を行っていませんが、FFLD の HOG コードが SSE/AVX ベクトル化をまったく使用していないことに気付きました。制御フローはそれほど多くないため、ベクトル化は安価な高速化の機会のように思えます。
- ここでは、GPU HOG の実装については触れていません。私はGroundHOG / CUHOGとfasthogを試しました。CUHOG の作成者は、NVIDIA GTX560 での20fps (50ms) HOG 抽出を主張しています。しかし、Intel CPU は私のアプリケーションのターゲット プラットフォームであり、完全な HOG ピラミッドを GPU から CPU にコピーするには法外なコストがかかります。