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

fasterRCNNObjectDetector

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

説明

fasterRCNNObjectDetector オブジェクトは、Faster R-CNN (Regions with Convolutional Neural Networks) オブジェクト検出器を使用して、イメージからオブジェクトを検出します。イメージ内のオブジェクトを検出するには、学習済みの検出器を関数 detect に渡します。

関数 detect を使用する場合、Compute Capability 3.0 以上の CUDA® 対応 NVIDIA® GPU を使用することを強くお勧めします。この GPU は計算時間を大幅に短縮します。GPU を使用するには、Parallel Computing Toolbox™ が必要です。

作成

学習データを指定して関数 trainFasterRCNNObjectDetector を呼び出して、fasterRCNNObjectDetector オブジェクトを作成します (Deep Learning Toolbox™ が必要)。

detector = trainFasterRCNNObjectDetector(trainingData,...)

プロパティ

すべて展開する

このプロパティは読み取り専用です。

分類モデルの名前。文字ベクトルまたは string スカラーとして指定します。既定では、名前は関数 trainFasterRCNNObjectDetector で指定された trainingData テーブルの 2 列目の見出しに設定されます。この名前は fasterRCNNObjectDetector オブジェクトの作成後に変更できます。

このプロパティは読み取り専用です。

学習済みの Fast R-CNN オブジェクト検出ネットワーク。DAGNetwork オブジェクトとして指定します。このオブジェクトには、Faster R-CNN 検出器内で使用される畳み込みニューラル ネットワークを定義する層が格納されます。

このプロパティは読み取り専用です。

アンカー ボックスのサイズ。M 行 2 列の行列として指定します。ここで、各行の形式は [height width] です。この値は学習時に設定されます。

このプロパティは読み取り専用です。

Faster R-CNN 検出器が検出対象として学習済みのオブジェクト クラスの名前。cell 配列として指定します。このプロパティは関数 trainFasterRCNNObjectDetector の入力引数 trainingData によって設定されます。クラス名を trainingData テーブルの一部として指定します。

このプロパティは読み取り専用です。

Faster R-CNN ネットワークによってサポートされる最小オブジェクト サイズ。[height width] ベクトルとして指定します。最小サイズはネットワーク アーキテクチャによって異なります。

オブジェクト関数

detectDetect objects using Faster R-CNN object detector

すべて折りたたむ

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

概要

深層学習は、ロバストなオブジェクト検出器を学習させるためにイメージの特徴を自動的に学習する強力な機械学習手法です。深層学習を使用したオブジェクト検出の方法は、Faster R-CNN や You Only Look Once (YOLO) v2 など複数あります。この例では、関数 trainFasterRCNNObjectDetector を使用して、Faster R-CNN 車両検出器を学習させます。

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

メモ: この例には、Computer Vision Toolbox™ と Deep Learning Toolbox™ が必要です。Compute Capability 3.0 の CUDA 対応 NVIDIA™ GPU を使用して検出器を学習させるため、Parallel Computing Toolbox™ が推奨されます。

事前学習済みの検出器のダウンロード

この例では、学習の完了を待たなくても例を実行できるよう、事前学習済みの検出器を使用します。関数 trainFasterRCNNObjectDetector で検出器を学習させる場合は、変数 doTrainingAndEval を true に設定します。そうでない場合、事前学習済みの検出器をダウンロードします。

doTrainingAndEval = false;
if ~doTrainingAndEval && ~exist('fasterRCNNResNet50VehicleExample.mat','file')
    % Download pretrained detector.
    disp('Downloading pretrained detector (118 MB)...');
    pretrainedURL = 'https://www.mathworks.com/supportfiles/vision/data/fasterRCNNResNet50VehicleExample.mat';
    websave('fasterRCNNResNet50VehicleExample.mat',pretrainedURL);
end

データセットの読み込み

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

% Unzip vehicle dataset images.
unzip vehicleDatasetImages.zip

