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

trainFastRCNNObjectDetector

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

構文

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

説明

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);

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

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

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

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

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

* stopSign

--> Extracting region proposals from 27 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.0366 |       99.22% |         1.14 |          0.0010 |
|       3 |          50 |       00:00:10 |       0.0171 |      100.00% |         1.09 |          0.0010 |
|       5 |         100 |       00:00:21 |       0.0020 |      100.00% |         0.28 |          0.0010 |
|       8 |         150 |       00:00:32 |       0.0205 |      100.00% |         0.78 |          0.0010 |
|      10 |         200 |       00:00:42 |       0.0098 |      100.00% |         0.36 |          0.0010 |
|      10 |         210 |       00:00:44 |       0.0216 |      100.00% |         0.89 |          0.0010 |
|=======================================================================================================|

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

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

img = imread('stopSignTest.jpg');

検出器を実行します。

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

検出結果を表示します。

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

入力引数

すべて折りたたむ

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

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

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

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

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

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

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

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

    ヒント

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

メモ

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

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

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

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

メモ

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

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

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

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

保存した検出器のチェックポイント。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 の値で定義されます。

カスタムの提案関数を指定しない場合、関数は 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 ピクセルです。

出力引数

すべて折りたたむ

学習済み 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 つ以上を試してください。

  • この関数は、転移学習をサポートします。ネットワークを '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 最大プーリング層で置換されます。
    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 最大プーリング層で置換します。

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