Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

trainRCNNObjectDetector

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

説明

detector = trainRCNNObjectDetector(trainingData,network,options) は、R-CNN (Regions with Convolutional Neural Networks) ベースのオブジェクト検出器に学習させます。この関数は、深層学習を使用して、検出器に複数のオブジェクト クラスの検出を学習させます。

この R-CNN の実装では、各オブジェクト クラスの SVM 分類器の学習は実行されません。

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

detector = trainRCNNObjectDetector(___,Name,Value) は、Name,Value ペアの引数を 1 つ以上指定したオプションの入力プロパティを使用して detector オブジェクトを返します。

detector = trainRCNNObjectDetector(___,'RegionProposalFcn',proposalFcn) は、オプションで、カスタム領域提案関数を使用して R-CNN 検出器に学習させます。

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

detector = trainRCNNObjectDetector(___,Name=Value) では、名前と値のペアの引数を 1 つ以上指定した追加オプションと、前の入力のいずれかを使用します。

すべて折りたたむ

学習データとネットワーク層を読み込みます。

load('rcnnStopSigns.mat', 'stopSigns', 'layers')

MATLAB パスにイメージ ディレクトリを追加します。

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

ミニバッチのサイズ 32 を使用して GPU メモリ使用量を削減するようにネットワーク学習オプションを設定します。InitialLearnRate の値を小さくして、ネットワーク パラメーターの変更レートを下げます。これは事前学習済みのネットワークを微調整するときに便利で、ネットワークが急激に変化しないようにできます。

options = trainingOptions('sgdm', ...
  'MiniBatchSize', 32, ...
  'InitialLearnRate', 1e-6, ...
  'MaxEpochs', 10);

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

rcnn = trainRCNNObjectDetector(stopSigns, layers, options, 'NegativeOverlapRange', [0 0.3]);
*******************************************************************
Training an R-CNN Object Detector for the following object classes:

* stopSign

--> Extracting region proposals from 27 training images...done.

--> Training a neural network to classify objects in training data...

Training on single CPU.
Initializing input data normalization.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:01 |       96.88% |       0.1651 |      1.0000e-06 |
|       2 |          50 |       00:00:15 |       96.88% |       0.0807 |      1.0000e-06 |
|       3 |         100 |       00:00:27 |       96.88% |       0.1340 |      1.0000e-06 |
|       5 |         150 |       00:00:38 |       96.88% |       0.0225 |      1.0000e-06 |
|       6 |         200 |       00:00:49 |       93.75% |       0.6584 |      1.0000e-06 |
|       8 |         250 |       00:01:00 |       93.75% |       0.5233 |      1.0000e-06 |
|       9 |         300 |       00:01:11 |      100.00% |   2.9456e-05 |      1.0000e-06 |
|      10 |         350 |       00:01:23 |      100.00% |       0.0009 |      1.0000e-06 |
|========================================================================================|
Training finished: Max epochs completed.

Network training complete.

--> Training bounding box regression models for each object class...100.00%...done.

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

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

img = imread('stopSignTest.jpg');

[bbox, score, label] = detect(rcnn, img, MiniBatchSize=32);

最も強い検出結果を表示します。

[score, idx] = max(score);

bbox = bbox(idx, :);
annotation = sprintf('%s: (Confidence = %f)', label(idx), score);

detectedImg = insertObjectAnnotation(img, 'rectangle', bbox, annotation);

figure
imshow(detectedImg)

パスからイメージ ディレクトリを削除します。

rmpath(imDir);

追加のデータを使用して、R-CNN オブジェクト検出器の学習を再開します。この手順について説明するために、最初の検出器の学習にグラウンド トゥルース データの半分を使用します。次に、すべてのデータを使用して学習を再開します。

学習データを読み込んで学習オプションを初期化します。

load('rcnnStopSigns.mat', 'stopSigns', 'layers')

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

