トップへ(mam-mam.net/)

OpenCVで機械学習したcascade.xmlファイルを使用して検出領域を表示する ~Delphiソースコード集

検索:

OpenCVで機械学習

OpenCVのダウンロードと準備

https://opencv.org/releases/
から「OpenCV-3.4.16」の「Windows」をクリックしてダウンロードします。
(OpenCV-4.x.xには機械学習用の実行ファイルが含まれていないので、3.x.xをダウンロードします)
ダウンロードが完了したら、
opencv-3.4.16-vc14_vc15.exeをダブルクリックして解凍します。
c:\ドライブ直下に「cascade」フォルダを作成します。
解凍した「build\x64\vc15\bin」フォルダ内の

ファイルを「c:\cascade」フォルダ内にコピーします。

学習ファイルの準備

「c:\cascade」フォルダ内に「pos」と「neg」と「cas」フォルダを作成します。
posはポジティブ(正解画像)でnegはネガティブ(不正解画像)を配置するフォルダです。
casは学習結果ファイルが生成されるフォルダです。

「c:\cascade\pos」フォルダ内に正解画像を配置します。
私は「BURST」様や「Pexels」様や「ぱくたそ」様など、登録不要で著作権表記不要の無料の画像を加工(32x32)して配置しました。
pos.zip(360KB)
「c:\cascade\neg」フォルダ内に不正解を配置します。
同じく上記サイト様の画像を加工(32x32~64x64に切り取り)して配置しました。
neg.zip(326KB)

学習ファイルのリストの準備

スタートボタンをクリックし、キーボードから「cmd」と入力し「コマンド プロンプト」をクリックして起動します。
コマンドプロンプトから「cd \cascade」以下を入力してカレントディレクトリを移動します。

C:\>cd \cascade

C:\cascade>

不正解画像リスト(neglist.txt)ファイルを作成するために、
コマンドプロンプトから
dir .\neg\*.jpg /B /S > neglist.txt
を入力します。

C:\cascade>dir .\neg\*.jpg /B /S > neglist.txt

C:\cascade>

正解画像リスト(poslist.txt)ファイルを作成するために、
コマンドプロンプトから
dir .\pos\*.jpg /B /S > poslist_source.txt
for /f "delims=" %l in (poslist_source.txt) do @echo %l 1 1 1 30 30>> poslist.txt
del poslist_source.txt
を入力します。

C:\cascade>dir .\pos\*.jpg /B /S > poslist_source.txt

C:\cascade>for /f "delims=" %l in (poslist_source.txt) do @echo %l 1 1 1 30 30>> poslist.txt

C:\cascade>del poslist_source.txt

C:\cascade>

neglist.txt(不正解画像リスト)の中身はフルパスでファイル名が並んでいるテキストファイルです。

C:\cascade\neg\009.jpg
C:\cascade\neg\013.jpg
C:\cascade\neg\017.jpg
・・・

poslist.txt(正解画像リスト)の中身は「フルパスファイル名 画像に含まれる正解数 x y width height が並んでいるテキストファイルです。

C:\cascade\pos\001.jpg 1 1 1 30 30
C:\cascade\pos\002.jpg 1 1 1 30 30
C:\cascade\pos\003.jpg 1 1 1 30 30
・・・

大量の正解画像を作成するためにランダムに回転、色を変えたりしたベクトルファイルを生成する

コマンドプロンプトから
opencv_createsamples -info poslist.txt -vec positive.vec -num 351 -w 24 -h 24
を入力します。「positive.vec」ファイルが生成されます。

C:\cascade>opencv_createsamples -info poslist.txt -vec positive.vec -num 351 -w 24 -h 24
Info file name: poslist.txt
Img file name: (NULL)
Vec file name: positive.vec
BG  file name: (NULL)
Num: 351
BG color: 0
BG threshold: 80
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
Max Scale: -1
RNG Seed: 12345
Create training samples from images collection...
Done. Created 351 samples

C:\cascade>

学習ファイル作成

