主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

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

この例では,シングルショット検出器(SSD)に学習させる方法を説明します。

概要

深層学習は,検出タスクに必要なイメージの特徴を自動的に学習する強力な機械学習手法です。深層学習を使用したオブジェクト検出には,R-CNN更快,你只看一次(YOLO v2意思),SSDなど,いくつかの方法があります。この例では,関数trainSSDObjectDetectorを使用してSSD車両検出器に学習させます。詳細については,オブジェクトの検出(计算机视觉工具箱)を参照してください。

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

学習の完了を待たなくて済むように,事前学習済みの検出器をダウンロードします。検出器に学習させる場合は,変数doTrainingを真正に設定します。

doTraining = false;如果~ doTraining & & ~存在(“ssdResNet50VehicleExample_20a.mat”“文件”) disp (“下载预训练探测器(44mb)……”);pretrainedURL =“//www.tatmou.com/金宝appsupportfiles/vision/data/ssdResNet50VehicleExample_20a.mat”;websave (“ssdResNet50VehicleExample_20a.mat”, pretrainedURL);结束
下载预训练检测器(44mb)…

データセットの読み込み

この例では,295枚のイメージを含んだ小さな车両データセットを使用します。これらのイメージの多くは,加州理工学院の汽车1999年データセットおよび汽车2001年データセットからのものです(加州理工学院计算机视觉のWebサイトで入手可能)。Pietro Perona一起氏によって作成されたもので,許可を得て使用しています。各イメージには1または2個のラベル付けされた車両インスタンスが含まれています。小さなデータセットはSSDの学習手順を調べるうえで役立ちますが,実際にロバストな検出器に学習させるにはラベル付けされたイメージがより多く必要になります。

解压缩vehicleDatasetImages.zipdata =负载(“vehicleDatasetGroundTruth.mat”);vehicleDataset = data.vehicleDataset;

学习データはテーブルに保存されています。最初の列には,イメージファイルへのパスが含まれています。残りの列には,车両のROIラベルが含まれています。データの最初の数行を表示します。

vehicleDataset (1:4,:)
ans =4×2表imageFilename车辆  _________________________________ _________________ {' vehicleImages / image_00001.jpg '} {[220 136 35 28]} {' vehicleImages / image_00002.jpg '} {[45 175 126 61]} {' vehicleImages / image_00003.jpg '} {[45 108 120 33]} {' vehicleImages / image_00004.jpg '} {[124 112 38 36]}

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

RNG(0);shuffledIndices = randperm(高度(vehicleDataset));IDX =地板(0.6 *长度(shuffledIndices));trainingData = vehicleDataset(shuffledIndices(1:IDX),:);TESTDATA = vehicleDataset(shuffledIndices(IDX + 1:结束),:);

imageDatastoreおよびboxLabelDatastoreを使用して,学習および評価中にイメージとラベルデータを読み込みます。

imdsTrain = imageDatastore (trainingData {:,“imageFilename”});bldsTrain = boxLabelDatastore (trainingData (:,“汽车”));imdsTest = imageDatastore (testData {:,“imageFilename”});bldsTest = boxLabelDatastore (testData (:,“汽车”));

イメージデータストアとボックスラベルデータストアを組み合わせます。

trainingData =结合(imdsTrain bldsTrain);testData = combine(imdsTest, bldsTest);

学習イメージとボックスラベルのうちの1つを表示します。

data =阅读(trainingData);我={1}数据;bbox ={2}数据;annotatedImage = insertShape(我“矩形”, bbox);annotatedImage = imresize (annotatedImage 2);图imshow (annotatedImage)

SSDオブジェクト検出ネットワークの作成

SSDオブジェクト検出ネットワークは,2つのサブネットワークをもつと考えることができます。特徴抽出ネットワークに検出ネットワークが続きます。

通常,特徴抽出ネットワークは事前学習済みのCNNです(詳細については事前学習済みの深層ニューラルネットワークを参照)。この例では特徴抽出にResNet-50を使用します。用途の要件によって,MobileNet v2やResNet-18など,その他の事前学習済みのネットワークも使用できます。検出サブネットワークは特徴抽出ネットワークと比べて小さいCNNであり,少数の畳み込み層とSSDに固有の層で構成されます。

