雑多なメモ集

OpenCV 画像 認識 写真 検出 ロゴ
ロゴからポジティブサンプル作成

参考サイト
九大 OpenCVでのロゴ認識詳しい解説
http://lab.cntl.kyutech.ac.jp/~kobalab/nishida/ope...
blog 画像認識実験結果
http://ugd555.blog1.fc2.com/blog-category-30.html
解説pdfファイル英語
http://lab.cntl.kyutech.ac.jp/~kobalab/nishida/ope...
OpenCV全般の解説
http://chihara.naist.jp/people/2004/kenta-t/OpenCV...
OpenCV haartraining  (顔画像の笑い男化のページもあり)
(Rapid Object Detection With A Cascade of Boosted Classifiers Based on Haar-like Features)
http://note.sonots.com/?SciSoftware%2Fhaartraining

Yahoo Groups OpenCV (要yahoo.comアカウント)
http://tech.groups.yahoo.com/group/OpenCV/

Re: Having problems with haar classifier
http://permalink.gmane.org/gmane.comp.lib.opencv/1...

設定値の例(英語)
http://www.bernardotti.it/portal/showthread.php?t=...

Haartrainingのメモ
http://www36.atwiki.jp/prolog/pages/31.html

◆ネガティブサンプルとなる背景画像の集め方
(対象となるオブジェクトが写っていない画像を適当に集めれば良い 3000枚程度?)
Flickr down - Flickrの画像をまとめてダウンロードできるソフト
http://sourceforge.net/projects/flickrdown

ダウンローダー雨 ファイルダウンロードソフト
http://downloader.parfe.jp/

Getswf IEやOperaのキャッシュから画像を抜き出せるソフト
http://sbrnetwork.oh.land.to/downswf.html

らくちんフォト検索
http://www.medianavi.co.jp/download/pkbeta/index.h...
Flickrとフォト蔵から画像を検索してダウンロードできる


顔画像ファイルをダウンロードできるサイト
MIT?jaffe?BioID?

---------------------------
Visual Studioの設定
http://chihara.naist.jp/people/2004/kenta-t/OpenCV...
プロジェクトを作成する度に設定します.
「プロジェクト(P)」→「***のプロパティ(P)」→「構成プロパティ」→「リンカ」→「入力」を選択.「追加の依存ファイル」に以下を追加します.
cv.lib cxcore.lib cvaux.lib highgui.lib

http://chihara.naist.jp/people/2004/kenta-t/OpenCV...
プロジェクトを作成する度に設定します.
「プロジェクト(P)」→「***のプロパティ(P)」→「構成プロパティ」→「リンカ」→「入力」を選択.「追加の依存ファイル」に以下を追加します.
"ipl.lib"

◆intel社のIPPという有償ライブラリを使用するとOpenCV利用時のパフォーマンスが向上するらしい
(CPUがintel製でなければいけない?)
さらにVC.NET2005とintelのC++コンパイラ、CPUにintelのデュアルコアプロセッサを併用すると
コンパイル時のパフォーマンス、実行時処理速度ともに向上するらしい。
http://www.intel.com/cd/software/products/asmo-na/...


------------------------------
◆opencv\bin\createsamples.exe は
OpenCV\apps\HaarTraining からリリースビルドして作り直す必要がある
cvhaartraining.cpp の中の一部の変数 (S[1-4]=0)を変更すること。

◆まず、ロゴ画像からポジティブなサンプルデータを生成する必要がある。

OpenCV\binに移動してcreatesamples.exeを実行する
コマンドラインで
createsamples.exe -info positive.txt -vec vec\pos_vec.vec -w 24 -h 24 -show

positive.txt にはロゴの入っている画像ファイル
 pic\fix_dyn_roop.bmp 1 0 0 43 40
みたいな感じで1行に1つ書く 1つだけでも多分OK
生成データの保存先を -vec 引数で指定
生成サンプルサイズを -w -h で指定 24にするのがいいらしい
  • showをつけるとデバッグみたいに画像を表示できるようだ


bgディレクトリに背景用の画像を多数用意して、そのファイル名とパスをtxtファイルに記述しておく
ファイルリスト作成機 http://dobon.net
みたいなソフトを使うとよい。



------------------------------
こっちが正解?

createsamples.exe -vec vec\vec.vec -img pic\logo.bmp -bg backgroundimg.txt -num 2 -bgthresh 1 -maxxangle 1.1 -maxyangle 1.1 -maxzangle 1.1 -show -w 24 -h 24


