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」フォルダ内の
- opencv_createsamples.exe
- opencv_ffmpeg3416_64.dll
- opencv_traincascade.exe
- opencv_world3416.dll
- opencv_world3416d.dll
学習ファイルの準備
「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 |
-img | 1枚の画像を指定する場合 | 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) |
-precalcValBufSize | 1024(MB) | |
-precalcIdxBufSize | 1024(MB) | |
-haarFeatureParams |
BASIC:BASIC 5種類のみが使用されます。 CORE:BASIC 5種類+ Haar機能 3種類を使用してトレーニングします。 ALL:BASICA 5種類+ CORE 3種類 + Titled 6種類の合計 14 機能を使用して トレーニングしますが速度が大幅に低下するので非推奨。 | BASIC(default) | CORE | ALL |
-weightTrimRate | 0.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個の写真の機械学習では精度が良くないみたいで、誤認識が多いです。
