OPENCV を使用してモデルをトレーニングする方法

             モデルは OPENCV カスケード分類器を使用してトレーニングされます。まず、opencv_createsamples.exe と opencv_traincascade.exe という 2 つの実行可能ファイルと依存関係が必要です。ご希望であれば、私とプライベートにチャットすることができます。

        ステップ 1: フォルダーを作成し、ポジティブ サンプル (認識したい画像) をフォルダーに置きます。ここでは、このフォルダーに 1 という名前を付けます。

         ここで認識対象となる物体をランダムに見つけましたが、最初に撮った写真の名前がめちゃくちゃでしたので、ここでプログラムで使用できるように名前を変更する必要があります。(注: ここでの陽性サンプルの数は、認識率が向上するように十分に大きくなければなりません。ここでは、便宜上 8 つの陽性サンプルのみを使用します)

        ステップ 2: これらの画像をグレースケール画像に変換します。

import cv2
imagepath = "C:/Users/huawei/Desktop/1/"
imagepath1 = "C:/Users/huawei/Desktop/pos/"
#转化灰度图和重置大小函数
for i in range(1,9):
    image = cv2.imread(imagepath+'1 ('+str(i)+')'+'.jpg',1)
    gray = cv2.cvtColor(image,code = cv2.COLOR_BGR2GRAY)
    gray1 = cv2.resize(gray,dsize = (50,50))
    cv2.imwrite(imagepath1+str(i)+'.jpg',gray1)

        ここで、imagepathのパスはポジサンプル画像を加工していないパス、imagepath1のパスはグレースケールなどの処理を行った後に保存するパスです。結果は以下の通りです。

 

        ステップ 3: これはネガティブ サンプルの処理済み画像です。リンク: https://pan.baidu.com/s/1omQyLDSn9Buo2jeG5SEJxg
抽出コード: acno

        ステップ 4: 陽性サンプルの説明ファイルを作成します。

import os
PATH = "C:/Users/huawei/Desktop/pos"
dirs = os.listdir(PATH)
for i in dirs:
    print(i)
    line1 = PATH+'/'+i+' 1 0 0 50 50\n'
    with open('C:/Users/huawei/Desktop/info.txt','a') as f:
        f.write(line1)
        print(f)

        陽性サンプルの説明ファイルは info.txt ファイルに配置されます。ここで、1 0 0 50 50 は 1 がカテゴリを表し、0 0 50 50 が処理後の陽性サンプルのサイズ形式であることを意味します。

 

        ステップ 5: ネガティブサンプルの説明ファイルを作成します。

#描述负文本
import os
PATH = "D:/OPENCVtrain/neg"
dirs = os.listdir(PATH)
for i in dirs:
    print(i)
    line1 = PATH+'/'+i+'\n'
    with open('C:/Users/huawei/Desktop/bg.txt','a') as f:
        f.write(line1)

        ネガティブサンプルの説明ファイルは bg.txt ファイルに保存されており、いくつかのスクリーンショットは次のとおりです。

        

         ステップ 6: ポジティブ サンプル記述ファイル (info.txt) とネガティブ サンプル記述ファイル (bg.txt) を opencv_createsamples.exe と opencv_traincascade.exe が含まれるフォルダーに配置し、データ フォルダーを作成します。

        ステップ 7: cmd コマンド ウィンドウで、ステップ 6 の 2 つの実行可能ファイルを含むファイルを入力し、opencv_createsamples -info info.txt -num 8 -w 50 -h 50 -vecpositives.vec と入力します。これにより、次のドキュメントが作成されます。 。これは、モデルをトレーニングするときに使用する必要があるファイルです。

         ステップ 8: ステップ 7 を実行した後、opencv_traincascade.exe -data data -vecpositives.vec -bg bg.txt -numPos 8 -numNeg 80 -numStages 10 -w 50 -h 50 コマンドを入力します。トレーニングが始まります。

        これら 2 つのコマンドには多くのパラメーターがあります。パラメータの意味を以下にまとめます。

一般パラメータ:

-data <cascade_dir_name> : このディレクトリは、(上記の LBP_classifier の) トレーニングによって生成された分類子 XML ファイルと中間ファイルを保存するために使用されます。トレーニング プログラムがない場合は作成されます。

-vec <vec_file_name>: opencv_createsamples プログラムによって生成された陽性サンプルを含む vec ファイル名 (上記の pos_24_24.vec に対応)。

-bg <background_file_name>:バックグラウンド説明ファイル、つまり、ネガティブ サンプル ファイル名 (上記の neg\neg.txt に対応) を含む説明ファイル。

