使用更快的R-CNN深度学习对象检测

此示例示出了如何训练更快R-CNN(与卷积神经网络的区域)对象检测器。

深度学习是一种强大的机器学习技术,您可以使用它来训练健壮的对象检测器。有几种用于对象检测的深度学习技术,包括更快的R-CNN和你只看一次(YOLO) v2。此示例使用。训练一个更快的R-CNN车辆检测器trainFasterRCNNObjectDetector函数。欲了解更多信息,请参阅使用深度学习的对象检测

下载Pretrained探测器

下载一个预先训练过的检测器,以避免必须等待训练完成。如果你想训练探测器,设置doTrainingAndEval变量为true。

doTrainingAndEval = false;如果~ doTrainingAndEval & & ~存在(“fasterRCNNResNet50EndToEndVehicleExample.mat”'文件')disp (下载预先训练过的侦测器(118mb)…);pretrainedURL =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/vision/data/fasterRCNNResNet50EndToEndVehicleExample.mat”;websave(“fasterRCNNResNet50EndToEndVehicleExample.mat”,pretrainedURL);结束

加载数据集

本例使用了一个包含295张图像的小型标记数据集。每个图像包含一个或两个已标记的车辆实例。一个小的数据集对于探索更快的R-CNN训练过程是有用的,但在实践中,需要更多的标记图像来训练一个健壮的检测器。解压缩车辆图像并加载车辆地面真实数据。

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

的车辆数据被存储在两列的表,其中,第一列包含的图像文件的路径和所述第二列包含车辆的边界框。

将数据集分为训练集、验证集和测试集。选择60%的数据用于培训,10%用于验证,剩下的用于测试培训后的检测器。

RNG(0)= shuffledIndices randperm(高度(vehicleDataset));IDX =地板(0.6 *高度(vehicleDataset));trainingIdx = 1:IDX;trainingDataTbl = vehicleDataset(shuffledIndices(trainingIdx),:);validationIdx = IDX + 1:IDX + 1 +地板(0.1 *长度(shuffledIndices));validationDataTbl = vehicleDataset(shuffledIndices(validationIdx),:);testIdx = validationIdx(结束)1:长度(shuffledIndices);testDataTbl = vehicleDataset(shuffledIndices(testIdx),:);

使用imageDatastoreboxLabelDatastore创建用于在培训和评估期间加载图像和标签数据的数据存储。

imdsTrain = imageDatastore (trainingDataTbl {:,“imageFilename”});bldsTrain = boxLabelDatastore (trainingDataTbl (:,“汽车”));imdsValidation = imageDatastore (validationDataTbl {:,“imageFilename”});bldsValidation = boxLabelDatastore(validationDataTbl(:,“汽车”));imdsTest = imageDatastore (testDataTbl {:,“imageFilename”});bldsTest = boxLabelDatastore (testDataTbl (:,“汽车”));

结合图片和箱标签数据存储。

trainingData =结合(imdsTrain bldsTrain);validationData =结合(imdsValidation bldsValidation);testData =结合(imdsTest bldsTest);

显示其中一个训练图像和方框标签。

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

创建更快的R-CNN探测网

一个快速的R-CNN目标检测网络由一个特征提取网络和两个子网络组成。特征提取网络通常是一个预先训练好的CNN,比如ResNet-50或Inception v3。在特征提取网络之后的第一个子网络是一个区域建议网络(RPN),它被训练来生成目标建议——图像中可能存在目标的区域。第二个子网络被训练来预测每个对象建议的实际类。

特征提取网络通常是一个预先训练好的CNN预先训练的深度神经网络(深度学习工具箱))。本例使用ResNet-50进行特征提取。您也可以使用其他预培训的网络,如MobileNet v2或ResNet-18,这取决于您的应用程序需求。

使用fasterRCNNLayers为了创建一个更快的R-CNN网络自动给定一个预先训练的特征提取网络。fasterRCNNLayers需要你指定几个输入参数,一个更快的R-CNN网络:

  • 网络输入大小

  • 锚箱

  • 特征提取的网络