--------------------
これでうまくいった
背景画像はjpgでもbmpでもいいみたいだがbmp推奨(png未確認 gifはダメかも)
ロゴ画像はgifではダメ、bmpとpngとjpgは平気
DOSプロンプトから
createsamples.exe -vec vec\vec_logo.vec
  • bg background_img_gif.txt -num 20 bgthresh 1 -maxxangle 1.5 -maxyangle 1.5 -max
zangle 1.5 -show -w 24 -h 24 -img pic\fix_positive_logo.png

みたいにすると、vecファイルができあがる 
生成サンプルである-numの数は7000とか大きくする必要がありそう

※numの数を増やすとエラー 背景画像はやはりgifはダメかもしれない
背景用ファイルをbmpにしたらOK




-----------------------------
  • show オプションを入れたらデバッグ画像が出るのでESCキーを押す必要がある

--------------------------------

1つのロゴbmpファイルと、数千枚の適当な背景画像(jpg,bmpのパスをtxtに記述したもの)から
7000のサンプルを生成した。 1分以内でできた。
  • bgcolorはロゴの背景色(グレースケール256階調とみなされるらしい)
  • bgthresh 10 は背景色とみなす幅プラマイ10
DOSプロンプトの表示は
Create training samples from single image applying distortions...

実際のコマンド
createsamples.exe -vec vec\vec_bmp7000.vec
 -bg background_jpg_png.txt -num 7000 -bgcolor 255 -bgthresh 10 -maxxangle 1.5
 -maxyangle 1.5 -maxzangle 1.5 -w 24 -h 24 -img pic\fix_roop.bmp

-------------------------------- Haar training
ハール状特徴に基づくブースト分類器のカスケードの構成方法(thanks to Florian Adolf for the PDF)
http://lab.cntl.kyutech.ac.jp/~kobalab/nishida/ope...

Due to compression artefacts in some compression levels of JPEG images, a BMP image format should be chosen.

やはり、bmpファイルのみのほうがよいのかもしれない。

------------------------------------------ 訓練

haartraining.exe -data harr -vec vec\vec_bmp7000.vec -bg backgroundimg_jpg_png.txt -npos 7000 -nneg 3000
-mem 500 -mode ALL も指定したほうがいい(memは使用メモリMB modeは訓練用パターン)  -w 24 -h 24 も一応明示的に指定したほうがよさそう 検出用画像が垂直軸に対して対象性がない場合は、 -nonsysm 引数をつけること


----------------------------------------------- 上記の注意点を元に再度訓練プログラムを実行

 C:\Program Files\OpenCV\bin>haartraining.exe -data haar -vec vec\vec_bmp7000.vec
  -bg backgroundimg_jpg_png.txt -npos 7000 -nneg 3000 -nsplits 2 -mem 500 -mode ALL

※そもそも、haartraining.cppの再コンパイルが必要

cvhaartraining.cpp内の 関数icvCreateIntHaarFeatures()の中でs0=36,s1=12,s2=18,s3=24となっている 記述をs0=0,s1=0,s2=0,s3=0と書き換えて、
C:\Program Files\OpenCV\apps\HaarTraining\make ここの中身をVS.NETで読み込んでリビルド
(VisualStudio2003.NETではslnファイルを読むとエラーになるのでdswを読む)
リリースビルドすると、新しいcreatesamples.exeが生成され、
既存の bin\createsamples.exe が上書きされる
  • data haar の中に分類機と呼ばれるデータが蓄積され、
またカレントディレクトリにxmlファイルも生成される(これを分類判定につかえるらしい)

--------------------------------------------------
サンプル画像生成
背景にロゴを混ぜたサンプル画像の大量生成

infoファイル テスト画像ファイル名フォーマットが自動記述されるので任意の名前を指定すればいい
imageOrderNumber_x_y_width_height.jpg でリストで書かれていく
ここでx, y, width height は背景画像に置かれる対象物の矩形領域の範囲の座標
訓練中に用いた背景画像とは異なる 背景画像集合を用いる必要がある


 C:\Program Files\OpenCV\bin>createsamples.exe -img pic\fix_logo.bmp
 -bg backgroundimg_bmp_info_2.txt -info info\create_bg_in_logo.txt -num 100
 -bgcolor 255 -bgthresh 10

