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

trainFasterRCNNObjectDetector

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

構文

trainedDetector = trainFasterRCNNObjectDetector(trainingData,network,options)
trainedDetector = trainFasterRCNNObjectDetector(trainingData,checkpoint,options)
trainedDetector = trainFasterRCNNObjectDetector(trainingData,detector,options)
trainedDetector = trainFasterRCNNObjectDetector(___,Name,Value)
[trainedDetector,info] = trainFasterRCNNObjectDetector(___)

説明

trainedDetector = trainFasterRCNNObjectDetector(trainingData,network,options) は、深層学習で 4 ステップの交互学習手法を使用して、Faster R-CNN (Regions with Convolution Neural Networks) オブジェクト検出器を学習させます。[1]Faster R-CNN 検出器を学習させて複数のオブジェクト クラスを検出することができます。

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

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

trainedDetector = trainFasterRCNNObjectDetector(trainingData,detector,options) は、Faster R-CNN オブジェクト検出器の学習を継続します。

trainedDetector = trainFasterRCNNObjectDetector(___,Name,Value) では、1 つ以上の Name,Value ペア引数によって指定される追加オプションと、前の入力のいずれかを使用します。

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

すべて折りたたむ

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

data = load('fasterRCNNVehicleTrainingData.mat');

trainingData = data.vehicleTrainingData;

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

ネットワーク層を設定します。

layers = data.layers
layers = 

  11x1 Layer array with layers:

     1   ''   Image Input             32x32x3 images with 'zerocenter' normalization
     2   ''   Convolution             32 3x3 convolutions with stride [1  1] and padding [1  1  1  1]
     3   ''   ReLU                    ReLU
     4   ''   Convolution             32 3x3 convolutions with stride [1  1] and padding [1  1  1  1]
     5   ''   ReLU                    ReLU
     6   ''   Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     7   ''   Fully Connected         64 fully connected layer
     8   ''   ReLU                    ReLU
     9   ''   Fully Connected         2 fully connected layer
    10   ''   Softmax                 softmax
    11   ''   Classification Output   crossentropyex

学習オプションを設定します。

  • InitialLearnRate の値を小さくして、ネットワーク パラメーターの変更レートを下げます。

  • 検出器のチェックポイントを一時ディレクトリに保存するように CheckpointPath を設定します。必要に応じてこれを別の場所に変更します。

  • MaxEpochs を 1 に設定し、例の学習時間を短縮します。適切な学習ではこれを 10 に増やします。

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

検出器を学習させます。学習には 2 ~ 3 分かかります。

detector = trainFasterRCNNObjectDetector(trainingData, layers, options)
Starting parallel pool (parpool) using the 'local' profile ...
connected to 12 workers.
*************************************************************************
Training a Faster R-CNN Object Detector for the following object classes:

* vehicle

Step 1 of 4: Training a Region Proposal Network (RPN).
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:06 |       1.5273 |       53.91% |         0.92 |          0.0010 |
|       1 |         200 |       00:00:27 |       1.6777 |       50.00% |         0.83 |          0.0010 |
|       2 |         400 |       00:00:48 |       1.1392 |      100.00% |         1.05 |          0.0010 |
|       3 |         600 |       00:01:08 |       1.8571 |      100.00% |         1.50 |          0.0010 |
|       3 |         800 |       00:01:27 |       2.4457 |      100.00% |         1.82 |          0.0010 |
|       4 |        1000 |       00:01:48 |       0.5591 |      100.00% |         0.66 |          0.0010 |
|       5 |        1200 |       00:02:11 |       2.4903 |      100.00% |         1.93 |          0.0010 |
|       5 |        1400 |       00:02:30 |       0.7697 |      100.00% |         0.84 |          0.0010 |
|       5 |        1475 |       00:02:37 |       0.5513 |      100.00% |         0.68 |          0.0010 |
|=======================================================================================================|

Step 2 of 4: Training a Fast R-CNN Network using the RPN from step 1.
*******************************************************************
Training a Fast R-CNN Object Detector for the following object classes:

* vehicle

--> Extracting region proposals from 295 training images...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:02 |       0.9051 |       75.78% |         0.93 |          0.0010 |
|       1 |         200 |       00:00:19 |       0.2377 |       92.31% |         0.71 |          0.0010 |
|       2 |         400 |       00:00:37 |       0.2268 |       92.45% |         0.53 |          0.0010 |
|       3 |         600 |       00:00:54 |       0.3148 |       89.92% |         0.70 |          0.0010 |
|       3 |         800 |       00:01:11 |       0.2093 |       91.41% |         0.56 |          0.0010 |
|       4 |        1000 |       00:01:27 |       0.1125 |       97.66% |         1.02 |          0.0010 |
|       5 |        1200 |       00:01:46 |       0.4125 |       91.41% |         0.82 |          0.0010 |
|       5 |        1400 |       00:02:03 |       0.2403 |       91.41% |         0.64 |          0.0010 |
|       5 |        1445 |       00:02:07 |       0.9817 |       76.56% |         0.82 |          0.0010 |
|=======================================================================================================|

