主要内容

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

この例では,深層学習とR-CNN与卷积神经网络(地区)を使用して,オブジェクト検出器に学習させる方法を説明します。

概要

この例では,一時停止標識を検出するためにR-CNNオブジェクト検出器に学習させる方法を説明します。R-CNNはオブジェクト検出フレームワークで,畳み込みニューラルネットワーク(CNN)を使用してイメージ内のイメージ領域を分類します[1]。R-CNNでは,スライディングウィンドウを使用して領域が1つずつ分類されるのではなく,オブジェクトが含まれる可能性が高い領域のみが処理されます。これによりCNNの実行時に発生する計算コストが大幅に減少します。

R-CNNの一時停止標識検出器に学習させる方法を説明するために,この例では,深層学習の用途でよく使用される転移学習のワークフローに沿っています。転移学習では,ImageNet[2]などの大規模なイメージコレクションで学習済みのネットワークが,新しい分類タスクや検出タスクを解決するための開始点として使用されます。この方法の利点は,事前学習済みネットワークが既にイメージの特徴を十分学習しており,これらの特徴をさまざまなイメージに適用できることです。この学習内容は,ネットワ,クを微調整することによって新しいタスクに転用できます。ネットワ,クの微調整は,重みを少し調整することによって行います。まり,元のタスクで学習済みの特徴表現を新しいタスクに合わせてわずかに調整します。

転移学習には,学習に必要なイメージの数が少なくて済み,学習時間が短縮されるというメリットがあります。これらのメリットについて説明するために,この例では転移学習のワークフローを使用して一時停止標識検出器に学習させます。50000年まず個の学習イメージが含まれるCIFAR-10データセットを使用して,CNNに事前学習させます。その後,学習イメージを41個だけ使用して,この事前学習済みのCNNを一時停止標識検出用に微調整します。事前学習済みのCNNを使用しない場合,より多くのイメージを使用して一時停止標識検出器に学習させる必要があります。

メモ:この例には,计算机视觉工具箱™,图像处理工具箱™,深度学习工具箱™および统计和机器学习工具箱™が必要です。

この例を実行するには,cuda対応nvidia™gpuの使用が強く推奨されます。GPUを使用するには并行计算工具箱™が必要です。サポトされる计算能力の詳細にいては,Gpu計算の要件(并行计算工具箱)を参照してください。

Cifar-10平台メ,ジデ,タのダウンロ,ド

Cifar-10デ,タセット[3]をダウンロ,ドします。このデータセットには,CNNに学習させるために使用する50000個の学習イメージが含まれています。

Cifar-10デ,タを一時ディレクトリにダウンロ,ドします。

cifar10Data = tempdir;url =“https://www.cs.toronto.edu/ ~ kriz / cifar-10-matlab.tar.gz”;helperCIFAR10Data.download (url, cifar10Data);

Cifar-10学習デ,タとテストデ,タを読み込みます。

[trainingImages,trainingLabels,testImages,testLabels] = helperCIFAR10Data.load(cifar10Data);

それぞれのメジは32x32 RGBメジで,50000個の学習サンプルがあります。

大小(trainingImages)
ans =1×432 32 3 50000

Cifar-10には10個のメジカテゴリがあります。メ,ジカテゴリを一覧表示します。

numimagecategcategories = 10;类别(trainingLabels)
ans =10×1细胞{‘飞机’}{‘汽车’}{‘鸟’}{‘猫’}{‘鹿’}{‘狗’}{‘青蛙’}{‘马’}{‘船’}{“卡车”}

次のコドを使用すると,いくかの学習メジを表示できます。

figure thumbnails = trainingImages(:,:,:,1:100);蒙太奇(缩略图)

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

CNNは一連の層で構成されています。各層では特定の計算が定義されます。深度学习工具箱™は,CNNを層単位で簡単に設計する機能を提供します。この例では,次の層を使用してCNNを作成します。

ここで定義するネットワ,クは,[4]で説明されているネットワ,クと同様に,imageInputLayerから始まります。入力層は,cnnが処理できるデタのタプとサズを定義します。この例では,CNNを使用してCIFAR-10イメージ(32 x32 RGBイメージ)を処理します。