Info file name: info\create_bg_in_logo.txt
Img file name: pic\fix_logo.bmp
Vec file name: (NULL)
BG file name: backgroundimg_bmp_info_2.txt
Num: 100
BG color: 255
BG threshold: 10
Invert: FALSE
Max intensity deviation: 40
Max x angle: 1.1
Max y angle: 1.1
Max z angle: 0.5
Show samples: FALSE
Width: 24
Height: 24
Create test samples from single image applying distortions...
Done




------------------------------------------ 性能評価



C:\Program Files\OpenCV\bin>performance.exe -data haar2 -info info\bg_in_logo_3
create_bg_in_logo.txt
  1. ================================+======+======+======+
File NameHitsMissedFalse
  1. ================================+======+======+======+
Total000
  1. ================================+======+======+======+
Number of stages: 9
Number of weak classifiers: 31
Total time: 0.000000
9
0 0 -1.#IND00 -1.#IND00 0 0 -1.#IND00 -1.#IND00 0 0 -1.#IND00 -1.#IND00 0 0 -1.#IND00 -1.#IND00
(↑検出失敗しているらしい、、、 以下続く)

ディレクトリ指定と画像の配置が正しくないとうまくいかないようだ
(同じディレクトリに設置する?)


---------------------------------------------------------- samplesディレクトリのfacedetect.exeに対して、xmlファイルを指定してみる
USBカメラを繋いでおき、コマンドラインから

facedetect.exe --cascade="../../bin/haar2.xml"
これだと、ロゴが検出された。正確性はいまいちだが、パラメータ調整の問題か?


-------------------------------------------------------------------
vecファイルの中身を確認するとき
createsamples.exe -vec vec\vecs\1a008pgm8.vec
みたいに指定すればいい
20*20など、作成されたサイズで画像が表示される
Enterキーで次画像を表示

----------------------------------------------------------
OpenCVにおいて、指定画像の認識データxmlを自力でつくるケース
http://note.sonots.com/index.php?SciSoftware%2Fhaa...
SciSoftware haartraining
ここの手順のようにやってみる

1 Create Training Samples
ポジティブ、ネガティブ画像のリストtxtファイルを予め作成しておき
createtrainsamples.pl positive.txt negative.txt vecdir
と実行する。
→vecdir以下に大量のvecファイルができあがる
それらのvecファイルへの相対パスを含めテキストリストにまとめる
それをmergevec.exeで1つのvecファイルにまとめる
mergevec.exe vecfilelist.txt

2 Create Testing Samples

C:\Program Files\OpenCV\bin>haartraining.exe -data haar4 -vec vec\merged_vec.vec
-bg negative_files.txt -npos 7000 -nneg 3500 -w 24 -h 24 -mem 400 -mode ALL

3 Training


------------------------------ トレーニングに成功したやり方

haartraining -data haar -vec vec\merge.vec
  • bg negative.txt -nstages 14 -nsplits 2 -npos 7000 -nneg 3500 -w 24 -h 24
  • mode ALL -mem 512

vecファイルは、createsamples.exe -vec vec\***.vec でどのようなトレーニング画像か確認できる
 -nsplits 2 にすると、訓練に時間がかかるが検出制度が上がる。
  基本的に-nsplites 2 でないと、精度が出ないみたい。もっと大きくしてもよい?
 -nnegのネガティブ画像が少ないと、訓練に失敗するか、検出精度が悪い。
 -mode ALL は、傾きをつけた画像も検出できるようにするオプション 
 これをつけると、より時間がかかるがやったほうがよさげ
 塊状の構造とかには向かないらしい
http://tech.groups.yahoo.com/group/OpenCV/message/...
-In some stage in the training I get this message "Required leaf false alarm rate achieved. Branch training terminated." what should I do to get all 20 stages working because it usually stop at stage 9 or 10

Training stops if the cascade can accurately tell the difference
between its positive and negative training samples. If you use more
varied samples, the cascade will need more stages.

Required leaf false alarm rate achieved. Branch training terminated.
は、サンプルのバラエティを増やせば解決するのかな。
(いろいろな方向に回転させた画像を用意したり)
サンプルが少ない場合は処理のstageも少なくて済むようだ
【追加】vecファイル中のポジティブサンプル画像数や
  • bgで指定されたネガティブサンプル画像の数が少ない(引数で指定された値より不足)
ばあいにも、このような表示が出るらしい。


 -nonsymは、認識させたいオブジェクトが垂直軸で非対称の場合につける