options = trainingOptions('sgdm', ...
    'MiniBatchSize', 32, ...
    'InitialLearnRate', 1e-6, ...
    'MaxEpochs', 10, ...
    'Verbose', false);

グラウンド トゥルースの一部を使用して R-CNN 検出器に学習させます。

rcnn = trainRCNNObjectDetector(stopSigns(1:10,:), layers, options, 'NegativeOverlapRange', [0 0.3]);

検出器から学習済みのネットワーク層を取得します。ネットワーク層の配列を trainRCNNObjectDetector に渡すと、そのネットワーク層をそのまま使用して学習が続行されます。

network = rcnn.Network;
layers = network.Layers;

すべての学習データを使用して学習を再開します。

rcnnFinal = trainRCNNObjectDetector(stopSigns, layers, options);

犬と猫の 2 つのオブジェクト クラスを対象とした R-CNN オブジェクト検出器を作成します。

objectClasses = {'dogs','cats'};

trainRCNNObjectDetector を使用してネットワークに学習させるには、ネットワークで犬と猫の両方と "背景" クラスを分類できなければなりません。この例では、背景を含むネットワークが追加されます。

numClassesPlusBackground = numel(objectClasses) + 1;

ネットワークの最終的な全結合層は、ネットワークで分類できるクラスの数を定義します。クラスの数および背景クラスと同じ出力サイズになるように最終的な全結合層を設定します。

layers = [ ...
    imageInputLayer([28 28 1])
    convolution2dLayer(5,20)        
    fullyConnectedLayer(numClassesPlusBackground);
    softmaxLayer()
    classificationLayer()];

これらのネットワーク層を使用して R-CNN 2 クラス オブジェクト検出器に学習させることができるようになりました。

R-CNN オブジェクト検出器を作成して、保存したネットワーク チェックポイントを使用するように設定します。ネットワーク チェックポイントは、trainingOptions の 'CheckpointPath' パラメーターが設定されている場合、ネットワークの学習中のエポックごとに保存されます。ネットワーク チェックポイントは、学習セッションが異常終了した場合に役立ちます。

一時停止標識学習データを読み込みます。

load('rcnnStopSigns.mat','stopSigns','layers')

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

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

関数 trainingOptions を使用して 'CheckpointPath' を設定します。

checkpointLocation = tempdir;
options = trainingOptions('sgdm','Verbose',false, ...
    'CheckpointPath',checkpointLocation);

いくつかのイメージを使用して R-CNN オブジェクト検出器に学習させます。

rcnn = trainRCNNObjectDetector(stopSigns(1:3,:),layers,options);

保存したネットワーク チェックポイントを読み込みます。

wildcardFilePath = fullfile(checkpointLocation,'convnet_checkpoint__*.mat');
contents = dir(wildcardFilePath);

いずれかのチェックポイント ネットワークを読み込みます。

filepath = fullfile(contents(1).folder,contents(1).name);
checkpoint = load(filepath);

checkpoint.net
ans = 

  SeriesNetwork with properties:

    Layers: [15×1 nnet.cnn.layer.Layer]

新しい R-CNN オブジェクト検出器を作成して、保存したネットワークを使用するように設定します。

rcnnCheckPoint = rcnnObjectDetector();
rcnnCheckPoint.RegionProposalFcn = @rcnnObjectDetector.proposeRegions;

Network を保存したネットワーク チェックポイントに設定します。

rcnnCheckPoint.Network = checkpoint.net
rcnnCheckPoint = 

  rcnnObjectDetector with properties:

              Network: [1×1 SeriesNetwork]
           ClassNames: {'stopSign'  'Background'}
    RegionProposalFcn: @rcnnObjectDetector.proposeRegions

入力引数

すべて折りたたむ

ラベル付きのグラウンド トゥルース イメージ。2 列以上の table として指定します。

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

テーブル変数名はオブジェクト クラス名を定義します。グラウンド トゥルース テーブルを作成するには、イメージ ラベラー アプリを使用します。32 行 32 列より小さいボックスは学習に使用されません。

