Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

trainFastRCNNObjectDetector

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

説明

検出器の学習

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

この関数には、Deep Learning Toolbox™ が必要です。CUDA® 対応 NVIDIA® GPU で使用する Parallel Computing Toolbox™ も推奨されます。サポートされる Compute Capability の詳細については、リリース別の GPU サポート (Parallel Computing Toolbox)を参照してください。

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

検出器の学習の再開

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 ペアの引数によって指定された追加オプションを使用します。

すべて折りたたむ

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

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 を使用してデータストアを呼び出すと、cell 配列か 2 列または 3 列のテーブルが返されるよう、データを設定しなければなりません。出力が 2 列の場合、{boxes,labels} のように、1 列目には境界ボックスが、2 列目にはラベルが含まれていなければなりません。出力が 3 列の場合、2 列目には境界ボックスが、3 列目にはラベルが含まれていなければなりません。この場合、1 列目には任意の型のデータを含められます。たとえば、1 列目にイメージや点群データを含められます。

    databoxeslabels
    1 列目には、点群データやイメージなどのデータを含められます。2 列目は cell 配列で、[xcenter, ycenter, width, height, yaw] の形式を取る M 行 5 列の境界ボックスの行列でなければなりません。ベクトルは、各イメージ内のオブジェクトの境界ボックスの位置とサイズを表します。3 列目は、オブジェクト クラス名を含む M 行 1 列の categorical ベクトルを含む cell 配列でなければなりません。データストアが返すすべての categorical データには、同じカテゴリが含まれていなければなりません。

    詳細については、深層学習用のデータストア (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 を使用します。

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

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

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

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

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

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

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

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

    ヒント

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

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

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

メモ

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

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

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

  • 学習オプション DispatchInBackgroundtrue に設定した場合、データストアの入力はサポートされません。

保存した検出器のチェックポイント。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 (Deep Learning Toolbox) の名前と値の引数 'MiniBatchSize' が 8 未満の場合、true

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

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

出力引数

すべて折りたたむ

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

学習の進行状況の情報。8 つのフィールドを持つ構造体配列として返されます。各フィールドが学習の段階に対応しています。

  • TrainingLoss — 各反復での学習損失は、位置推定誤差、信頼度損失、および分類損失の合計として計算される平均二乗誤差 (MSE) です。学習損失関数の詳細については、Training Lossを参照してください。

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

  • TrainingRMSE — 学習の平方根平均二乗誤差 (RMSE) は、各反復での学習損失から計算される RMSE です。

  • BaseLearnRate — 各反復での学習率。

  • ValidationLoss — 各反復での検証損失。

  • ValidationAccuracy — 各反復での検証精度。

  • ValidationRMSE — 各反復での検証の RMSE。

  • FinalValidationLoss — 学習終了時の最終検証損失。

  • FinalValidationRMSE — 学習終了時の最終検証 RMSE。

各フィールドは、学習の反復ごとに 1 つの要素を持つ数値ベクトルです。特定の反復で計算されていない値は、NaN が割り当てられます。options で検証データを指定した場合のみ、この構造体には ValidationLossValidationAccuracyValidationRMSEFinalValidationLoss、および FinalValidationRMSE フィールドが含まれます。

ヒント

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

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

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

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

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

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

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

参照

[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 で導入