酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

OpenCVの機械学習「haartraining」に掛かる時間についてと改善策

精度の高いオブジェクト検出器を作成するにはノウハウの蓄積が必要だと深く感じています。

永田雅人さんが書かれた「実践OpenCV」によれば、実用的な精度の検出を実現するためには、ポジティブ画像が7,000枚、ネガティブ画像が3,000枚必要だと言われているそうです。

実践OpenCV―映像処理&解析

実践OpenCV―映像処理&解析

機械学習に掛かる時間の目安として、前述した「実践OpenCV」には以下のように書かれています。

ポジティブ画像 ネガティブ画像 学習時間 精度(抽象的なもの)
3,000枚 20枚 約40分 ほとんど正しく検出されません
4,000枚 2,000枚 約8時間 誤検出が見られます
8,000枚 4,000枚 約1週間 誤検出がほとんどありません

実際にこの枚数を用意しても綺麗にこの学習時間にならなかったので、おそらく適切な画像を用意する必要があるのではないかと思います。

機械学習の速度を高めるためにはどうすれば良いのか?

機械学習時、何に時間が掛かるのか測定された記事があります。

3,000枚のポジティブ画像、5,000枚のネガティブ画像を用意して普通に学習させた場合、約6日掛かっていた環境で、複数のマシンを用意してクラスタを作り、並列処理をさせたことで学習速度を約4日まで短縮させることができたそうです。

もっとも2009年時点の記事ですので、今ではもっと高速に学習させることが可能になっていると思われます。

過去にはOpenMPを使用して高速化していたようなのですが、OpenCV2.1からはTBB(Intel Threading Building Blocks)が導入されているようです(TBBによる処理の並列化と高速化)。

OpenCVのビルド時のオプションに「WITH_TBB」がありますので、こちらを有効にするだけで恩恵にあやかれるのでしょうか。

参考資料