Step 3 of 4: Re-training RPN using weight sharing with Fast R-CNN.
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:00 |       1.0772 |      100.00% |         1.01 |          0.0010 |
|       1 |         200 |       00:00:18 |       2.4481 |      100.00% |         1.86 |          0.0010 |
|       2 |         400 |       00:00:36 |       1.3111 |       50.78% |         0.72 |          0.0010 |
|       3 |         600 |       00:00:54 |       0.5687 |      100.00% |         0.71 |          0.0010 |
|       3 |         800 |       00:01:12 |       0.7452 |       97.66% |         0.81 |          0.0010 |
|       4 |        1000 |       00:01:30 |       0.8767 |       97.66% |         0.82 |          0.0010 |
|       5 |        1200 |       00:01:49 |       1.2515 |       94.53% |         1.15 |          0.0010 |
|       5 |        1400 |       00:02:07 |       0.6098 |       98.44% |         0.73 |          0.0010 |
|       5 |        1475 |       00:02:14 |       0.5851 |      100.00% |         0.73 |          0.0010 |
|=======================================================================================================|

Step 4 of 4: Re-training Fast R-CNN using updated RPN.
*******************************************************************
Training a Fast R-CNN Object Detector for the following object classes:

* vehicle

--> Extracting region proposals from 295 training images...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:00 |       0.1679 |       96.88% |         0.51 |          0.0010 |
|       1 |         200 |       00:00:15 |       0.1168 |       96.40% |         0.64 |          0.0010 |
|       2 |         400 |       00:00:31 |       0.1058 |       97.66% |         0.57 |          0.0010 |
|       3 |         600 |       00:00:47 |       0.1568 |       95.31% |         0.45 |          0.0010 |
|       3 |         800 |       00:01:03 |       0.0710 |       99.22% |         0.65 |          0.0010 |
|       4 |        1000 |       00:01:18 |       0.1159 |       93.75% |         0.55 |          0.0010 |
|       5 |        1200 |       00:01:36 |       0.0874 |       98.44% |         0.59 |          0.0010 |
|       5 |        1400 |       00:01:51 |       0.0827 |       99.22% |         0.69 |          0.0010 |
|       5 |        1470 |       00:01:57 |       0.0778 |       99.22% |         0.43 |          0.0010 |
|=======================================================================================================|

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



detector = 

  fasterRCNNObjectDetector with properties:

        ModelName: 'vehicle'
          Network: [1×1 DAGNetwork]
      AnchorBoxes: [5×2 double]
       ClassNames: {'vehicle'  'Background'}
    MinObjectSize: [1 1]

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

img = imread('highway.png');

検出器を実行します。

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

検出結果を表示します。

detectedImg = insertShape(img, 'Rectangle', bbox);
figure
imshow(detectedImg)

入力引数

すべて折りたたむ

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

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

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

  • ネットワークを SeriesNetworkLayer オブジェクトの配列、またはネットワークの名前で指定する場合、オブジェクト検出をサポートする領域提案ネットワーク (RPN)、ROI 最大プーリング層、および新しい分類層と回帰層を追加して、ネットワークは自動的に Faster R-CNN ネットワークに変換されます。

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

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

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

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

    ヒント

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

メモ

Faster R-CNN は、小さいバッチ サイズを使用して学習させます。このようにすると、バッチ正規化層が信頼できない平均値および分散値を推定する原因になる可能性があります。入力 networkSeriesNetwork に設定するか、'resnet50' などのネットワーク名に設定する場合、検出器の学習中にバッチ正規化層の学習は行われず、バッチ正規化層は固定正規化層に変更されます。入力を Layer オブジェクトの配列か LayerGraph に設定する場合、バッチ正規化層はそのまま学習します。この場合、ネットワークの特徴抽出部分でバッチ正規化層を使用しないでください。

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

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

Faster R-CNN の学習を行うには、学習オプション オブジェクトの MiniBatchSize プロパティは、1 でなければなりません。Faster R-CNN は "イメージ中心" の学習アプローチを使用します。このアプローチでは、イメージ内の複数の領域をサンプリングして、学習バッチを作成します。trainFasterRCNNObjectDetector の引数 NumRegionsToSample を使用して、イメージごとにサンプリングされる領域の数を指定します。

メモ

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

  • ExecutionEnvironment 学習オプションの 'multi-gpu' 値または 'parallel'

  • Plots 学習オプションの 'training-progress'

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

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

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

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

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

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

前に学習させた Faster R-CNN オブジェクト検出器。fasterRCNNObjectDetector オブジェクトとして指定します。追加の学習データを使用して検出器の学習を継続するか、さらに多くの学習の反復回数を実行して検出器の精度を向上させるには、この構文を使用します。

名前と値のペアの引数

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

例: 'PositiveOverlapRange',[0.75 1]

ポジティブ学習サンプルに対する境界ボックスのオーバーラップ比率。'PositiveOverlapRange' と次のいずれかで構成されるコンマ区切りのペアとして指定します。

  • 4 つすべての学習ステージに同一のオーバーラップ率を指定する 2 要素ベクトル。

  • 4 行 2 列の行列。各行は 4 つの学習ステージそれぞれにオーバーラップ率を指定します。

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

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

