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

Faster R-CNN 深層学習を使用したオブジェクトの検出

この例では、Faster R-CNN (Regions with Convolutional Neural Networks) という深層学習手法を使用して、オブジェクト検出器を学習させる方法を説明します。

概要

この例では、Faster R-CNN オブジェクト検出器に車両の検出を学習させる方法を説明します。Faster R-CNN [1] は、R-CNN [2] と Fast R-CNN [3] の各オブジェクト検出手法を拡張したものです。これら 3 つすべての手法で畳み込みニューラル ネットワーク (CNN) が使用されます。これらの違いは、処理する領域の選択方法とこれらの領域の分類方法です。R-CNN と Fast R-CNN では、CNN を実行する前の前処理手順として領域提案アルゴリズムが使用されます。一般に、提案アルゴリズムは EdgeBoxes [4] や Selective Search [5] などの CNN とは無関係の手法です。Fast R-CNN の場合、このような手法の使用は CNN の実行に比べて処理のボトルネックになります。Faster R-CNN では、CNN を使用する領域提案メカニズムを実装して、領域提案を CNN の学習と予測の手順の一環にすることで、この問題に対処しています。

この例では、Computer Vision System Toolbox™ の関数 trainFasterRCNNObjectDetector を使用して車両検出器を学習させます。この例には次のセクションがあります。

  • データセットを読み込みます。

  • 畳み込みニューラル ネットワーク (CNN) を設計します。

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

  • Faster R-CNN オブジェクト検出器を学習させます。

  • 学習済みの検出器を評価します。

メモ: この例には、Computer Vision System Toolbox™、Image Processing Toolbox™ および Deep Learning Toolbox™ が必要です。

この例を実行するには、Compute Capability 3.0 以上の CUDA 対応 NVIDIA™ GPU を使用してください。GPU を使用するには Parallel Computing Toolbox™ が必要です。

データセットの読み込み

この例では、295 枚のイメージを含んだ小さな車両データセットを使用します。各イメージには、1 または 2 個のラベル付けされた車両インスタンスが含まれています。小さなデータセットは Faster R-CNN の学習手順を調べるうえで役立ちますが、実際にロバストな検出器を学習させるにはより多くのラベル付けされたイメージが必要になります。

% Load vehicle data set
data = load('fasterRCNNVehicleTrainingData.mat');
vehicleDataset = data.vehicleTrainingData;

学習データはテーブルに保存されています。1 列目にはイメージ ファイルのパスが含まれています。残りの列には車両の ROI ラベルが含まれています。

% Display first few rows of the data set.
vehicleDataset(1:4,:)
ans=4×2 table
          imageFilename             vehicle   
    __________________________    ____________

    'vehicles/image_00001.jpg'    [1x4 double]
    'vehicles/image_00002.jpg'    [1x4 double]
    'vehicles/image_00003.jpg'    [1x4 double]
    'vehicles/image_00004.jpg'    [1x4 double]

データセットに含まれているイメージのタイプを把握するために、データセットのイメージの 1 つを表示します。

% Add fullpath to the local vehicle data folder.
dataDir = fullfile(toolboxdir('vision'),'visiondata');
vehicleDataset.imageFilename = fullfile(dataDir, vehicleDataset.imageFilename);

% Read one of the images.
I = imread(vehicleDataset.imageFilename{10});

% Insert the ROI labels.
I = insertShape(I, 'Rectangle', vehicleDataset.vehicle{10});

% Resize and display image.
I = imresize(I,3);
figure
imshow(I)

データセットを、検出器を学習させるための学習セットと検出器を評価するためのテスト セットに分割します。データの 60% を学習用に選択します。残りを評価用に使用します。

% Split data into a training and test set.
idx = floor(0.6 * height(vehicleDataset));
trainingData = vehicleDataset(1:idx,:);
testData = vehicleDataset(idx:end,:);

畳み込みニューラル ネットワーク (CNN) の作成

CNN は Faster R-CNN オブジェクト検出器の基本です。Deep Learning Toolbox™ 機能を使用して、CNN を層単位で作成します。

入力層のタイプとサイズを定義する imageInputLayer から始めます。分類タスクの場合、入力サイズは一般に学習イメージのサイズです。検出タスクの場合、CNN ではイメージの小さなセクションを解析する必要があるため、入力サイズはデータセット内の最小オブジェクトのサイズと同様でなければなりません。このデータセットでは、すべてのオブジェクトが [16 16] より大きいため、入力サイズ [32 32] を選択します。この入力サイズは、処理時間と CNN で解決する必要がある空間の詳細の量とでバランスをとったサイズです。

% Create image input layer.
inputLayer = imageInputLayer([32 32 3]);

次に、ネットワークの中間層を定義します。中間層は、convolution2dLayerreluLayer (正規化線形ユニット) および maxPooling2dLayer 層のブロックの繰り返しで構成されています。これらの層が、畳み込みニューラル ネットワークの中核となる基本ブロックを形成します。