ネットワーク。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 オブジェクトの配列、またはネットワークの名前で指定する場合、オブジェクト検出をサポートする新しい分類層と回帰層を追加して、ネットワークは自動的に R-CNN ネットワークに変換されます。

  • 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' に初期化されます。

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

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

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

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

メモ

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

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

名前と値の引数

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

例: PositiveOverlapRange=[0.5 1]

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

例: "PositiveOverlapRange",[0.5 1]

境界ボックスのオーバーラップ範囲におけるポジティブ学習サンプルの比率。2 要素ベクトルとして指定します。ベクトルには範囲 [0,1] の値が含まれます。指定した範囲内のグラウンド トゥルース境界ボックスとオーバーラップする領域提案がポジティブ学習サンプルとして使用されます。

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

area(AB)area(AB)


AB は境界ボックスです。

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

学習サンプルの生成に使用する最も強い領域提案の最大数。整数として指定します。この値を小さくすると処理時間が短縮されますが、学習精度は低下します。すべての領域提案を使用するには、この値を inf に設定します。

カスタム領域提案関数ハンドル。関数ハンドルとして指定します。カスタム領域提案関数を指定しない場合、rcnnObjectDetector で設定されている Edge Boxes アルゴリズム [3]の既定のバリアントが使用されます。カスタムの proposalFcn は次の関数形式でなければなりません。

 [bboxes,scores] = proposalFcn(I)

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

ボックス回帰層の名前。文字ベクトルとして指定します。有効な値は 'auto' または入力ネットワークの層の名前です。この層の出力活性化は、検出された境界ボックスを調整するよう回帰モデルに学習させる特徴として使用されます。

名前が 'auto' の場合、trainRCNNObjectDetector は、入力ネットワークのタイプに基づいて入力ネットワークから自動的に層を選択します。

  • 入力 networkSeriesNetwork または Layer オブジェクトの配列の場合、関数は最後の畳み込み層を選択します。

  • 入力 networkLayerGraph の場合、関数は最後の全結合層の結合元を選択します。

検出器の学習実験の監視。実験マネージャー (Deep Learning Toolbox) アプリで使用するexperiments.Monitor (Deep Learning Toolbox) オブジェクトとして指定します。このオブジェクトを使用して、学習の進行状況を追跡したり、学習結果テーブルで情報フィールドを更新したり、学習で使用したメトリクスの値を記録したり、学習プロットを生成したりできます。

学習中に監視される情報:

  • 各反復での学習損失。

  • 各反復での学習精度。

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

  • 各反復での学習率。

出力引数

すべて折りたたむ

学習済みの R-CNN ベースのオブジェクト検出器。rcnnObjectDetector オブジェクトとして返されます。R-CNN 検出器に学習させて複数のオブジェクト クラスを検出することができます。

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

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

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

  • BaseLearnRate — 各反復での学習率

制限

  • この R-CNN の実装では、各オブジェクト クラスの SVM 分類器の学習は実行されません。

ヒント

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

  • VGG-16、VGG-19、ResNet-101、および Inception-ResNet-v2 は大きなモデルです。大きなモデルで学習すると、"メモリ不足" エラーが発生する可能性があります。このようなエラーを軽減するには、trainRCNNObjectDetector を呼び出す前に境界ボックスのグラウンド トゥルース データと共にイメージのサイズを手動で変更します。

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

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

参照

[1] Girshick, R., J. Donahue, T. Darrell, and J. Malik. “Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation.”Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2014, pp. 580–587.

[2] Girshick, R. “Fast R-CNN.” Proceedings of the IEEE International Conference on Computer Vision. 2015, pp. 1440–1448.

[3] Zitnick, C. Lawrence, and P. Dollar. “Edge Boxes: Locating Object Proposals from Edges.” Computer Vision-ECCV, Springer International Publishing. 2014, pp. 391–405.

拡張機能

バージョン履歴

R2016b で導入