コマンドプロンプトから
opencv_traincascade -data cas -vec positive.vec -bg neglist.txt -numPos 310 -numNeg 179 -maxDepth 1 -numStages 17
を入力します。
かなり待つと「c:\cascade\cas」フォルダ内に「cascade.xml」ファイルが生成されます。

C:\cascade>opencv_traincascade -data cas -vec positive.vec -bg neglist.txt -numPos 310 -numNeg 179 -maxDepth 1 -numStages 17
PARAMETERS:
cascadeDirName: cas
vecFileName: positive.vec
bgFileName: neglist.txt
numPos: 310
numNeg: 179
numStages: 17
precalcValBufSize[Mb] : 1024
precalcIdxBufSize[Mb] : 1024
acceptanceRatioBreakValue : -1
stageType: BOOST
featureType: HAAR
sampleWidth: 24
sampleHeight: 24
boostType: GAB
minHitRate: 0.995
maxFalseAlarmRate: 0.5
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100
mode: BASIC
Number of unique features given windowSize [24,24] : 162336

・・・

===== TRAINING 16-stage =====
<BEGIN
POS count : consumed   310 : 325
NEG count : acceptanceRatio    179 : 4.12003e-05
Precalculation time: 0.354
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|        1|
+----+---------+---------+
|   3|        1|        0|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 7 minutes 37 seconds.

C:\cascade>

コマンドの主なオプション

opencv_createsamplesコマンド

オプション名用途
-info正解画像リストファイルposlist.txt
-img1枚の画像を指定する場合1.jpg
-vecベクトルファイル保存場所positive.vec
-num与える画像枚数351
★正確に与える画像枚数を指定する必要がある
-maxidev最大明度差40
-maxxangle最大回転角度[ラジアン単位]0.8 (デフォルト1.1)
-maxyangle最大回転角度[ラジアン単位]0.8(デフォルト1.1)
-maxzangle最大回転角度[ラジアン単位]0.5(デフォルト0.5)
-maxscale-1.000
-bgcolorグレースケール基準 0-255
-w生成する幅
-h生成する高さ

opencv_traincascadeコマンド

オプション名用途
-data生成した分類器を保存するフォルダcascade
-vecベクトルファイル保存場所positive.vec
-bgネガティブ画像のリストが記述されたテキストファイルneglist.txt
-numPos使用するポジティブ画像の数※330
-numNeg使用するネガティブ画像の数66
-numStagesステージ数20
-minHitRate各ステージで満たすべき最小認識率0.995
-sampleWidth窓幅24
-sampleHeight窓高さ24
-maxDepthツリーの深さ(1 or 2)1
-maxWeakCount弱分類機の最大数100
-maxFalseAlarmRate各学習ステージでの許容する誤検出率(デフォルト0.5)
-precalcValBufSize1024(MB)
-precalcIdxBufSize1024(MB)
-haarFeatureParams BASIC:BASIC 5種類のみが使用されます。
CORE:BASIC 5種類+ Haar機能 3種類を使用してトレーニングします。
ALL:BASICA 5種類+ CORE 3種類 + Titled 6種類の合計 14 機能を使用して
  トレーニングしますが速度が大幅に低下するので非推奨。
BASIC(default) | CORE | ALL
-weightTrimRate0.95

※ numPosは以下の式以下で設定する必要がある
numPos =< (N-S) / (numStage + minHitRate - minHitRate * numStage)
ここで、Nはvecファイル内のサンプル数、Sは適当なバッファ

機械学習で作成した「cascade.xml」ファイルを使う

UMamHaar.pas(https://mam-mam.net/delphi/haar_cascade.html)ユニットと上記で機械学習にて作成した「c:\cascade\cas\cascade.xml」ファイルを使って抽出された領域を囲ってみた。
(写真は「ぱくたそ」様 https://www.pakutaso.com/20161111328post-9609.html を使用させていただきました。)
351個の写真の機械学習では精度が良くないみたいで、誤認識が多いです。