% Define the convolutional layer parameters.
filterSize = [3 3];
numFilters = 32;

% Create the middle layers.
middleLayers = [
                
    convolution2dLayer(filterSize, numFilters, 'Padding', 1)   
    reluLayer()
    convolution2dLayer(filterSize, numFilters, 'Padding', 1)  
    reluLayer() 
    maxPooling2dLayer(3, 'Stride',2)    
    
    ];

これらの基本層を繰り返すことで、より深いネットワークを作成できます。ただし、データが途中でダウンサンプリングされることを防ぐために、プーリング層の数を減らしてください。ネットワークでダウンサンプリングが早く行われると、学習に役立つイメージ情報が破棄されます。

CNN の最終層は、通常、fullyConnectedLayersoftmaxLayer で構成されます。

finalLayers = [
    
    % Add a fully connected layer with 64 output neurons. The output size
    % of this layer will be an array with a length of 64.
    fullyConnectedLayer(64)

    % Add a ReLU non-linearity.
    reluLayer()

    % Add the last fully connected layer. At this point, the network must
    % produce outputs that can be used to measure whether the input image
    % belongs to one of the object classes or background. This measurement
    % is made using the subsequent loss layers.
    fullyConnectedLayer(width(vehicleDataset))

    % Add the softmax loss layer and classification layer. 
    softmaxLayer()
    classificationLayer()
];

入力層、中間層、最終層を組み合わせます。

layers = [
    inputLayer
    middleLayers
    finalLayers
    ]
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

学習オプションの設定

trainFasterRCNNObjectDetector は 4 つのステップで検出器を学習させます。最初の 2 つのステップでは、Faster R-CNN で使用される領域提案と検出のネットワークを学習させます。最後の 2 つのステップでは、最初の 2 つのステップのネットワークを組み合わせて検出用の単一ネットワークが作成されるようにします [1]。学習ステップごとに収束率が異なる場合があるため、ステップごとに独立した学習オプションを指定すると効果的です。ネットワーク学習オプションを指定するには、trainingOptions を使用します。

% Options for step 1.
optionsStage1 = trainingOptions('sgdm', ...
    'MaxEpochs', 10, ...
    'MiniBatchSize', 1, ...
    'InitialLearnRate', 1e-3, ...
    'CheckpointPath', tempdir);

% Options for step 2.
optionsStage2 = trainingOptions('sgdm', ...
    'MaxEpochs', 10, ...
    'MiniBatchSize', 1, ...
    'InitialLearnRate', 1e-3, ...
    'CheckpointPath', tempdir);

% Options for step 3.
optionsStage3 = trainingOptions('sgdm', ...
    'MaxEpochs', 10, ...
    'MiniBatchSize', 1, ...
    'InitialLearnRate', 1e-3, ...
    'CheckpointPath', tempdir);

% Options for step 4.
optionsStage4 = trainingOptions('sgdm', ...
    'MaxEpochs', 10, ...
    'MiniBatchSize', 1, ...
    'InitialLearnRate', 1e-3, ...
    'CheckpointPath', tempdir);

options = [
    optionsStage1
    optionsStage2
    optionsStage3
    optionsStage4
    ];

ここで、最初の 2 つのステップの学習率は最後の 2 つのステップよりも高く設定されています。最後の 2 つのステップは微調整のステップであるため、ネットワークの重みは最初の 2 つのステップよりも時間をかけて変更できます。Faster R-CNN 学習の場合、ミニバッチのサイズは 1 でなければなりません。これで、反復ごとに 1 つの学習イメージから複数のイメージ領域を処理します。

また、'CheckpointPath' はすべての学習オプションで一時的な場所に設定されています。この名前と値のペアを設定すると、学習プロセス中に部分的に学習させた検出器を保存できます。停電やシステム障害などで学習が中断された場合に、保存したチェックポイントから学習を再開できます。

Faster R-CNN の学習

CNN と学習オプションが定義されたので、trainFasterRCNNObjectDetector を使用して検出器を学習させることができます。

学習中、学習イメージから複数のイメージ領域が処理されます。イメージごとのイメージ領域の数は 'NumRegionsToSample' で制御されます。'PositiveOverlapRange' および 'NegativeOverlapRange' の名前と値のペアによって、学習に使用されるイメージ領域が制御されます。学習のポジティブ サンプルは、境界ボックスの Intersection over Union メトリクスで測定した場合に、グラウンド トゥルース ボックスとのオーバーラップが 0.6 ~ 1.0 のサンプルです。学習のネガティブ サンプルは、オーバーラップが 0 ~ 0.3 のサンプルです。これらのパラメーターの最適な値は、学習済みの検出器を検証セットでテストすることによって選択します。

Faster R-CNN の学習の場合、学習時間を短縮するために MATLAB ワーカーの並列プールを使用してくださいtrainFasterRCNNObjectDetector は、並列設定に基づいて並列プールを自動的に作成して使用します。学習の前に並列プールの使用が有効になっていることを確認します。

