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

trainRCNNObjectDetector

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

構文

detector = trainRCNNObjectDetector(trainingData,network,options)
detector = trainRCNNObjectDetector(___,Name,Value)
detector = trainRCNNObjectDetector(___,'RegionProposalFcn',proposalFcn)
[detector,info] = trainRCNNObjectDetector(___)

説明

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

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

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

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

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

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

すべて折りたたむ

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

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

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

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

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

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

Step 1 of 3: Extracting region proposals from 27 training images...done.

Step 2 of 3: Training a neural network to classify objects in training data...

|=========================================================================================|
|     Epoch    |   Iteration  | Time Elapsed |  Mini-batch  |  Mini-batch  | Base Learning|
|              |              |  (seconds)   |     Loss     |   Accuracy   |     Rate     |
|=========================================================================================|
|            3 |           50 |         9.27 |       0.2895 |       96.88% |     0.000001 |
|            5 |          100 |        14.77 |       0.2443 |       93.75% |     0.000001 |
|            8 |          150 |        20.29 |       0.0013 |      100.00% |     0.000001 |
|           10 |          200 |        25.94 |       0.1524 |       96.88% |     0.000001 |
|=========================================================================================|

Network training complete.

Step 3 of 3: Training bounding box regression models for each object class...100.00%...done.

R-CNN 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 列以上のテーブルとして指定します。1 列目には、グレースケールまたはトゥルーカラー (RGB) のイメージへのパスとファイル名が含まれていなければなりません。残りの列には、対応するイメージに関連する境界ボックスが含まれていなければなりません。各列は、自動車、犬、花、一時停止標識などの単一のオブジェクト クラスを表します。

各境界ボックスは [x,y,width,height] の形式でなければなりません。この形式は、対応するイメージでのオブジェクトの左上隅の位置とサイズを指定します。テーブル変数名はオブジェクト クラス名を定義します。グラウンド トゥルース テーブルを作成するには、イメージ ラベラー アプリを使用します。32 行 32 列より小さいボックスは学習に使用されません。

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

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

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

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

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

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

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

学習オプション。関数 trainingOptions によって返される TrainingOptionsSGDMTrainingOptionsRMSProp、または TrainingOptionsADAM オブジェクトとして指定します。ネットワーク学習に使用するソルバーおよびその他のオプションを指定するには、trainingOptions を使用します。

メモ

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

  • Plots 値: 'training-progress'

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

名前と値のペアの引数

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

例: 'PositiveOverlapRange',[0.5 1]

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

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

area(AB)area(AB)


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

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

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

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

 [bboxes,scores] = proposalFcn(I)

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

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

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

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

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

出力引数

すべて折りたたむ

学習済みの 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 モデル ベースの有効な R-CNN ネットワーク モデルに自動的に変換されます。または、事前学習済みの DAG ネットワークから抽出した LayerGraph を使用して手動でカスタム R-CNN ネットワークを指定します。R-CNN オブジェクト検出ネットワークの作成を参照してください。

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

参照

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