haarcascadeの学習(2)

  • flickrから5000枚ほど画像をダウンロードしてくる。背景画像として使う。
  • 橋本商会 » Flickrダウンローダを作った
  • 背景画像には、認識したいパターンが写っていてはならない。映っていないものだけを残す。
  • 選別した背景画像はbgフォルダに置いておく


背景画像一覧を、テキストファイルに改行区切りで書く。

bg/1.jpg
bg/2.jpg
bg/3.jpg

という感じ。スクリプトで生成し、bg.txtという名前で保存した

ls bg > tmp.txt
ruby -e 'open("tmp.txt").read.each{|line| puts "bg/#{line}"}' > bg.txt
rm tmp.txt


背景画像の枚数を数えておく。4456枚だった

ruby -e 'puts Dir.glob("bg/*.jpg").size'


ポジティブサンプル画像を生成する。対象物が映っている写真の一覧とその座標の一覧を用意する方法でもいいが、今回は対象物をランダム変形させてに背景画像群に貼り付けてポジティブサンプル群を生成するツールを使った。

~/tmp/opencv-1.0.0/apps/haartraining/src/opencv-createsamples -img hand/hand-front-up-gray.bmp -vec hand-front-up.vec -bg bg.txt -num 7000 -bgcolor 0 -bgthresh 10 -maxxangle 1.1 -maxyangle 1.1 -maxzangle 0.5 -w 24 -h 24

hand/hand-front-up.bmpが対象画像で、hand-front-up.vecとしてポジティブサンプルファイルが保存される。
hand-front-up.bmpはグレースケールとして処理されるらしい。黒を透明色としたので-bgcolor 0になる。



いよいよ学習させるが、その前に結果を保存するディレクトリを作っておく

mkdir result
mkdir result/hand-front-up


学習開始。RAM6500MB使用、ステージ数14で作成。-modeをALLにしたり、-nsplitsを2にすると精度が上がるが時間が滅茶苦茶かかるのでやめた。

~/tmp/opencv-1.0.0/apps/haartraining/src/opencv-haartraining -data result/hand-front-up -vec hand-front-up.vec -bg bg.txt -npos 7000 -nneg 4456 -nstages 14 -nsplits 1 -mem 1800  -weighttrimming 0.90 -mode BASIC -w 24 -h 24