学習には、Compute Capability 3.0 以上の CUDA 対応 NVIDIA™ GPU を使用してください。

この例の実行時間を節約するために、事前学習済みのネットワークをディスクから読み込みます。ネットワークを自分で学習させるには、以下の変数 doTrainingAndEval を true に設定します。

% A trained network is loaded from disk to save time when running the
% example. Set this flag to true to train the network. 
doTrainingAndEval = false;

if doTrainingAndEval
    % Set random seed to ensure example training reproducibility.
    rng(0);
    
    % Train Faster R-CNN detector. Select a BoxPyramidScale of 1.2 to allow
    % for finer resolution for multiscale object detection.
    detector = trainFasterRCNNObjectDetector(trainingData, layers, options, ...
        'NegativeOverlapRange', [0 0.3], ...
        'PositiveOverlapRange', [0.6 1], ...
        'NumRegionsToSample', [256 128 256 128], ...
        'BoxPyramidScale', 1.2);
else
    % Load pretrained detector for the example.
    detector = data.detector;
end

学習をすばやく検証するには、検出器をテスト イメージに対して実行します。

% Read a test image.
I = imread(testData.imageFilename{1});

% Run the detector.
[bboxes,scores] = detect(detector,I);

% Annotate detections in the image.
I = insertObjectAnnotation(I,'rectangle',bboxes,scores);
figure
imshow(I)

単一のイメージのテストでは有望な結果が示されましたが、すべてのテスト イメージで検出結果が生成されるとは限りません。テスト セット全体に対して検出器を評価するには、次の節で説明されている評価手順に従います。

テスト セットを使用した検出器の評価

Computer Vision System Toolbox™ には、平均適合率 (evaluateDetectionPrecision) や対数平均ミス率 (evaluateDetectionMissRate) などの一般的なメトリクスを測定するオブジェクト検出器の評価関数が用意されています。ここでは、平均適合率メトリクスを使用します。平均適合率は、検出器が正しい分類を実行できること (適合率) と検出器がすべての関連オブジェクトを検出できること (再現率) を示す単一の数値です。

検出器の評価では、まず、検出器をテスト セットに対して実行して検出結果を収集します。評価に長い時間がかかるのを避けるために、結果をディスクから読み込みます。前節の doTrainingAndEval フラグを true に設定して評価をローカルで実行します。

if doTrainingAndEval
    % Run detector on each image in the test set and collect results.
    resultsStruct = struct([]);
    for i = 1:height(testData)
        
        % Read the image.
        I = imread(testData.imageFilename{i});
        
        % Run the detector.
        [bboxes, scores, labels] = detect(detector, I);
        
        % Collect the results.
        resultsStruct(i).Boxes = bboxes;
        resultsStruct(i).Scores = scores;
        resultsStruct(i).Labels = labels;
    end
    
    % Convert the results into a table.
    results = struct2table(resultsStruct);
else
    % Load results from disk.
    results = data.results;
end

% Extract expected bounding box locations from test data.
expectedResults = testData(:, 2:end);

% Evaluate the object detector using Average Precision metric.
[ap, recall, precision] = evaluateDetectionPrecision(results, expectedResults);

適合率/再現率 (PR) の曲線は、さまざまなレベルの再現率における検出器の適合率を示しています。すべてのレベルの再現率で適合率が 1 になるのが理想的です。ネットワークで追加の層を使用すると平均適合率を向上できますが、必要な学習データが増えたり学習時間が長くなったりする場合があります。

% Plot precision/recall curve
figure
plot(recall,precision)
xlabel('Recall')
ylabel('Precision')
grid on
title(sprintf('Average Precision = %.2f', ap))

まとめ

この例では、深層学習を使用して車両検出器を学習させる方法を説明しました。交通標識や歩行者などのオブジェクトの検出器の学習を行う際にも、同様の手順に従ってください。

参照

[1] Ren, S., K. He, R. Gershick, and J. Sun. "Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks." IEEE Transactions of Pattern Analysis and Machine Intelligence. Vol. 39, Issue 6, June 2017, pp. 1137-1149.

[2] Girshick, R., J. Donahue, T. Darrell, and J. Malik. "Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation." Proceedings of the 2014 IEEE Conference on Computer Vision and Pattern Recognition. Columbus, OH, June 2014, pp. 580-587.

[3] Girshick, R. "Fast R-CNN." Proceedings of the 2015 IEEE International Conference on Computer Vision. Santiago, Chile, Dec. 2015, pp. 1440-1448.

[4] Zitnick, C. L., and P. Dollar. "Edge Boxes: Locating Object Proposals from Edges." European Conference on Computer Vision. Zurich, Switzerland, Sept. 2014, pp. 391-405.

[5] Uijlings, J. R. R., K. E. A. van de Sande, T. Gevers, and A. W. M. Smeulders. "Selective Search for Object Recognition." International Journal of Computer Vision. Vol. 104, Number 2, Sept. 2013, pp. 154-171.

参考

| | | | | | | | | | |

関連するトピック