関数ssdLayersを使用して,事前学習済みのResNet-50ネットワークをSSDオブジェクト検出ネットワークに自動的に変更します。ssdLayersでは,SSDネットワークをパラメーター化するためのいくつかの入力(ネットワーク入力サイズやクラス数など)を指定する必要があります。ネットワーク入力サイズを選択する際には,学習イメージのサイズ,および選択したサイズでのデータの処理によって発生する計算コストを考慮します。可能な場合,学習イメージのサイズに近いネットワーク入力サイズを選択します。ただし,この例を実行する計算コストを削減するため,ネットワーク入力サイズを[300 300 3]に指定します。学習中、trainSSDObjectDetectorによって,ネットワーク入力サイズに合わせて学習イメージのサイズが自動的に変更されます。

inputSize = [300 300 3];

検出するオブジェクトクラスの数を定義します。

numClasses =宽度(vehicleDataset) 1;

SSDオブジェクト検出ネットワークを作成します。

lgraph = ssdLayers(inputSize, numClasses,“resnet50”);

深度学习工具箱™からanalyzeNetworkまたはDeepNetworkDesignerを使用してネットワークを可視化できます。カスタムSSDネットワークを層単位で作成することもできます。詳細については,SSDオブジェクト検出ネットワークの作成(计算机视觉工具箱)を参照してください。

データ拡張

データ拡張は,学習中に元のデータをランダムに変換してネットワークの精度を高めるために使用されます。データ拡張を使用すると、ラベル付き学習サンプルの数を実際に増やさずに、学習データをさらに多様化させることができます。变换を使用して,以下のように学習データを拡張します。

  • イメージおよび関連するボックスラベルを水平方向にランダムに反転。

  • イメージおよび関連するボックスラベルをランダムにスケーリング。

  • イメージの色にジッターを付加。

データ拡張はテストデータには適用されないことに注意してください。理想的には,テストデータは元のデータを代表するもので,バイアスのない評価を行うために変更なしで使用されなければなりません。

augmentedTrainingData =变换(trainingData @augmentData);

同じイメージを繰り返し読み取り,拡張された学習データを可視化します。

augmentedData =细胞(4,1);k = 1:4 data = read(augmentedTrainingData);augmentedData {k} = insertShape(数据{1},“矩形”、数据{2});重置(augmentedTrainingData);结束图蒙太奇(augmentedData,“BorderSize”, 10)

学習データの前処理

拡張された学習データを前処理して学習用に準備します。

preprocessedTrainingData =变换(augmentedTrainingData @(数据)preprocessData(数据、inputSize));

前処理された学習データを読み取ります。

data =阅读(preprocessedTrainingData);

イメージと境界ボックスを表示します。

我={1}数据;bbox ={2}数据;annotatedImage = insertShape(我“矩形”, bbox);annotatedImage = imresize (annotatedImage 2);图imshow (annotatedImage)

SSDオブジェクト検出器の学習

trainingOptionsを使用してネットワーク学習オプションを指定します。“CheckpointPath”を一時的な場所に設定します。これにより,学習プロセス中に部分的に学習させた検出器を保存できます。停電やシステム障害などで学習が中断された場合に,保存したチェックポイントから学習を再開できます。

选择= trainingOptions (“个”...“MiniBatchSize”, 16岁,...“InitialLearnRate”1 e 1,...“LearnRateSchedule”“分段”...“LearnRateDropPeriod”30岁的...“LearnRateDropFactor”, 0.8,...“MaxEpochs”, 300,...“VerboseFrequency”, 50岁,...“CheckpointPath”tempdir,...“洗牌”“every-epoch”);

doTrainingが真正の場合,関数trainSSDObjectDetector(计算机视觉工具箱)を使用して,SSDオブジェクト検出器に学習させます。そうでない場合は,事前学習済みのネットワークを読み込みます。

如果doTraining%培训SSD检测器。[detector, info] = trainSSDObjectDetector(preprocessedTrainingData,lgraph,options); / /设置检测器其他的%负载预训练检测器为例。pretrained =负载(“ssdResNet50VehicleExample_20a.mat”);探测器= pretrained.detector;结束