-numPos <number_of_positive_samples>:各分類器トレーニングに使用される陽性サンプルの数 (デフォルト値は 2000)。

-numNeg <number_of_negative_samples>:各分類器トレーニングに使用されるネガティブ サンプルの数。これは、-bg で指定されたピクチャの数より大きくなる可能性があります (デフォルト値は 1000)。

-numStages <number_of_stages>:トレーニングされた分類子のステージ数 (デフォルトは 20)。

-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>:事前計算された特徴値 (特徴値) を保存するために使用されるキャッシュ サイズ。単位は MB (デフォルト値は 256)。

-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>:事前計算された特徴インデックスの保存に使用されるキャッシュ サイズ (MB 単位) (デフォルト値は 256)。

メモリが大きいほど、トレーニング時間は短くなります。

-baseFormatSave:このパラメータは、Haar 機能を使用する場合にのみ有効です。このパラメーターが指定されている場合、カスケード分類子は古い形式で保存されます (パラメーター項目はデフォルトでは指定されておらず、現時点ではその値は false です。一度指定されると、その値はデフォルトで true になります)。

カスケード パラメーター: CvCascadeParams クラス、cascadeclassifier.h で定義

-stageType <BOOST(デフォルト)>:レベル (ステージ) パラメータ。現在、カスケード型としてサポートされているのは BOOST 分類子のみです。

-featureType<{HAAR(default), LBP}>:特徴のタイプ: HAAR - Haar に似た特徴、LBP - ローカル テクスチャ パターン 特徴 (デフォルト Harr)。

-w <sampleWidth>:トレーニング サンプルの幅 (ピクセル単位、デフォルトは 24);

-h <sampleHeight>:トレーニング サンプルの高さ (ピクセル単位、デフォルトは 24);

トレーニング サンプルのサイズは、作成されたトレーニング サンプル (opencv_createsamples プログラムを使用して作成) のサイズと一致している必要があります。

ブーストされた分類子パラメーター: CvCascadeBoostParams クラス、boost.h で定義

-bt <{DAB, RAB, LB, GAB(default)}> : Boosted 分類器のタイプ (DAB - Discrete AdaBoost、RAB - Real AdaBoost、LB - LogitBoost、GAB - Gentle AdaBoost がデフォルトです);

-minHitRate <min_hit_rate> :分類器の各ステージに必要な最小検出率 (デフォルト値は 0.995)、合計検出率は約 min_hit_rate^number_of_stages です。

-maxFalseAlarmRate <max_false_alarm_rate> :分類器の各レベルで予想される最大誤検出率 (デフォルト値は 0.5)、合計誤検出率は約 max_false_alarm_rate^number_of_stages です。

-weightTrimRate <weight_trim_rate> :トリミングを使用するかどうかとその重みを指定します。適切な値は 0.95 です。

-maxDepth <max_ Depth_of_weak_tree> :弱分類器ツリーの最大の深さ。適切な値は 1 でこれは二分木 (切り株) です。

-maxWeakCount <max_weak_tree_count> :各レベルの弱分類器の最大数 (デフォルトは 100)。ブーストされた分類器 (ステージ) には、指定された -maxFalseAlarmRate を達成するために必要な数の弱いツリー (<=maxWeakCount) が含まれます。

        ステップ 9: トレーニングが完了すると、データ ファイル (これは 6 番目のステップで作成されたフォルダー) 内にカスケード ファイルが生成されます。これが必要なファイルです。

         ステップ 10: オブジェクトを認識するプログラムを作成します。

#识别图片
import cv2
import numpy as np

image = cv2.imread("C:/Users/huawei/Desktop/1/1 (1).jpg",1)
gary = cv2.cvtColor(image,code = cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier('D:/OPENCVtrain/opencv_bin/data/cascade.xml')
box = face_cascade.detectMultiScale(gary,scaleFactor=1.1,minNeighbors=7,minSize=[100,100])
for x,y,w,h in box:
    img1 = cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)
cv2.imshow('img',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

        便宜上、テスト用に未処理の陽性サンプル画像を読み取ります。

cv2.CascadeClassifier('D:/OPENCVtrain/opencv_bin/data/cascade.xml')
#这里的路径就是保存cascade.xml文件的路径

        このようにして、トレーニングが完了しました。ここでは 8 つの陽性サンプルのみを使用しているため、認識効果はあまり良くありません。これは、ここで説明する一般的なプロセスにすぎません。良好な認識効果を得たい場合は、次のようにしてください。できるだけ多くのポジティブなサンプル写真。

        初めてブログを書きましたので、不備等ございましたらご指摘お願い致します。

おすすめ

転載: blog.csdn.net/weixin_54963942/article/details/128305325