顔の場合は不要?→つけたほうが、計算時間がかかるかわりに
認識精度があがるらしい


-------------------------------
 -minhitrate は各カスケードステージで保障する誤検出率らしい
 -nstage乗される 0.01% 10stagesなら1E-20%
 -nstageはカスケードステージ数
 ステージ数は最終的な検出率、誤検出率に影響する 増やせば時間がかかる
 30くらいにしても良いらしい


-------------------------------- 顔検出用のポジティブサンプル画像のメモ 7/19

サンプル用の顔画像(数千枚)は、おでこからアゴまでを切り抜いたような顔画像よりも
頭部、髪の毛までまるごとある顔画像ののほうが良いかもしれない。→駄目
検出させたい顔の特徴にもよるが、メガネをかけた顔とかヒゲをはやした顔とかの画像が
混ざっていたほうが、よいかもしれない。(OpenCVのhaartrainingのアルゴリズムにとっては適切?)

あと nonsymっていう引数をつけると認識させたいオブジェクトが垂直方向に左右非対称とみなして
検出トレーニングをするらしい。顔画像認識のときもこのオプションを使用したほうがよいのかも?
(髪の毛まで含めたら、顔は非対称になるし)


-----------------------------------
main.bisという怪しげなプロセスが一瞬立ち上がったがウイルスバスターは反応せず

------------------------------------ 7
サンプルとなる顔画像は顔全部よりも口から眉毛までを狭く切り出したもので試すとよさそう
眉毛も不要かもしれない


--------------------------------------------- 1つのstageでの訓練がなかなか終わらない場合、
ポジティブサンプルの中に間違った画像(不要なものが含まれるとか)があるかもしれない

---------------------------------------- PNGでインターレースの画像はpicasaで読めない?
ノンインターレース、グレイスケール24bitがよい


---------------- 8
顔画像のサンプルは、なるべくいろいろな角度、表情のものが必要。
目または眉毛から下唇まで狭い領域を切り出してサンプルとしたほうが
検出精度が向上する。
(逆に顔全体を元画像とすると、検出したいオブジェクトが極めて複雑になってしまうため困難。)

もし目だけを検出したいなら数千枚の顔画像から両目部分だけを長方形に切り抜いた
画像を準備すること


-------------- 8
顔画像処理に役立つソフト
ViX(閲覧・png24bitグレイスケール変換)
IrfanView(閲覧・一括変換・一括切り出し)
Paint.NET(各種処理)
Picasa2(閲覧・切り出し)

------------ 8
使える顔画像データベース
MIT
JAFFE
BioID

----------- 8
haartraining時に、-nonsymをつけたほうが時間はかかるが生成ファイルxmlによる検出精度は向上するようだ。

顔画像の場合はhaartrainingの引数は
-nsplits 2 -maxfalsealarm 0.999 -w 20 -h 20 -mode ALL -npos 7000 -nneg 3000 -nonsym
が基本となる。
  • npos -nnegはもう少し増やし、かつ両者の数字を接近させたほうがいいかもしれない。


------------------
1枚ポジティブサンプルの画像を用意して試験的にvecファイルを作ってみるときの例。

C:\Program Files\OpenCV\bin>createsamples.exe -w 20 -h 20 -maxxangle 0.3 -m
axyangle 0 -maxzangle 0.5 -maxidev 100 -bgcolor 0 -bgthresh 0 -vec vec\testvec -
img pic\test_face.png -num 20 -bg neg_sample.txt

max[x,y,z]angleの角度はラジアン指定 画像が傾きすぎると訓練がうまくいかなくなる?
ので注意。
  • bgには背景用画像群への相対パスを書いたテキストファイルを指定する。

maxidevの数字の範囲内でポジティブサンプルの明度を変動させながらサンプルを作るらしい。
つまりこの数字が大きすぎると明るすぎたり暗すぎる画像ができてしまう?!
デフォルトの40程度でよさそう。

このような感じに変更
C:\Program Files\OpenCV\bin>createsamples.exe -w 20 -h 20 -maxxangle 0.6 -m
axyangle 0 -maxzangle 0.3 -maxidev 30 -bgcolor 0 -bgthresh 0 -vec vec\testvec -i
mg pic\testface.png -num 60 -bg negative_sample.txt
できあがったvecファイルの中の画像を閲覧するにはコマンドラインから
createsamples.exe -vec vec\testvec -w 20 -h 20
のように指定すればよい。