area(AB)area(AB)


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

ネガティブ学習サンプルに対する境界ボックスのオーバーラップ比率。NegativeOverlapRange と次のいずれかで構成されるコンマ区切りのペアとして指定します。

  • 4 つすべての学習ステージに同一のオーバーラップ率を指定する 2 要素ベクトル。

  • 4 行 2 列の行列。各行は 4 つの学習ステージそれぞれにオーバーラップ率を指定します。

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

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

area(AB)area(AB)


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

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

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

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

領域提案ネットワーク (RPN) のアンカー ボックス ピラミッドを作成するのに使用される最小アンカー ボックス サイズ。'MinBoxSizes' と m 行 2 列の行列で構成されるコンマ区切りのペアとして指定します。各行はアンカー ボックスの [height width] を定義します。

既定の 'auto' 設定では、グラウンド トゥルース データの各クラスに対する境界ボックスから最小サイズと縦横比の中央値を使用します。冗長なボックス サイズを削除するために、関数は 0.5 以下の Intersection over Union をもつボックスを保持します。この動作により、最小数のアンカー ボックスを使用してすべてのオブジェクト サイズと縦横比がカバーされるようになります。

アンカー ボックスが MinBoxSizes に基づいて計算される場合、i 番目のアンカー ボックスのサイズは以下です。

round(MinBoxSizes(i,:) .* BoxPyramidScale ,^ (0:NumBoxPyramidLevels-1)')
ネットワークを LayerGraph オブジェクトに設定している場合または検出器のチェックポイントから学習を再開する場合は、このプロパティを使用することはできません。

アンカー ボックス サイズを連続的にスケール アップするアンカー ボックス ピラミッドのスケールの倍率。'BoxPyramidScale' とスカラーで構成されるコンマ区切りのペアとして指定します。推奨値は 1 ~ 2 です。

アンカー ボックス ピラミッドのレベル数。'NumBoxPyramidLevels' とスカラーで構成されるコンマ区切りのペアとして指定します。マルチスケール アンカー ボックスがグラウンド トゥルース データのオブジェクトのサイズと同等のサイズになるような値を選択します。

既定の設定である 'auto' では、グラウンド トゥルース データ内のオブジェクトのサイズに基づいたレベル数を選択します。オブジェクト サイズの範囲をカバーするようにレベル数は選択されます。

出力引数

すべて折りたたむ

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

学習に関する情報。4 要素を持つ構造体配列として返されます。各要素は Faster R-CNN を学習させる 1 つのステージと一致し、次のフィールドがあります。各フィールドは、学習の反復ごとに 1 つの要素を持つ数値ベクトルです。特定の反復で計算されていない値は、NaN で表されます。

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

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

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

  • BaseLearnRate — 各反復での学習率

ヒント

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

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

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

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

    ネットワークの名前特徴抽出層の名前ROI プーリング層の出力サイズメモ:
    AlexNet'relu5'[6 6]最後の最大プーリング層は、ROI 最大プーリング層で置換されます。
    VGG-16'relu5_3'[7 7]最後の最大プーリング層は、ROI 最大プーリング層で置換されます。
    VGG-19'relu5_4'[7 7]最後の最大プーリング層は、ROI 最大プーリング層で置換されます。
    ResNet-50'activation_40_relu'[14 14]ROI プーリング層が特徴抽出層の後に挿入されます。
    ResNet-101'res4b22_relu'[14 14]ROI プーリング層が特徴抽出層の後に挿入されます。
    GoogLeNet'inception_4d-output'[14 14]ROI プーリング層が特徴抽出層の後に挿入されます。
    Inception-v3'mixed7'[17 17]ROI プーリング層が特徴抽出層の後に挿入されます。
    Inception-ResNet-v2'block17_20_ac'[17 17]ROI プーリング層が特徴抽出層の後に挿入されます。
    SqueezeNet'fire5-concat'[14 14]最後の最大プーリング層を ROI 最大プーリング層で置換します。

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

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

アルゴリズム

関数 trainFasterRCNNObjectDetector は、代替の最適化[1]を使用して 4 つのステージで Faster R-CNN オブジェクト検出器を学習させます。

参照

[1] Ren, Shaoqing, Kaiming He, Ross Girshick, and Jian Sun. "Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks." Advances in Neural Information Processing Systems . Vol. 28, 2015.

[2] Girshick, Ross. "Fast r-cnn." Proceedings of the IEEE International Conference on Computer Vision. 2015

[3] Girshick, R., J. Donahue, T. Darrell, and J. Malik. "Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation." CVPR '14 Proceedings of the 2014 IEEE Conference on Computer Vision and Pattern Recognition. Pages 580-587. 2014

[4] Zitnick, C. Lawrence, and P. Dollar. "Edge boxes: Locating object proposals from edges." Computer Vision-ECCV. Springer International Publishing. Pages 391-4050. 2014.

拡張機能

R2017a で導入