Main Content

trainCascadeObjectDetector

カスケード型オブジェクト検出器モデルの学習

説明

trainCascadeObjectDetector(outputXMLFilename,positiveInstances,negativeImages) は、学習済みのカスケード検出器を outputXMLFilename という名前の XML ファイルに書き込みます。ファイル名には XML 拡張子が含まれていなければなりません。この関数の動作の詳細については、カスケード型オブジェクト検出器入門を参照してください。

trainCascadeObjectDetector(outputXMLFilename,'resume') は、中断された学習セッションを再開します。outputXMLFilename 入力は、中断されたセッションの出力ファイル名と一致していなければなりません。前のセッションで保存されたすべての引数が自動的に再利用されます。

trainCascadeObjectDetector(___,Name=Value) は、前の構文にある引数の任意の組み合わせに加えて、名前と値の引数を 1 つ以上使用してオプションを指定します。たとえば、ObjectTrainingSize=[100,100] は、学習中のオブジェクトの高さと幅を設定します。

すべて折りたたむ

MAT ファイルからポジティブ サンプル データを読み込みます。このファイルにはグラウンド トゥルースが含まれています。いくつかのオブジェクト カテゴリに対する境界ボックスの table として指定します。このグラウンド トゥルースは、Image Labeler アプリからラベル付けしてエクスポートされています。

load('stopSignsAndCars.mat');

一時停止標識のイメージの前に絶対パスを付けます。

stopSigns = fullfile(toolboxdir('vision'),'visiondata',stopSignsAndCars{:,1});

データストアを作成して、一時停止標識のグラウンド トゥルース データを読み込みます。

imds = imageDatastore(stopSigns);
blds = boxLabelDatastore(stopSignsAndCars(:,2));

イメージ データストアとボックス ラベル データストアを組み合わせます。

positiveInstances = combine(imds,blds);

MATLAB パスにイメージ フォルダーのパスを追加します。

imDir = fullfile(matlabroot,'toolbox','vision','visiondata','stopSignImages');
addpath(imDir);

ネガティブ イメージのフォルダーを指定します。

negativeFolder = fullfile(matlabroot,'toolbox','vision','visiondata','nonStopSigns');

ネガティブ イメージを含む imageDatastore オブジェクトを作成します。

negativeImages = imageDatastore(negativeFolder);

HOG 特徴を使用して 'stopSignDetector.xml' という名前のカスケード型オブジェクト検出器に学習させます。メモ: コマンドの実行には数分かかる場合があります。

trainCascadeObjectDetector('stopSignDetector.xml',positiveInstances,negativeFolder,FalseAlarmRate=0.1,NumCascadeStages=5);
Automatically setting ObjectTrainingSize to [35, 32]
Using at most 42 of 42 positive samples per stage
Using at most 84 negative samples per stage

--cascadeParams--
Training stage 1 of 5
[........................................................................]
Used 42 positive and 84 negative samples
Time to train stage 1: 0 seconds

Training stage 2 of 5
[........................................................................]
Used 42 positive and 84 negative samples
Time to train stage 2: 0 seconds

Training stage 3 of 5
[........................................................................]
Used 42 positive and 84 negative samples
Time to train stage 3: 2 seconds

Training stage 4 of 5
[........................................................................]
Used 42 positive and 84 negative samples
Time to train stage 4: 6 seconds

Training stage 5 of 5
[........................................................................]
Used 42 positive and 17 negative samples
Time to train stage 5: 9 seconds

Training complete

新たに学習させた分類器を使用して、イメージ内の一時停止標識を検出します。

detector = vision.CascadeObjectDetector('stopSignDetector.xml');

テスト イメージを読み取ります。

img = imread('stopSignTest.jpg');

テスト イメージ内の一時停止標識を検出します。

bbox = step(detector,img);

境界ボックスの四角形を挿入し、マークしたイメージを返します。

 detectedImg = insertObjectAnnotation(img,'rectangle',bbox,'stop sign');

検出した一時停止標識を表示します。

figure;

imshow(detectedImg);

パスからイメージ フォルダーを削除します。

rmpath(imDir);

入力引数

すべて折りたたむ

ポジティブ サンプル。データストアまたは 2 列の table として指定します。

  • データストアを使用する場合は、関数 read および関数 readall を使用してデータストアを呼び出すと、cell 配列か、列が少なくとも 2 つある table が返されるよう、データを設定しなければなりません。この表は、列に含まれるデータを示しています。

    Imagesboxeslabels (optional)

    グレースケールまたは RGB イメージの cell ベクトル。

    [x, y, width, height] の形式の境界ボックスで構成される M 行 4 列の行列。ここで、[x,y] は境界ボックスの左上の座標を表します。

    オブジェクト クラス名を含む M 要素の categorical ベクトルを含む cell 配列。データストアが返すすべての categorical データには、同じカテゴリが含まれていなければなりません。

    このデータを提供すると、関数はクラス ラベルを使用して、vision.CascadeObjectDetector オブジェクトとして指定された学習済みの検出器の ClassificationModel プロパティを埋めます。それ以外の場合、カスケード型オブジェクト検出器は単一クラスの検出器であるため、学習にクラス ラベルは必要ありません。

  • table を使用する場合、table は 2 列以上でなければなりません。table の最初の列には、パスを含むイメージ ファイル名が含まれていなければなりません。イメージは、グレースケールまたはトゥルーカラー (RGB) でなければならず、imread でサポートされている任意の形式を指定できます。残りの各列は、vehicle、flower、stop sign などの単一のオブジェクト クラスを表す M 行 4 列の行列を含む cell ベクトルでなければなりません。これらの列には、[x,y,width,height] 形式の、M 個の境界ボックスの 4 要素 double 配列が含まれます。この形式は、対応するイメージでの境界ボックスの左上隅の位置とサイズを指定します。グラウンド トゥルース table の作成には、イメージ ラベラーアプリまたはビデオ ラベラー アプリを使用できます。生成されたグラウンド トゥルースから学習データの table を作成するには、関数 objectDetectorTrainingData を使用します。