----------------------- nonsymは正面からの真顔の場合は不要?
maxidevは画像の明暗を変化させるので、白く飛んだり真っ暗にならないように注意すること
通常はデフォルトの40でいいはず (また、元画像は白過ぎたり黒過ぎるものがないかチェックする)
maxzangleなどを使って画像を回転させた場合、作成したvecファイルにおいて
画像の四隅が回転の結果見切れていることがよくある
それでも検出に支障がでないかはvecファイルをcreatesamples.exe -vec **:で
実際に中身を見て、かつhaartrainingでxmlファイルを作成して確認すること

画像の回転に伴う見切れを回避するためには
maxzangleでの回転を利用するのではなくて
事前にサンプル画像を回転させておいたほうがいい

-----------------------------------
nonsym引数をつけなくとも、斜め横を向いた顔を検出できる
サンプル画像にもよるが、基本的には無しでいいようだ

-------------------------------------- OpenCV face detection 解説pdf 英語
http://fsa.ia.ac.cn/files/OpenCV_FaceDetection_Jun...


------------------------------------------
nonsymをつけると計算に極端に時間がかかるため極力避けたい
無しでも顔のナナメ30度前後までは検出可能
(nonsymを使うのはより傾いた顔を検出したいときだが
表情のついた顔を同じオブジェクトとみなすことは可能か??)
現状ではmaxxangle 0.6 maxzangle 0.6 maxidev 50で顔6000枚背景4000枚にて
十分実用的な検出精度になる maxidevは30-35程度に抑えてもよい
背景画像はやや高解像度のものも混ぜておくこと 





--------------------------------------- maxidevの数値が大きいとサンプルの明暗が極端に触れてhaartrainingに悪影響が出る


------------------
performance.exeによる測定
引数-infoのtxtファイルには画像のパスをつけないこと
すなわち同じディレクトリに画像ファイルをおく

他の引数は -rs 30 -w 20 -h 20 -sf 1.2 のように使う
スケールファクターは1.2のほうが1.1より検出率が良いケースがある
rsは最低検出サイズ? 40くらいでもいいかもしれない

引数-dataには、分類器のディレクトリだけでなく、xmlファイルの直接指定もできる

intel謹製の
haarcascade_frontalface_alt.xml の顔検出能力は高いが、誤検出率も意外に高い

顔画像、背景画像をそれぞれ10000枚、5000枚くらい用意して
maxidevを50程度、maxxangle0.6など工夫すればintelのものを越える精度が出せるのではないか
他のパラメーターはnstages 22 nsplits 2 minhitrate 0.999などがよさそう


------------------------ 排除する画像
暗すぎる 明るすぎる ピンボケ 対象性が崩れている
一意なオブジェクトを維持できないほど形状が変化している

他、ヒストグラムの偏りに注意

-----------------------

このページへのコメント

こんにちは。私もhaartrainingを使って卒論を進めています。
質問なのですが、


>生成サンプルサイズを -w -h で指定 24にするのがいいらしい

というのは、どうしてでしょう??
-w -hの値をどうしたら良いのか分からなくて・・・

この値は物体検出をしたい場合は一般的に24がいい(効果的)ということでしょうか?

よろしくお願いします。

0
Posted by yuri 2009年10月22日(木) 06:19:02 返信

そうですね、文中には古い情報も混ざっています。
下のほうほど古くて精度が悪い記事だったかな、、、

結局、minhitrateとmaxfalsealarmはデフォルト値でだいたいOKだと思います。
サンプル画像の精度を高めるのと、枚数を多すぎず少なすぎず工夫するのが大事らしいです。

0
Posted by hama 2008年01月10日(木) 03:17:38 返信

初めまして。
haartrainingで四苦八苦している大学生です。
少し気になったのですが、
>-minhitrate は各カスケードステージで保障する誤検出率らしい
-minhitrateは各ステージで保証する検出率ではないですか?
逆に-maxfalsealarmが各ステージで保証する誤検出率・・・と言う風に私は理解していたんですが…。

-minhitrateはデフォルトが0.995とかなり高いので、おそらくこちらがhinhitrate(最低検出率?)ではないでしょうか?

minhitrateとmaxfalsealarmの値の設定をどうしようか悩んでいるので、私が理解し間違えているのであればご指摘下さい。

0
Posted by ikecho 2007年11月01日(木) 19:15:09 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

×

この広告は60日間更新がないwikiに表示されております。

メニューバーA





編集にはIDが必要です