首先,指定网络输入大小。当选择网络输入的大小,考虑到运行网络本身,训练图像的尺寸所需的最小尺寸,并通过在所选择的尺寸的处理的数据所产生的计算成本。当可行时,选择一个网络输入大小的靠近训练图像的大小和比连接网络所需的输入大小。为了减少运行示例的计算成本,指定的[224 224 3]的网络输入的大小,这是运行网络所需的最小尺寸。

inputSize = [224 224 3];

注意,本例中使用的训练图像大于224×224,并且大小不同,因此您必须在训练前的预处理步骤中调整图像的大小。

下一步,使用estimateAnchorBoxes根据训练数据中对象的大小来估计锚盒的大小。考虑到训练前图像的大小调整,调整训练数据来估计锚盒。使用变换对训练数据进行预处理,然后定义锚盒的数量并对锚盒进行估计。

preprocessedTrainingData = transform(trainingData, @(data)预处理数据(data,inputSize));numAnchors = 3;anchorBoxes = estimateAnchorBoxes (preprocessedTrainingData numAnchors)
anchorBoxes =3×2136 119 55 48 157 128

有关选择锚框的更多信息,请参见根据训练数据估计锚盒(“计算机视觉工具箱”™)锚箱物体检测

现在,使用resnet50加载预训练的ResNet-50模型。

featureExtractionNetwork = resnet50;

选择“activation_40_relu”作为特征提取层。该特征提取层输出具有由16.下采样的这个量的因子下采样映射是一个很好的折衷的空间分辨率和所提取的特征的强度之间,作为特征进一步萃取降低网络编码在更强的图像特征成本的空间分辨率。选择最佳特征提取层需要经验分析。您可以使用analyzeNetwork查找网络中其他潜在特征提取层的名称。

featureLayer =“activation_40_relu”;

定义的类来检测的数量。

numClasses =宽度(vehicleDataset) 1;

创建更快R-CNN物体检测网络。

lgraph = fasterRCNNLayers (inputSize numClasses、anchorBoxes featureExtractionNetwork, featureLayer);

您可以使用可视化网络analyzeNetwork或从深度学习工具箱深层网络设计者™。

如果需要在更快的R-CNN网络体系结构的更多控制,使用深网络设计者手动设计更快的R-CNN检测网络。欲了解更多信息,请参阅入门与R-CNN,快速R-CNN,以及更快的R-CNN

数据扩张

在训练过程中,通过对原始数据的随机变换,利用数据扩充来提高网络的精度。通过使用数据扩充,您可以为训练数据添加更多的种类,而不必实际增加标记的训练样本的数量。

使用变换通过水平地随机翻转图像和相关的框标签来增加训练数据。注意,数据扩充不应用于测试和验证数据。理想情况下,测试和验证数据是原始数据的代表,不进行修改,以便进行无偏差的评估。

augmentedTrainingData =变换(trainingData,@ augmentData);

阅读相同的图像多次和显示增强训练数据。

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

预处理训练数据

对扩充后的培训数据和验证数据进行预处理,为培训做好准备。

trainingData =变换(augmentedTrainingData,@(数据)preprocessData(数据,inputSize));validationData =变换(validationData,@(数据)preprocessData(数据,inputSize));

读取预处理数据。

data =阅读(trainingData);

显示图像和框边框。

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

火车快R-CNN

使用trainingOptions指定网络培训选项。组“ValidationData”在预处理验证数据。组“CheckpointPath”到一个临时位置。这使得在训练过程中部分受训探测器的保存。如果训练被中断,如停电或系统故障,您可以继续从已保存的检查点的训练。

选择= trainingOptions (“个”...'MaxEpochs'10,...“MiniBatchSize”2,...“InitialLearnRate”,1E-3,...“CheckpointPath”tempdir,...“ValidationData”,validationData);

使用trainFasterRCNNObjectDetector训练更快的R-CNN对象探测器如果doTrainingAndEval是真的。否则,加载预训练的网络。