ネガティブ イメージ。ImageDatastore オブジェクト、イメージを含むフォルダーへのパス、またはイメージ ファイル名の cell 配列として指定します。イメージを使用してネガティブ サンプルが生成されるため、イメージには対象オブジェクトを含めないでください。代わりに、オブジェクトに関連付けられた背景を含めるようにします。

学習済みのカスケード検出器のファイル名。XML 拡張子付きの文字ベクトルまたは string スカラーとして指定します。たとえば、'stopSignDetector.xml' とします。

データ型: char

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値の各ペアを区切り、Name を引用符で囲みます。

例: FeatureType='Haar' は、使用する特徴のタイプに Haar を指定します。

学習のオブジェクト サイズ。2 要素の [height, width] ベクトルまたは 'Auto' として指定します。学習前に、関数はポジティブ サンプルとネガティブ サンプルのピクセル単位のサイズを ObjectTrainingSize に変更します。'Auto' を選択すると、関数は、ポジティブ インスタンスの幅と高さの比率の中央値に基づいてサイズを自動的に決定します。最適な検出精度を得るには、学習用のオブジェクト サイズを、イメージ内で想定されるオブジェクト サイズに近い値に指定します。ただし、学習と検出にかかる時間を短縮するには、学習用のオブジェクト サイズを、イメージ内で想定されるオブジェクト サイズより小さな値に設定します。

データ型: char | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

ネガティブ サンプル係数。実数値のスカラーとして指定します。各段で使用するネガティブ サンプルの数は、次と等しくなります。

NegativeSamplesFactor × [the number of positive samples used at each stage]

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

学習させるカスケードの段数。正の整数として指定します。段数を多くすると検出器の精度が向上する可能性がありますが、学習時間も長くなります。各段でいくつかのポジティブ サンプルとネガティブ サンプルが排除されるため、段数を多くするとより多くの学習イメージが必要になります。この値は、FalseAlarmRateTruePositiveRate の値によって異なります。段数が多くなると、FalseAlarmRate の値を大きくすることも可能です。詳細については、カスケード型オブジェクト検出器入門チュートリアルを参照してください。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

各段で許容可能な偽警報率。(0 1] の範囲の値として指定します。偽警報率とは、誤ってポジティブ サンプルとして分類されるネガティブ学習サンプルの割合です。

全体的な偽警報率は、各段の FalseAlarmRate とカスケードの段数 NumCascadeStages を使用して計算されます。

FalseAlarmRateNumCascadeStages

FalseAlarmRate の値を小さくすると、各段の複雑度が増します。複雑度が増すと誤検知が少なくなる可能性がありますが、学習と検出にかかる時間が長くなります。FalseAlarmRate の値を大きくすると、妥当な検出精度を実現するためにカスケードの段数を増やす必要がある場合があります。

データ型: single | double

各段で必要な最小真陽性率。(0 1] の範囲の値として指定します。真陽性率とは、正しくポジティブ学習サンプルとして分類されるサンプルの割合です。

結果として得られる全体的なターゲット陽性率は、各段の TruePositiveRate とカスケードの段数 NumCascadeStages を使用して計算されます。

TruePositiveRateNumCascadeStages

TruePositiveRate の値を大きくすると、各段の複雑度が増します。複雑度が増すと正しい検出の数が多くなる可能性がありますが、学習と検出にかかる時間が長くなります。

データ型: single | double

特徴のタイプ。次のいずれかとして指定します。

'Haar'[1] — Haar-like 特徴
'LBP'[2] — ローカル バイナリ パターン
'HOG'[3] — 勾配方向ヒストグラム

特に Haar 特徴の場合、関数は大量のメモリを割り当てます。メモリ不足を回避するため、この関数は、十分な量の RAM がある 64 ビットのオペレーティング システムで使用してください。

データ型: char

ヒント

  • 良質の検出器の学習には数千単位の学習サンプルが必要です。大量のデータを処理する時間は場合によって異なりますが、数時間から数日に及ぶ長い時間がかかります。学習中は、関数によって各ステージの学習にかかった時間が MATLAB® のコマンド ウィンドウに表示されます。

  • この関数で使用される OpenCV HOG パラメーターは次のとおりです。

    • Numbins: 9

    • CellSize = [8 8]

    • BlockSize = [4 4]

    • BlockOverlap = [2 2]

    • UseSignedOrientation = false

参照

[1] Viola, P., and M. J. Jones. "Rapid Object Detection using a Boosted Cascade of Simple Features." Proceedings of the 2001 IEEE Computer Society Conference. Volume 1, 15 April 2001, pp. I-511–I-518.

[2] Ojala, T., M. Pietikainen, and T. Maenpaa. “Multiresolution Gray-scale and Rotation Invariant Texture Classification With Local Binary Patterns.” IEEE Transactions on Pattern Analysis and Machine Intelligence. Volume 24, No. 7 July 2002, pp. 971–987.

[3] Dalal, N., and B. Triggs. “Histograms of Oriented Gradients for Human Detection.” IEEE Computer Society Conference on Computer Vision and Pattern Recognition. Volume 1, 2005, pp. 886–893.

バージョン履歴

R2013a で導入