最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

trainFastRCNNObjectDetector

Fast R-CNN 深層学習オブジェクト検出器の学習

説明

trainedDetector = trainFastRCNNObjectDetector(trainingData,network,options) は、深層学習を使用して、Fast R-CNN (Regions with Convolutional Neural Networks) オブジェクト検出器を学習させます。Fast R-CNN 検出器を学習させて複数のオブジェクト クラスを検出することができます。

この関数には、Deep Learning Toolbox™ が必要です。Compute Capability 3.0 以上の CUDA® 対応 NVIDIA® GPU で使用する Parallel Computing Toolbox™ も推奨されます。

trainedDetector = trainFastRCNNObjectDetector(trainingData,checkpoint,options) は検出器のチェックポイントから学習を再開します。

trainedDetector = trainFastRCNNObjectDetector(trainingData,detector,options) は追加の学習データを使用して検出器の学習を継続するか、さらに多くの学習の反復回数を実行して検出器の精度を向上させます。

trainedDetector = trainFastRCNNObjectDetector(___,'RegionProposalFcn',proposalFcn) はオプションで、前の入力のいずれかを使用してカスタム領域提案関数 proposalFcn を学習させます。提案関数を指定しない場合、関数は Edge Boxes[2]アルゴリズムのバリエーションを使用します。

trainedDetector = trainFastRCNNObjectDetector(___,Name,Value) は、1 つ以上の Name,Value ペアの引数によって指定された追加オプションを使用します。

[trainedDetector,info] = trainFastRCNNObjectDetector(___) は、各反復の、学習損失や学習精度などの学習の進行状況に関する情報も返します。

すべて折りたたむ

学習データを読み込みます。

data = load('rcnnStopSigns.mat', 'stopSigns', 'fastRCNNLayers');
stopSigns = data.stopSigns;
fastRCNNLayers = data.fastRCNNLayers;

イメージ ファイルに絶対パスを追加します。

stopSigns.imageFilename = fullfile(toolboxdir('vision'),'visiondata', ...
    stopSigns.imageFilename);

学習のためにデータをランダムにシャッフルします。

rng(0);
shuffledIdx = randperm(height(stopSigns));
stopSigns = stopSigns(shuffledIdx,:);

table のファイルを使用して imageDatastore を作成します。

imds = imageDatastore(stopSigns.imageFilename);

table のラベル列を使用して boxLabelDatastore を作成します。

blds = boxLabelDatastore(stopSigns(:,2:end));

データストアを統合します。

ds = combine(imds, blds);

一時停止標識の学習イメージのサイズが異なっています。データを前処理して、イメージとボックスのサイズを事前定義されたサイズに変更します。

ds = transform(ds,@(data)preprocessData(data,[920 968 3]));

ネットワーク学習オプションを設定します。

options = trainingOptions('sgdm', ...
    'MiniBatchSize', 10, ...
    'InitialLearnRate', 1e-3, ...
    'MaxEpochs', 10, ...
    'CheckpointPath', tempdir);

Fast R-CNN 検出器を学習させます。学習は、完了するのに 2 ~ 3 分かかることがあります。

frcnn = trainFastRCNNObjectDetector(ds, fastRCNNLayers , options, ...
    'NegativeOverlapRange', [0 0.1], ...
    'PositiveOverlapRange', [0.7 1]);
*******************************************************************
Training a Fast R-CNN Object Detector for the following object classes:

* stopSign

--> Extracting region proposals from training datastore...done.

Training on single GPU.
|=======================================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |     Loss     |   Accuracy   |     RMSE     |      Rate       |
|=======================================================================================================|
|       1 |           1 |       00:00:29 |       0.3787 |       93.59% |         0.96 |          0.0010 |
|      10 |          10 |       00:05:14 |       0.3032 |       98.52% |         0.95 |          0.0010 |
|=======================================================================================================|

Detector training complete.
*******************************************************************

Fast R-CNN 検出器をテスト イメージでテストします。

img = imread('stopSignTest.jpg');

検出器を実行します。

[bbox, score, label] = detect(frcnn, img);

検出結果を表示します。

detectedImg = insertObjectAnnotation(img,'rectangle',bbox,score);
figure
imshow(detectedImg)

サポート関数

function data = preprocessData(data,targetSize)
% Resize image and bounding boxes to the targetSize.
scale = targetSize(1:2)./size(data{1},[1 2]);
data{1} = imresize(data{1},targetSize(1:2));
bboxes = round(data{2});
data{2} = bboxresize(bboxes,scale);
end

入力引数

すべて折りたたむ

ラベル付きのグラウンド トゥルース。データストアまたは table として指定します。

