openCV 2.4.3 で Haar トレーニングを実行しています。
- ネガが10枚、ポジが30枚くらいあります(量が少ないのはわかっています)。
- ポジティブ サンプルは「vec」ファイルにまとめられ、ネガティブ (背景) 画像は、画像のパスを保存するテキスト ファイルによって記述されます。
- このような少量の画像では、完全な解決策が存在します (すべての背景画像は偽として分類され、実際のサンプルは真として分類されます)。
この完全な解決策が見つかると、openCV はicvGetHaarTrainingData()
関数内で無限ループに入ります。
カスケードが失敗した背景画像を見つけたいのですが、そのような画像がもうないため、この関数はfor(;;)
永遠にループに陥っています。
icvGetBackgroundImage()
このループで呼び出される関数は、カスケードによって拒否された同じイメージをハードディスクからロードし続けます。
この問題を解決するために適用できるパッチまたはバグ修正を知っている人はいますか?
私が思いついた1つの可能な修正はicvGetBackgroundImage()
、カスケードによって拒否された場合、常に拒否されるため、各ファイルを1回だけロードさせることです。しかし、この同じ関数が 'vec' ファイルを生成するために使用されcvCreateSamples()
、このシナリオでは同じファイルを数回ロードする必要があるため、これは間違った調整です。
2 番目に考えられる修正 - 情報パス形式の代わりに、vec ファイルで (正の例のように) 負の例を使用します。これは、問題のあるコールバックをアクティブにしないことで無限ループを克服する方法ですが、その結果、クラッシュの原因となる openCV エラーが発生します。負の 'vec' ファイルが EOF に達したときに発生します。
その間、openCV のソース コードを直接変更し、バイナリを再コンパイルすることで、これら 2 つのバグ (無限ループとクラッシュ) を解決しました。私の変更をすぐにopenCV委員会に提出します。しかし、私だけがそのような問題にぶつかったとは信じられません...