前置き
OpenCVで画像認識させる際にopencv_createsamples.exeを用いて画像データの水増しをすると思いますが、この機能の欠点としてポジティブ画像を複数準備した際にまとめて回転や変形の処理をしてくれない...”-info 〇.txtで実行するとポジティブ画像のフォルダ内から-numで指定した枚数を使ってvecファイルを生成しますという仕様”
であるため、画像データ1つからvecファイルを生成してから最後にmergevec.pyを用いて一つにする作業が発生します。
なので本記事では勝手にポジティブ画像のフォルダ内からvecファイルを生成できるコードを自分自身のためにも残しておこうと思い投稿します。
お役に立てたら幸いです。
環境
・VScode+Python3.6.13+OpenCV3.4.14参考記事は↓
作業フォルダは以下の通り
下3つのopecv~~のファイルはOpenCVのサイトから
ver3.〇.〇(ver4.〇.〇にはopencv_createsamples.exeがないらしい)のexeファイルをダウンロードし実行後、opencv/build/x64/vc15/binから作業フォルダに移動させましょう。
<DIR> cascade
<DIR> ng
<DIR> pos
<DIR> vec
samplecreates.py
samplecreates_ALL.py
mergevec.py
opencv_createsamples.exe
opencv_traincascade.exe
opencv_world3414.dll
mergevec.pyについて
https://github.com/wulfebw/mergevec/blob/master/mergevec.py
上記のgithubからmaergevec.pyをダウンロードし、作業フォルダに入れておく。
以下のコードを実行すれば、1つのvecファイルが生成される。
!python mergevec.py -v vec -o vec/pos.vec
-v vec : いままで生成されたvecファイルがあるフォルダを指定
-o vec/pos.vec : 出力先のフォルダと出力するファイル名の指定
CODE
必要なファイルは2つ呼び出されるファイル(コマンドプロンプトに書き込むメインのファイル)↓
import subprocess
from subprocess import PIPE
def main(img):
print(img) #実行中のファイルを確認する
#opencv_createsamples実行(-numの数字が増やす枚数)
subprocess.run("opencv_createsamples.exe -img pos/"+img+" -vec vec/positive"+img+".vec -num 20 -maxidev 40 -maxxangle 0.8 -maxyangle 0.8 -maxzangle 0.5 -w 24 -h 24",shell=True)
subprocess.run("python mergevec.py -v vec -o vec/pos.vec",shell=True) #vecファイルを一つにする
※エラーが出る場合はパスの見直しを忘れずに
上のファイルを呼ぶファイル(ポジティブ画像のフォルダからリストを作成しファイルの数だけループさせる。)↓
import os
import samplecreates
#パスの取得&リスト作成
path = r'C:/Users/user/Desktop/cascade/pos' #ポジティブ画像があるファイルのフルパス
files = os.listdir(path)
for dir in files:
samplecreates.main(dir)
・pathにはポジティブ画像が入っているフォルダのフルパスを貼り付ける。
2つ目のファイルを実行すれば、ポジティブ画像が何百枚もあった場合でも勝手にvecファイルが生成され最終的にはpos.vecというファイルが生成されるのでこれを使って学習を始めます。
加えて-numで指定した枚数まで手軽に増やせるので目安とされる7000枚まで簡単にそろえることが出来ると思います。
以上