各境界ボックスは [x,y,width,height] の形式でなければなりません。

  • データストアを使用する場合は、関数 read や関数 readall によるそのデータストアの呼び出しにより、3 つの列 {images,boxes,labels} をもつ cell 配列または table が返されなければなりません。

    • images — 最初の列は、グレースケールや RGB のイメージ、または M x N x P のマルチチャネル イメージの cell ベクトルでなければなりません。

    • boxes — 2 番目の列は、境界ボックスの M 行 4 列の行列を含む、[x,y,width,height] 形式の cell ベクトルでなければなりません。ベクトルは、各イメージ内のオブジェクトの境界ボックスの位置とサイズを表します。

    • labels — 3 番目の列は、オブジェクト クラス名を格納する M 行 1 列の categorical ベクトルを含む cell ベクトルでなければなりません。データストアが返すすべての categorical データには、同じカテゴリが含まれていなければなりません。

    関数 combine を使用して、学習に使用するデータストアを作成できます。

    • imageDatastore — イメージを含むデータストアを作成します。

    • boxLabelDatastore — 境界ボックスとラベルを含むデータストアを作成します。

    • combine(imds,blds) — イメージ、境界ボックスおよびラベルを 1 つのデータストアに統合します。

    詳細については、深層学習用のデータストア (Deep Learning Toolbox)を参照してください。

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

ネットワーク。SeriesNetworkLayer オブジェクトの配列、layerGraph オブジェクト、またはネットワークの名前で指定します。trainingData テーブルで定義されているオブジェクト クラスを分類するようネットワークを学習させます。SeriesNetworkLayer、および layerGraph オブジェクトは Deep Learning Toolbox で使用可能です。

  • ネットワークを SeriesNetworkLayer オブジェクトの配列、またはネットワークの名前で指定する場合、オブジェクト検出をサポートする ROI 最大プーリング層、および新しい分類層と回帰層を追加して、ネットワークは自動的に Fast R-CNN ネットワークに変換されます。さらに、ROI 最大プーリング層の GridSize プロパティは、ネットワークの最後の最大プーリング層の出力サイズに設定されます。

  • Layer オブジェクトの配列には、オブジェクト クラスの数と背景クラスをサポートする分類層が含まれていなければなりません。各層の学習率をカスタマイズするには、この入力タイプを使用します。Layer オブジェクトの配列の例:

    layers = [imageInputLayer([28 28 3])
            convolution2dLayer([5 5],10)
            reluLayer()
            fullyConnectedLayer(10)
            softmaxLayer()
            classificationLayer()];
    

  • ネットワークを SeriesNetwork, Layer 配列として指定するか、ネットワークを名前で指定すると、ネットワークを作成するために追加した畳み込み用の重みと全結合層は 'narrow-normal' に初期化されます。

  • ネットワークの名前は、次の有効なネットワークの名前のいずれかでなければなりません。また、対応するアドオンをインストールしなければなりません。

    ネットワークの名前特徴抽出層の名前ROI プーリング層の出力サイズ説明
    alexnet'relu5'[6 6]最後の最大プーリング層は ROI 最大プーリング層によって置き換えられる
    vgg16'relu5_3'[7 7]
    vgg19'relu5_4'
    squeezenet'fire5-concat'[14 14]
    resnet18'res4b_relu'ROI プーリング層が特徴抽出層の後に挿入される。
    resnet50'activation_40_relu'
    resnet101'res4b22_relu'
    googlenet'inception_4d-output'
    mobilenetv2'block_13_expand_relu'
    inceptionv3'mixed7'[17 17]
    inceptionresnetv2'block17_20_ac'

  • LayerGraph オブジェクトは、有効な Fast R-CNN オブジェクト検出ネットワークでなければなりません。LayerGraph オブジェクトを使用して、カスタム Fast R-CNN ネットワークを学習させることもできます。

    ヒント

    ネットワークが DAGNetwork の場合、関数 layerGraph を使用してネットワークを LayerGraph オブジェクトに変換します。その後、Fast R-CNN オブジェクト検出ネットワークの作成の例の説明に従って、カスタム Fast R-CNN ネットワークを作成します。

Fast R-CNN ネットワークの作成方法の詳細については、R-CNN、Fast R-CNN および Faster R-CNN 入門を参照してください。

学習オプション。trainingOptions 関数によって、Deep Learning Toolbox から返されます。ネットワーク学習に使用するソルバーおよびその他のオプションを指定するには、trainingOptions を使用します。

メモ