% Load vehicle dataset ground truth.
data = load('vehicleDatasetGroundTruth.mat');
vehicleDataset = data.vehicleDataset;

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

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

    'vehicleImages/image_00001.jpg'    [1×4 double]
    'vehicleImages/image_00002.jpg'    [1×4 double]
    'vehicleImages/image_00003.jpg'    [1×4 double]
    'vehicleImages/image_00004.jpg'    [1×4 double]

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

% Add the fullpath to the local vehicle data folder.
vehicleDataset.imageFilename = fullfile(pwd, 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% を学習用に選択します。残りを評価用に使用します。

% Set random seed to ensure example training reproducibility.
rng(0);

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

学習オプションの設定

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

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

車両データセットにはさまざまな異なるサイズのイメージが含まれるため、'MiniBatchSize' プロパティは 1 にセットします。これにより、バッチとしてまとめて処理されるのを防ぎます。学習イメージのサイズがすべて同じ場合、MiniBatchSize に 1 より大きい値を選択して学習時間を短縮します。

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

Faster R-CNN の学習

Faster R-CNN オブジェクト検出ネットワークは、特徴抽出ネットワークと、その後に続く 2 つのサブネットワークによって構成されます。通常、特徴抽出ネットワークは、ResNet-50 や Inception v3 などの事前学習済みの CNN です。特徴抽出ネットワークの後に続く 1 つ目のサブネットワークは、オブジェクト提案 (オブジェクトか背景か) を生成するよう学習された領域提案ネットワーク (RPN) です。2 つ目のサブネットワークは、各提案の実際のクラス (車両か人か) を予測するように学習されています。

この例は、特徴抽出に事前学習済みの ResNet-50 を使用しています。用途の要件によって、MobileNet v2 や ResNet-18 など、その他の事前学習済みのネットワークも使用できます。関数 trainFasterRCNNObjectDetector は、オブジェクト検出に必要なサブネットワークを自動的に追加します。Faster R-CNN オブジェクト検出ネットワークの作成を行うこともできます。

doTrainingAndEval が true の場合、Faster R-CNN オブジェクト検出器を学習させます。そうでない場合は、事前学習済みのネットワークを読み込むことができます。

if doTrainingAndEval
    
    % Train Faster R-CNN detector.
    %  * Use 'resnet50' as the feature extraction network. 
    %  * Adjust the NegativeOverlapRange and PositiveOverlapRange to ensure
    %    training samples tightly overlap with ground truth.
    [detector, info] = trainFasterRCNNObjectDetector(trainingData, 'resnet50', options, ...
        'NegativeOverlapRange', [0 0.3], ...
        'PositiveOverlapRange', [0.6 1]);
else
    % Load pretrained detector for the example.
    pretrained = load('fasterRCNNResNet50VehicleExample.mat');
    detector = pretrained.detector;
end

% Note: This example verified on an Nvidia(TM) Titan X with 12 GB of GPU
% memory. Training this network took approximately 10 minutes using this setup.
% Training time varies depending on the hardware you use.

迅速な正常性チェックとして、1 つのテスト イメージ上で検出器を実行します。

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

検出器の評価では、まず、検出器をテスト セットに対して実行して検出結果を収集します。

if doTrainingAndEval
    % Create a table to hold the bounding boxes, scores, and labels output by
    % the detector.
    numImages = height(testData);
    results = table('Size',[numImages 3],...
        'VariableTypes',{'cell','cell','cell'},...
        'VariableNames',{'Boxes','Scores','Labels'});
    
    % Run detector on each image in the test set and collect results.
    for i = 1:numImages
        
        % Read the image.
        I = imread(testData.imageFilename{i});
        
        % Run the detector.
        [bboxes, scores, labels] = detect(detector, I);
        
        % Collect the results.
        % Collect the results.
        results.Boxes{i} = bboxes;
        results.Scores{i} = scores;
        results.Labels{i} = labels;
    end
else
    % Load pretrained detector for the example.
    pretrained = load('fasterRCNNResNet50VehicleExample.mat');
    results = pretrained.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))

まとめ

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

参照

[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.

R2017a で導入