この例は12 GBメモリ搭載のNVIDIA™泰坦X GPUで検証済みです。GPUのメモリがこれより少ない場合,メモリ不足が発生する可能性があります。これが発生した場合は,関数trainingOptionsを使用して”MiniBatchSize“を減らします。この設定を使用してこのネットワークに学習させるのに約2時間かかりました。学習所要時間は使用するハードウェアによって異なります。

迅速なテストとして,1つのテストイメージ上で検出器を実行します。

data =阅读(testData);我={1 1}数据;我= imresize(我inputSize (1:2));[bboxes,分数]=检测(探测器,我,“阈值”, 0.4);

结果を表示します。

我= insertObjectAnnotation (,“矩形”bboxes,分数);图imshow(我)

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

大規模なイメージセットで学習済みのオブジェクト検出器を評価し,パフォーマンスを測定します。计算机视觉工具箱™には,平均適合率(evaluateDetectionPrecision)や対数平均ミス率(evaluateDetectionMissRate)などの一般的なメトリクスを測定するオブジェクト検出器の評価関数が用意されています。この例では,平均適合率メトリクスを使用してパフォーマンスを評価します。平均適合率は,検出器が正しい分類を実行できること(精度)と検出器がすべての関連オブジェクトを検出できること(回忆)を示す単一の数値です。

学習データと同じ前処理変換をテストデータに適用します。データ拡張はテスト データには適用されないことに注意してください。テスト データは元のデータを代表するもので、バイアスのない評価を行うために変更なしで使用されなければなりません。

preprocessedTestData =变换(testData @(数据)preprocessData(数据、inputSize));

すべてのテストイメージに対して検出器を実行します。

detectionResults = detect(检测器,preprocestestdata,“阈值”, 0.4);

平均適合率メトリクスを使用してオブジェクト検出器を評価します。

[ap,recall,precision] = evaluateDetectionPrecision(detectionResults, preprocesedtestdata);

適合率/再現率(PR)の曲線は,さまざまなレベルの再現率における検出器の適合率を示しています。すべてのレベルの再現率で適合率が1になるのが理想的です。より多くのデータを使用すると平均適合率を向上できますが,学習に必要な時間が長くなる場合があります。公关曲線をプロットします。

图绘制(召回、精密)包含(“回忆”) ylabel (“精度”网格)标题(sprintf ('平均精度= %.2f'据美联社)),

コード生成

検出器に学習させて評価したら,GPU编码器™を使用してssdObjectDetectorのコードを生成できます。详细については,シングルショットマルチボックス検出器を使用したオブジェクト検出のコードの生成(计算机视觉工具箱)の例を参照してください。

サポート関数

函数B = augmentData (A)%应用随机水平翻转和随机X/Y缩放。盒子,如果重叠大于0.25,则在边界外缩放的%被截断。同时,抖动图像颜色。B =细胞(大小(A));我= {1};深圳=大小(I);如果numel(sz)==3 && sz(3) ==3 I = jitterColorHSV(I,...'对比', 0.2,...“颜色”0,...“饱和”, 0.1,...“亮度”, 0.2);结束%随机翻转和缩放图像。tform = randomAffine2d (“XReflection”,真的,“规模”1.1 [1]);tform溃败= affineOutputView(深圳,“BoundsStyle”“CenterOutput”);B {1} = imwarp (tform,我“OutputView”,溃败);%消毒盒,如果需要的话。A{2} = helperSanitizeBoxes(A{2}, sz);对方框应用相同的转换。[B{2},指数]= bboxwarp ({2}, tform溃败,“OverlapThreshold”, 0.25);B{3} ={3}(指标);%仅当所有的框被扭曲时返回原始数据。如果isempty(indices) B = A;结束结束函数targetSize data = preprocessData(数据)%调整图像和包围框的大小为targetSize。Sz = size(data{1},[1 2]);规模= targetSize(1:2)。/深圳;{1} = imresize数据(数据{1},targetSize (1:2));%消毒盒,如果需要的话。数据{2}= helperSanitizeBoxes(数据{2},sz);%调整盒子。{2} = bboxresize数据(数据{2},规模);结束

参考文献

[1] Liu, Wei, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed, Cheng Yang Fu, Alexander C. Berg。“SSD:单次发射多盒探测器。”第十四届欧洲计算机视觉大会,ECCV 2016。施普林格1 - 2016。

参考

アプリ

関数

オブジェクト

関連するトピック