如果doTrainingAndEval训练更快的R-CNN探测器。% *调整负超量程和正超量程以确保训练样本与地面真实值紧密重叠。[detector, info] = trainFasterRCNNObjectDetector(trainingData,lgraph,options,...“NegativeOverlapRange”,0.3 [0],...“PositiveOverlapRange”(0.6 - 1));其他的%负载预先训练的检测器为例。pretrained =负载(“fasterRCNNResNet50EndToEndVehicleExample.mat”);检测器= pretrained.detector;结束

这个例子是在Nvidia(TM) Titan X GPU上验证的,该GPU有12gb的内存。训练网络大约花了20分钟。培训时间根据您使用的硬件而异。

作为快速检查,在一个测试图像上运行检测器。请确保将图像的大小调整为与训练图像相同的大小。

我= imread (testDataTbl.imageFilename {1});我= imresize(我inputSize (1:2));[bboxes,分数]=检测(探测器,I);

显示结果。

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

使用测试集评估检测器

在一组大的图像上评估经过训练的目标检测器,以测量其性能。Computer Vision Toolbox™提供了对象检测器评估功能,用于测量常见指标,如平均精度(evaluateDetectionPrecision)和日志的平均命中率(evaluateDetectionMissRate)。对于本例,使用平均精度度量来评估性能。平均精度提供了一个单一的数字,该数字包含了检测器进行正确分类的能力(精度)和检测器查找所有相关对象的能力(回忆)。

应用相同的预处理变换的测试数据作为训练数据。

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

运行在所有的测试图像检测器。

如果doTrainingAndEval检测结果=检测(检测器,testData,“MinibatchSize”4);其他的%负载预先训练的检测器为例。pretrained =负载(“fasterRCNNResNet50EndToEndVehicleExample.mat”);detectionResults = pretrained.detectionResults;结束

评价使用平均精度度量对象检测器。

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

精度/召回(PR)曲线亮点的检测器如何精确是在召回的不同水平。理想的精度为1,在所有召回的水平。使用更多的数据可以帮助提高平均精度,但可能需要更多的训练时间。画出PR曲线。

图图(召回,精度)xlabel('召回')ylabel ('精确'网格)标题(sprintf ('平均精度= %.2f',AP))

万博1manbetx支持功能

函数data = augmentData(数据)%随机翻转图像和边界框水平。TForm的= randomAffine2d('XReflection',真正);击溃= affineOutputView(大小(数据{1}),TForm的);数据{1} = imwarp(数据{1},TForm的,“OutputView”,溃败);{2}= bboxwarp数据(数据{2}、tform溃败);结束函数数据= preprocessData(数据,的targetSize)%将图像和边框大小调整为目标大小。规模= targetSize (1:2)。{1}/大小(数据,[1 - 2]);{1}= imresize数据(数据{1},targetSize (1:2));{2}= bboxresize数据(数据{2},规模);结束

参考文献

[1]仁,S.,K.他,R. Gershick,和J.太阳“更快R-CNN:建立实时目标检测与区域网络的建议。”IEEE模式分析与机器智能会刊。第39卷,第6期,2017年6月,第1137-1149页。

[2] Girshick, R., J. Donahue, T. Darrell,和J. Malik。丰富的特征层次结构,用于精确的目标检测和语义分割。2014年IEEE计算机视觉与模式识别会议论文集。哥伦布,2014年6月,580-587页。

[3]Girshick, R。“快速R-CNN。”2015年IEEE计算机视觉国际会议论文集。智利圣地亚哥,2015年12月,第1440-1448页。

[4] Zitnick, C. L.,和P. Dollar。“边缘框:从边缘定位对象建议。”欧洲计算机视觉会议。苏黎世,瑞士9月2014年,第391-405。

[5] Uijlings, J. R. R., K. E. A. van de Sande, T. Gevers,和A. W. M. Smeulders。“目标识别的选择性搜索。”国际计算机视觉杂志。第104卷,第2期,2013年9月,第154-171页。

另请参阅

|||||||||||

相关的话题