为32x32x3 CIFAR-10图像创建图像输入层。[height,width,numChannels, ~] = size(trainingImages);imageSize =[高度宽度numChannels];inputLayer = imageInputLayer(imageSize)
inputLayer = ImageInputLayer with properties: Name: " InputSize:[32 32 3]超参数DataAugmentation: 'none'归一化:'zerocenter' NormalizationDimension: 'auto' Mean: []

次に,ネットワ,クの中間層を定義します。中間層は,畳み込み層,ReLU(正規化線形ユニット)およびプーリング層のブロックの繰り返しで構成されています。これら3の層が,畳み込みニュラルネットワクの中核となる基本ブロックを形成します。畳み込み層は,ネットワ,クの学習中に更新されるフィルタ,の一連の重みを定義します。ReLU層は,ネットワ,クに非線形性を追加します。これにより,ネットワークでイメージピクセルをイメージのセマンティクスコンテンツにマッピングする非線形関数を近似できます。プ,リング層は,ネットワ,クを流れるデ,タをダウンサンプリングします。多数の層があるネットワークでは,ネットワークでのデータのダウンサンプリングが早くなりすぎないように,プーリング層を慎重に使用してください。

%卷积层参数filterSize = [5 5];numFilters = 32;中间层= [第一个卷积层有32个5x5x3滤波器组。一个添加2像素的%对称填充以确保图像边界%包含在处理中。这是必须避免的%边境的信息被过早地冲走了%网络。convolution2dLayer (filterSize numFilters,“填充”, 2)注意,第三维度的过滤器可以省略,因为它%根据网络的连通性自动推导。在%这种情况是因为这一层紧随图像层,第三层%维度必须为3,以匹配输入中的通道数量%的形象。接下来添加ReLU层:reluLayer ()跟随它的最大池化层,具有3x3空间池化区域%和2像素的步幅。这将对数据维进行抽样% 32x32到15x15。maxPooling2dLayer (3“步”, 2)重复3个核心层,完成网络的中间部分。convolution2dLayer (filterSize numFilters,“填充”,2) reluLayer() maxPooling2dLayer(3,“步”,2)卷积2dlayer (filterSize,2 * numFilters,“填充”,2) reluLayer() maxPooling2dLayer(3,“步”2)]
midelayers = 9x1带有图层的图层数组:1”卷积32 5 x5旋转步[1]和填充2 2 2 2 2”ReLU ReLU 3”麦克斯池3 x3马克斯池步(2 - 2)和填充(0 0 0 0)4”卷积32 5 x5旋转步[1]和填充(2 2 2 2)5”ReLU ReLU 6”马克斯池3 x3马克斯池步(2 - 2)和填充[0 0 0 0]7“卷积64 5 x5旋转步[1]和填充2 2 2 2 8”ReLU ReLU 9”麦克斯池3 x3马克斯池步(2 - 2)和填充[0 0 0 0]

これら3の基本層を繰り返すことで,。ただし,プ,リング層の数を減らして,デ,タが途中でダウンサンプリングされることを防いでください。ネットワクでダウンサンプリングが早く行われると,学習に役立。

CNNの最終層は,通常,全結合層とソフトマックス損失層で構成されます。

