ドキュメンテーション

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

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

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

概要

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

深層学習を使用したオブジェクトの検出 (Computer Vision Toolbox)

メモ: この例には、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 オブジェクト検出ネットワークの作成 (Computer Vision Toolbox)を行うこともできます。

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.

参考

| | | | | | | | | | |

関連するトピック