May 24, 2011

OpenCV haartraining が segmentation fault する件

最近は画像処理で遊んでいる。
OpenCVに関しては導入から利用まで一通り後でまとめるとして(まとめた)、haarliketrainingが落ちる理由が非常にションボリだったのでここに書き連ねておく。

このあたりの記事を参考にオブジェクト検出器をつくろうとおもって負例500件、正例1件をあつめ,neg.txt(前述記事中のNG.txt)をつくり,(正例は1個だけだったのでリストはつくっていない)
$ #正例にアフィン変換をかけて正例を増やす
$ opencv_createsamples -img pos/pos.jpg -vec pos.vec -num 1000 -bgcolor 255 -w 100 -h 100
$ #負例と合わせて学習
$ opencv_haarliketraining -data training -vec pos.vec -bg neg.txt -npos 1000 -nneg 500  -w 100 -h 100 -mode ALL -nonsysm -mem 1000
とやってみると、segmentation faultする。
Google先生に聞くと、OpenCV1.x系だとneg.txtに記述されている負例のうち、実体がないものがあるとセグフォ、とおっしゃるのだがちゃんと全てのファイルは実在するしpathも間違ってない。そもそもOpenCV2.x系だしなぁ…
ということでうろうろしていると、
I had this problem as well, see bug #964145 on SourceForge. In short,
the negative samples have to be at least twice as wide and twice as
high as the positive samples, otherwise training will crash at some
stage.
http://tech.groups.yahoo.com/group/OpenCV/message/24290
ということらしい。
つまり、すべての負例が正例サンプルのタテヨコ2倍以上の大きさが無いと落ちるらしい…

ドキュメントの目立つところにそれぐらい書いておいて欲しい…

負例の最小値が100x40だったので
$ #正例をアフィン変換をかけて正例を増やす
$ opencv_createsamples -img pos/pos.jpg -vec pos.vec -num 1000 -bgcolor 255 -w 50 -h 20
$ #負例と合わせて学習
$ opencv_haarliketraining -data training -vec pos.vec -bg neg.txt -npos 1000 -nneg 500  -w 50 -h 20 -mode ALL -nonsysm -mem 1000
で問題なく学習完了

ちなみに学習完了までものすごい時間がかかる。

No comments:

Post a Comment