finalLayers = [添加一个64个输出神经元的全连接层。的输出大小该层将是一个长度为64的数组。fullyConnectedLayer (64)添加一个ReLU非线性。reluLayer添加最后一个全连接层。此时,网络必须%产生10个信号,可用于测量输入图像是否%属于这样或那样的类别。该测量是使用%后续损失层数。fullyConnectedLayer (numImageCategories)添加softmax损失层和分类层。最后的图层使用%的输出全连通层来计算分类图像类的%概率分布。培训期间%进程时,所有的网络权重都被调优以使损失最小化%分类分布。softmaxLayer分类层
finalLayers = 5x1分层阵列:1 "全连接64全连接Layer 2 " ReLU ReLU 3 "全连接10全连接Layer 4 " Softmax Softmax 5

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

layers = [inputLayer middleLayers finalLayers]
图层数组= 15x11”的形象输入32 x32x3图像zerocenter正常化2”卷积32 5 x5旋转步[1]和填充(2 2 2 2)3”ReLU ReLU 4”马克斯池3 x3马克斯池步(2 - 2)和填充[0 0 0 0]5“卷积32 5 x5的隆起与步幅[1]和填充(2 2 2 2)6”ReLU ReLU 7”麦克斯池3 x3马克斯池步(2 - 2)和填充[0 0 0 0]8”卷积64 5 x5旋转步[1]和填充(2 2 2 2)9”ReLU ReLU 10”马克斯Pooling 3x3 max Pooling with stride[2 2]和padding[0 0 0 0 0] 11 "全连接64全连接层12 " ReLU ReLU 13 "全连接10全连接层14 " Softmax Softmax 15 " Classification Output crossentropyex

標準偏差0.0001の正規分布乱数を使用して,最初の畳み込み層の重みを初期化します。これにより,学習の収束性が向上します。

层(2)。权重= 0.0001 * randn([filterSize numChannels numFilters]);

Cifar-10デ,タを使用したCNNの学習

ネットワークアーキテクチャが定義されたので,CIFAR-10学習データを使用して学習させることができます。まず,関数trainingOptions(深度学习工具箱)を使用してネットワ,ク学習アルゴリズムを設定します。ネットワーク学習アルゴリズムは,初期学習率0.001をとしたモーメンタム項付き確率的勾配降下法(个)を使用します。学習中8エポックごとに初期学習率が減少します(1エポックは,学習データセット全体の処理1回と定義されます)。学習アルゴリズムは40エポック実行されます。

学習アルゴリズムではミニバッチサ▪▪ズの128個の▪▪メ▪▪ジが使用されることに注意してください。GPUのメモリ制約のため,学習にGPUを使用するときには,このサイズを小さくする必要がある場合があります。

设置网络培训选项opts = trainingOptions(“个”...“动量”, 0.9,...“InitialLearnRate”, 0.001,...“LearnRateSchedule”“分段”...“LearnRateDropFactor”, 0.1,...“LearnRateDropPeriod”8...“L2Regularization”, 0.004,...“MaxEpochs”现年40岁的...“MiniBatchSize”, 128,...“详细”,真正的);

関数trainNetwork(深度学习工具箱)を使用してネットワ,クに学習させます。これは計算能力を必要とするプロセスのため,完了するのに20 ~ 30分かかります。この例の実行時間を節約するために,事前学習済みのネットワ,クをディスクから読み込みます。ネットワ,クを自分で学習させる場合は,以下の変数doTrainingを真实に設定します。

学習には,cuda対応nvidia™gpuの使用が強く推奨されます。

从磁盘加载经过训练的网络,以节省运行%的例子。将此标志设置为true以训练网络。doTraining = false;如果doTraining训练一个网络。cifar10Net = trainNetwork(trainingImages, trainingLabels, layers, opts);其他的为示例加载预训练的检测器。负载(“rcnnStopSigns.mat”“cifar10Net”结束

Cifar-10ネットワ,クの学習の検証

ネットワ,クの学習が終わったら,検証を行って学習が成功していることを確認します。まず,最初の畳み込み層のフィルターの重みの簡易検証を行うことで,学習に明らかな問題があるかどうかを特定できます。

提取第一个卷积层权值w = cifar10Net.Layers(2).Weights;%将权重重新缩放到范围[0,1],以便更好地可视化W = rescale(W);图蒙太奇(w)

最初の層の重みには,明確な構造がなければなりません。重みがまだランダムな場合は,ネットワ,クに追加学習が必要であることを示しています。この例の場合,上記のように,最初の層のフィルターがCIFAR-10学習データからエッジのような特徴を学習しています。

学習の結果を完全に検証するには,CIFAR-10テストデータを使用してネットワークの分類精度を測定します。精度のスコアが低い場合,追加学習または追加の学習デ,タが必要であることを意味します。この例の目的は,テストセットで100%の精度を達成することではなく,オブジェクト検出器の学習に使用するのに十分なネットワークの学習を行うことです。

在测试集中运行网络。YTest = category (cifar10Net, testImages);计算准确率。accuracy = sum(YTest == testLabels)/numel(testLabels)
准确度= 0.7456

追加学習を行うと精度が向上しますが,R-CNNオブジェクト検出器の学習という目的には必要ありません。

学習デ,タの読み込み

ネットワークがCIFAR-10の分類タスクに対して適切に機能するようになったので,転移学習の手法を使用して,一時停止標識検出のためにネットワークを微調整できます。

最初に,一時停止標識のグラウンドトゥル,スデ,タを読み込みます。

加载真实数据数据=负载(“stopSignsAndCars.mat”“stopSignsAndCars”);stopSignsAndCars = data.stopSignsAndCars;%更新映像文件的路径以匹配本地文件系统Visiondata = fullfile(toolboxdir(“愿景”),“visiondata”);stopSignsAndCars。imageFilename = fullfile(visiondata, stopSignsAndCars.imageFilename);显示地面真实值数据摘要总结(stopSignsAndCars)
变量:imageFilename: 41×1 cell字符向量数组stopSign: 41×1 cell carRear: 41×1 cell carFront: 41×1 cell

学習データは,一時停止標識,車体前部および後部のイメージファイル名とROIラベルが含まれる表内に格納されています。各ROIラベルは,aaplメ,aaplジ内で関心のあるオブジェクトの周りの境界ボックスです。一時停止標識検出器の学習には,一時停止標識のROIラベルのみが必要です。車体前部および後部のROIラベルは削除しなければなりません。

只保留图像文件名和停止标志ROI标签stopSigns = stopSignsAndCars(:, {“imageFilename”“stopSign”});显示一张训练图像和地面真值包围框I = imread(stopSigns.imageFilename{1});I = insertObjectAnnotation(I,“矩形”, stopSigns.stopSign {1},“停车标志”“线宽”8);图imshow(我)

このデタセットには41個の学習メジしかないことに注意してください。41個のイメージだけを使用してR-CNNオブジェクト検出器の学習をゼロから行うのは実用的でなく,信頼性の高い一時停止標識検出器を生成することはできません。大きなデータセット(CIFAR-10に含まれる学習イメージは50000個)で事前学習済みのネットワークを微調整して一時停止標識検出器の学習を行うため,はるかに小さいデータセットを使用することが可能になります。

R-cnn一時停止標識検出器の学習

最後に,trainRCNNObjectDetectorを使用してr-cnnオブジェクト検出器に学習させます。この関数への入力はグラウンドトゥル,ス表です。この表には,ラベル付きの一時停止標識イメージ,事前学習済みのCIFAR-10ネットワーク,および学習オプションが含まれています。学習関数は,イメージが10個のカテゴリに分類されている元のCIFAR-10ネットワークを,自動的に1つのネットワークに変更します。変更後のネットワークでは,一時停止標識クラスと汎用背景クラスの2つのクラスにイメージを分類できます。

学習中,グラウンドトゥルースデータから抽出されたイメージパッチを使用して入力ネットワークの重みが微調整されます。“PositiveOverlapRange”および 'NegativeOverlapRange' パラメーターによって、学習に使用されるイメージ パッチが制御されます。学習のポジティブ サンプルは、境界ボックスの Intersection over Union メトリクスで測定した場合に、グラウンド トゥルース ボックスとのオーバーラップが 0.5 ~ 1.0 のサンプルです。学習のネガティブ サンプルは、オーバーラップが 0 ~ 0.3 のサンプルです。これらのパラメーターの最適な値は、学習済みの検出器を検証セットでテストすることによって選択します。

R-cnnの学習の場合,“学習時間を短縮するためにmatlabワカの並列プルの使用が強く推奨されます”trainRCNNObjectDetectorは,に基づいて並列プ,ルを自動的に作成して使用します。学習の前に並列プ,ルの使用が有効になっていることを確認します。

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

学習には,cuda対応nvidia™gpuの使用が強く推奨されます。

从磁盘加载经过训练的检测器,以节省运行%的例子。将此标志设置为true以训练检测器。doTraining = false;如果doTraining%设置培训选项选项= trainingOptions(“个”...“MiniBatchSize”, 128,...“InitialLearnRate”1 e - 3,...“LearnRateSchedule”“分段”...“LearnRateDropFactor”, 0.1,...“LearnRateDropPeriod”, 100,...“MaxEpochs”, 100,...“详细”,真正的);训练一个R-CNN对象检测器。这需要几分钟。rcnn = trainRCNNObjectDetector(stopSigns, cifar10Net, options,...“NegativeOverlapRange”, [0 0.3],“PositiveOverlapRange”(0.5 - 1))其他的为示例加载预训练的网络。负载(“rcnnStopSigns.mat”“rcnn”结束

R-cnn一時停止標識検出器のテスト

R-cnnオブジェクト検出器を使用して@ @メ@ @ジ内の一時停止標識を検出できるようになりました。テスト▪▪メ▪▪ジで試してみます。

读取测试图像testImage = imread(“stopSignTest.jpg”);%检测停止标志[bboxes,score,label] = detect(rcnn,testImage,“MiniBatchSize”, 128)
bboxes =1×4419 147 31 20
分数=0.9955
标签=明确的分类stopSign

R-cnnオブジェクトの检测メソッドは,オブジェクトの境界ボックス,検出スコアおよび各検出のクラスラベルを返します。ラベルは,一時停止標識,対向車優先標識,速度制限標識など,複数のオブジェクトを検出する場合に役立ちます。0 ~ 1で表されるスコアは検出の信頼度を示し,これを使用して低スコアの検出を無視することができます。

%显示检测结果[score, idx] = max(score);Bbox = bboxes(idx,:);注释= sprintf('%s:(可信度= %f)', label(idx), score);outputImage = insertObjectAnnotation(testImage,“矩形”, bbox,注释);图imshow (outputImage)

デバッグのヒント

R-cnn検出器内で使用されるネットワクは,テストメジ全体の処理にも使用できます。ネットワークの入力サイズより大きい,イメージ全体を直接処理することで,分類スコアの2次元ヒートマップを生成できます。これは,ネットワークを混乱させているイメージ内の項目を特定して学習を改善する手掛かりを与えてくれる,便利なデバッグツールになります。

训练的网络存储在R-CNN检测器中rcnn。网络
ans = SeriesNetwork with properties: Layers: [15×1 nnet.cnn.layer.Layer]

ネットワクの14番目の層であるソフトマックス層から激活(深度学习工具箱)を抽出します。これは、ネットワ、クが、メ、ジをスキャンするときに生成される分類スコアです。

featureMap =激活(rcnn。网络,testImage, 14);softmax激活存储在3-D数组中。大小(featureMap)
ans =1×343 78 2

featureMapの3番目の次元はオブジェクトクラスに対応します。

rcnn。一会
ans =2×1细胞{'stopSign'} {'Background'}

一時停止標識の特徴マップは,最初のチャネルに保存されています。

stopSignMap = featureMap(:,:, 1);

アクティベーションの出力のサイズは,ネットワークでのダウンサンプリング演算によって入力イメージより小さくなります。可視性を向上するには,stopSignMapのサ▪▪ズを入力▪▪メ▪ジのサ▪▪ズに変更します。これはアクティベーションをイメージピクセルにマッピングする非常に大まかな近似であり,図示のみを目的として使用します。

为可视化调整stopSignMap的大小[height, width, ~] = size(testImage);stopSignMap = imresize(stopSignMap, [height, width]);可视化叠加在测试图像上的特征图。。featureMapOnImage = imfuse(testImage, stopSignMap);图imshow (featureMapOnImage)

テストイメージ内の一時停止標識は,ネットワークアクティベーションの最大ピークにうまく対応しています。これにより,R-CNN検出器内で使用されていがるCNN実際に一時停止標識を特定できるようになったことを確認できます。他のピ,クがある場合,誤検知を防ぐため,学習に追加のネガティブデ,タが必要になることがあります。このような場合には,trainingOptionsで‘MaxEpochsの値を大きくして再学習を行います。

まとめ

この例では,CIFAR-10データで学習済みのネットワークを使用してR-CNN一時停止標識オブジェクト検出器に学習させる方法を説明しました。深層学習を使用して他のオブジェクト検出器の学習を行う際にも,同様の手順に従ってください。

参照

格什克,R.多纳休,T.达雷尔和J.马利克。“用于精确目标检测和语义分割的丰富特征层次。”2014年IEEE计算机视觉与模式识别会议论文集。俄亥俄州哥伦布市,2014年6月,第580-587页。

[2]邓俊,董伟文,索彻,李丽娟。李,k。李,l。飞飞。ImageNet:一个大规模的分层图像数据库。2009年IEEE计算机视觉与模式识别会议论文集。迈阿密,佛罗里达州,2009年6月,第248-255页。

[3]克里哲夫斯基,A.和G.辛顿。“从微小的图像中学习多层特征。”多伦多大学硕士论文。加拿大多伦多,2009年。

[4] https://code.google.com/p/cuda-convnet/

参考

|(深度学习工具箱)|(深度学习工具箱)||||||(深度学习工具箱)||(深度学习工具箱)

関連するトピック