trainFastRCNNObjectDetector は以下の学習オプションをサポートしていません。

  • Plots 値: 'training-progress'

  • ValidationDataValidationFrequency、または ValidationPatience オプション

  • OutputFcn オプション。

  • trainingOptionsShuffle のオプション 'once' および 'every-epoch' は、統合されたデータストアの入力ではサポートされません。

  • trainingOptionsExecutionEnvironment のオプション 'parallel' および 'multi-gpu' は、統合されたデータストアの入力を使用している場合はサポートされません。

保存した検出器のチェックポイント。fastRCNNObjectDetector オブジェクトとして指定します。エポックごとに検出器を保存するには、関数 trainingOptions の使用時に 'CheckpointPath' プロパティを設定します。ネットワークの学習には数時間かかる場合があるため、エポックごとにチェックポイントを保存することをお勧めします。

前に学習させた検出器のチェックポイントを読み込むには、チェックポイント パスから MAT ファイルを読み込みます。たとえば、options'CheckpointPath' プロパティが '/tmp' の場合、以下を使用してチェックポイントの MAT ファイルを読み込みます。

data = load('/tmp/faster_rcnn_checkpoint__105__2016_11_18__14_25_08.mat');

MAT ファイルの名前には検出器のチェックポイントが保存されたときの反復回数とタイムスタンプが含まれます。検出器はファイルの変数 detector に保存されます。このファイルを関数 trainFastRCNNObjectDetector に渡します。

frcnn = trainFastRCNNObjectDetector(stopSigns,...
                           data.detector,options);

前に学習させた Fast R-CNN オブジェクト検出器。fastRCNNObjectDetector オブジェクトとして指定します。

領域提案メソッド。関数ハンドルとして指定します。領域提案関数を指定しない場合、関数は EdgeBoxes [2] アルゴリズムのバリアントを実装します。関数は、以下の形式でなければなりません。

[bboxes,scores] = proposalFcn(I)

入力 I は、trainingData テーブルで定義されているイメージです。関数は、四角形の境界ボックス bboxes を m 行 4 列の配列で返さなければなりません。bboxes の各行には、4 要素ベクトル [x,y,width,height] が含まれます。このベクトルは、境界ボックスの左上隅とサイズをピクセル単位で指定します。また、関数は、各境界ボックスのスコアを m 行 1 列のベクトルで返さなければなりません。スコア値が高い場合、境界ボックスにオブジェクトが含まれている可能性が高いことを示します。スコアを使用して最も強い n 領域を選択します。ここで n は NumStrongestRegions の値で定義されます。

依存関係

カスタムの提案関数を指定せず、入力学習データに table を使用する場合、関数は Edge Boxes アルゴリズムのバリエーションを使用します。マルチチャネル イメージの入力学習データにデータストアを使用する場合、カスタム領域提案関数を指定しなければなりません。

名前と値のペアの引数

オプションの Name,Value 引数のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: 'PositiveOverlapRange',[0.75 1]

ポジティブ学習サンプルに対する境界ボックスのオーバーラップ率。'PositiveOverlapRange' と 2 要素ベクトルで構成されるコンマ区切りのペアとして指定します。ベクトルには範囲 [0,1] の値が含まれます。指定した範囲内のグラウンド トゥルース境界ボックスとオーバーラップする領域提案がポジティブ学習サンプルとして使用されます。

PositiveOverlapRangeNegativeOverlapRange の両方で使用されるオーバーラップ率は、次のように定義されます。

area(AB)area(AB)


A と B は境界ボックスです。

ネガティブ学習サンプルに対する境界ボックスのオーバーラップ率。NegativeOverlapRange と 2 要素ベクトルで構成されるコンマ区切りのペアとして指定します。ベクトルには範囲 [0,1] の値が含まれます。指定した範囲内のグラウンド トゥルース境界ボックスとオーバーラップする領域提案がネガティブ学習サンプルとして使用されます。

PositiveOverlapRangeNegativeOverlapRange の両方で使用されるオーバーラップ率は、次のように定義されます。

area(AB)area(AB)


A と B は境界ボックスです。

学習サンプルの生成に使用する最も強い領域提案の最大数。'NumStrongestRegions' と正の整数で構成されるコンマ区切りのペアとして指定します。この値を小さくすると処理時間が短縮されますが、学習精度は低下します。すべての領域提案を使用するには、この値を Inf に設定します。

各学習イメージからランダムにサンプリングする領域提案の数。整数で指定します。メモリ使用量を削減し、学習速度を高めるには、サンプリングする領域の数を減らします。この値を減らすと、学習精度も低下する可能性があります。

最小イメージの次元の長さ。幅または高さで 'SmallestImageDimension' と正の整数で構成されるコンマ区切りのペアとして指定します。学習イメージは最小の次元の長さが指定した整数と等しくなるようにサイズが変更されます。既定では、学習イメージのサイズは変更されません。学習イメージのサイズを変更すると、学習イメージが大きい場合に使用される計算コストとメモリの低減に役立ちます。一般的な値の範囲は、400 ~ 600 ピクセルです。

依存関係

  • SmallestImageDimension プロパティは、table 入力の学習データのみをサポートします。データストア入力の入力データのサイズを変更するには、関数 transform を使用します。

学習中に凍結されたバッチ正規化。'FreezeBatchNormalization' と true または false で構成されるコンマ区切りのペアとして指定します。この値は、ネットワークへの入力層が学習中に凍結されているかどうかを示します。小さいミニバッチのサイズで学習する場合、この値を true に設定します。バッチ サイズを小さくすると、効果的なバッチ正規化に必要なバッチの平均と分散の推定が悪くなります。

'FreezeBatchNormalization' に値を指定しない場合、関数はプロパティを以下に設定します。

  • 関数 trainingOptions の名前と値の引数 'MiniBatchSize' が 8 未満の場合、true

  • 関数 trainingOptions の名前と値の引数 'MiniBatchSize' が 8 以上の場合、false

この既定の動作をオーバーライドするには、'FreezeBatchNormalization' の値を指定しなければなりません。

出力引数

すべて折りたたむ

学習済み Fast R-CNN オブジェクト検出器。fastRCNNObjectDetector オブジェクトとして返されます。

学習に関する情報。次のフィールドを持つ構造体として返されます。各フィールドは、学習の反復ごとに 1 つの要素を持つ数値ベクトルです。特定の反復で計算されていない値は、NaN で表されます。

  • TrainingLoss — 各反復での学習損失。これは Fast R-CNN ネットワークを学習させるために使用される分類と回帰損失の組み合わせです。

  • TrainingAccuracy — 各反復での学習セット精度

  • TrainingRMSE — ボックス回帰層の平方根平均二乗誤差 (RMSE) の学習

  • BaseLearnRate — 各反復での学習率

ヒント

  • 学習のデータの前処理を高速化するために、trainFastRCNNObjectDetector は並列設定に基づいて並列プールを自動的に作成し、使用します。これらの設定の詳細については、並列設定を参照してください。並列計算設定を使用するには、Parallel Computing Toolbox が必要です。

  • VGG-16、VGG-19、ResNet-101、および Inception-ResNet-v2 は大きなモデルです。大きなモデルで学習すると、"メモリ不足" エラーが発生する可能性があります。これらの誤差を軽減するには、これらのオプションの 1 つ以上を試してください。

  • この関数は、転移学習をサポートします。network'resnet50' などの名前で入力する場合、関数はネットワークを事前学習済みの resnet50 モデル ベースの有効な Fast R-CNN ネットワーク モデルに自動的に変換します。または、事前学習済みの DAG ネットワークから抽出した LayerGraph を使用して手動でカスタム Fast R-CNN ネットワークを指定します。詳細は、Fast R-CNN オブジェクト検出ネットワークの作成を参照してください。

  • それぞれの名前付きネットワークが Fast R-CNN ネットワークにどのように変換されるかを次の表に示します。特徴抽出層の名前は、ROI プーリング層によって処理される層を指定します。ROI 出力サイズは、ROI プーリング層によって出力される特徴マップのサイズを指定します。

    ネットワークの名前特徴抽出層の名前ROI プーリング層の出力サイズ説明
    alexnet'relu5'[6 6]最後の最大プーリング層は ROI 最大プーリング層によって置き換えられる
    vgg16'relu5_3'[7 7]
    vgg19'relu5_4'
    squeezenet'fire5-concat'[14 14]
    resnet18'res4b_relu'ROI プーリング層が特徴抽出層の後に挿入される。
    resnet50'activation_40_relu'
    resnet101'res4b22_relu'
    googlenet'inception_4d-output'
    mobilenetv2'block_13_expand_relu'
    inceptionv3'mixed7'[17 17]
    inceptionresnetv2'block17_20_ac'

    ネットワークを Fast R-CNN ネットワークに変更または変換するには、R-CNN、Fast R-CNN、Faster R-CNN モデルの設計を参照してください。

  • 詳細印刷を有効または無効にするには、関数 trainingOptions を使用します。

参照

[1] Girshick, Ross. "Fast R-CNN." Proceedings of the IEEE International Conference on Computer Vision. 2015.

[2] Zitnick, C. Lawrence, and Piotr Dollar. "Edge Boxes: Locating Object Proposals From Edges." Computer Vision-ECCV 2014. Springer International Publishing, 2014, pp. 391–405.

拡張機能

R2017a で導入