主要内容

fasterRCNNObjectDetector

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

描述

fasterRCNNObjectDetector对象使用更快的R-CNN(带卷积神经网络)对象检测器来检测来自图像的对象。要检测图像中的对象,将培训的探测器传递给检测函数。

使用时检测功能,使用CUDA®启用nvidia.®强烈推荐使用GPU。GPU大大减少了计算时间。使用GPU需要并行计算工具箱™。有关支持的计算能力的信息,请参见金宝appGPU支金宝app持情况(并行计算工具箱)

创建

创建一个fasterRCNNObjectDetector对象,调用trainFasterRCNNObjectDetector具有培训数据的功能(需要深度学习工具箱™)。

探测器= trainfasterrcnnobjectdetector(trainingdata,......)

属性

全部展开

此属性是只读的。

分类模型的名称,指定为字符向量或字符串标量。属性的第二列的标题默认设置为名称trainingData表中指定的表格trainFasterRCNNObjectDetector函数。您可以在创建您的fasterRCNNObjectDetector目的。

此属性是只读的。

培训的快速R-CNN对象检测网络,指定为aDagnetwork.(深度学习工具箱)目的。该对象存储定义在更快的R-CNN检测器中使用的卷积神经网络的图层。

此属性是只读的。

锚盒的尺寸,指定为m-by-2矩阵,其中每行格式为[高度宽度].这个值是在训练期间设置的。

此属性是只读的。

培训更快的R-CNN检测器的对象类的名称以查找,指定为单元数组。此属性由此设置trainingData的输入参数trainFasterRCNNObjectDetector函数。将类名指定为部分trainingData桌子。

此属性是只读的。

Faster R-CNN网络支持的最小对金宝app象大小,指定为[高度宽度)向量。最小大小取决于网络架构。

对象功能

检测 使用更快的R-CNN对象检测器检测对象

例子

全部收缩

这个例子展示了如何训练一个更快的R-CNN(卷积神经网络区域)目标检测器。

深度学习是一种强大的机器学习技术,可以用来训练健壮的目标探测器。有几种用于目标检测的深度学习技术,包括Faster R-CNN和you only look once (YOLO) v2。这个例子训练一个更快的R-CNN车辆检测器使用trainFasterRCNNObjectDetector函数。有关更多信息,请参阅对象检测

下载Pretrained探测器

下载佩带的探测器,以避免等待培训完成。如果你想训练探测器,请设置用圆形变量为true。

dotraining = false;如果~ doTraining & & ~存在('fasterrcnnresnet50endtoendvehicleexample.mat'“文件”)disp('下载掠夺探测器(118 MB)......');pretrainedURL ='//www.tatmou.com/金宝appsupportfiles/vision/data/fasterrcnnresnet50endtoendvehicleexample.mat';WebSave('fasterrcnnresnet50endtoendvehicleexample.mat',pretrowsurl);结尾

加载数据集

本例使用一个包含295张图像的小标记数据集。这些图像中有许多来自加州理工学院汽车1999年和2001年的数据集,可以在加州理工学院计算视觉中心获得网站,由Pietro Perona创作并获得许可使用。每个图像包含一个或两个已标记的车辆实例。一个小的数据集对于探索更快的R-CNN训练过程是有用的,但在实践中,需要更多的标记图像来训练一个健壮的检测器。解压缩车辆图像,加载车辆地面真实数据。

解压缩vehicleDatasetImages.zipdata = load(“vehicleDatasetGroundTruth.mat”);vevicledataset = data.vehicledataset;

车辆数据存储在一个两列表中,其中第一列包含图像文件路径,第二列包含车辆包围框。

将数据集分解为训练集、验证集和测试集。选择60%的数据用于训练,10%用于验证,其余的用于测试训练过的检测器。

rng(0) shuffledIndices = randperm(height(vehicleDataset)));idx = floor(0.6 * height(vehicleDataset));trainingIdx = 1: idx;trainingDataTbl = vehicleDataset (shuffledIndices (trainingIdx):);validationIdx = idx+1: idx+1 + floor(0.1 * length(shuffledIndices));validationDataTbl = vehicleDataset (shuffledIndices (validationIdx):);testdx = validationIdx(end)+1: length(shuffledIndices);testDataTbl = vehicleDataset (shuffledIndices (testIdx):);

采用imageDatastoreboxlabeldatastore.创建用于在训练和评估期间加载图像和标签数据的数据存储。

imdsTrain = imageDatastore (trainingDataTbl {:,'imagefilename'});Bldstrain = boxlabeldataStore(TriceionDatatbl(:,'车辆'));imdsvalidation = imageageataStore(ValidationDatatbl {:,'imagefilename'});bldsValidation = boxLabelDatastore (validationDataTbl (:,'车辆'));imdsTest = imageDatastore (testDataTbl {:,'imagefilename'});bldsTest = boxLabelDatastore (testDataTbl (:,'车辆'));

组合图像和框标签数据存储。

trainingdata =联合(Imdstrain,Bldstrain);ValidationData = Combine(IMDSValidation,BLDSvalidation);testdata =组合(IMDSTEST,BLDSTEST);

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

data =阅读(trainingData);我={1}数据;bbox ={2}数据;AnnotatedImage = instrshape(我,'矩形',bbox);AnnotatedImage = IMResize(AnnotatedImage,2);图imshow(AnnotatedImage)

创建更快的R-CNN检测网络

更快的R-CNN对象检测网络由特征提取网络组成,后跟两个子网。特征提取网络通常是预磨削的CNN,例如Reset-50或Incepion V3。特征提取网络之后的第一个子网是培训的区域提案网络(RPN),以在可能存在对象中生成对象提案的区域。第二个子网络接​​受培训以预测每个对象提案的实际类别。

特征提取网络通常是预先训练好的CNN(详情请参见普里德深度神经网络(深度学习工具箱)).本例使用ResNet-50进行特征提取。您还可以使用其他预先训练过的网络,如MobileNet v2或ResNet-18,这取决于您的应用程序需求。

采用Fasterrcnlayers.要自动创建更快的R-CNN网络,给出备用特征提取网络。Fasterrcnlayers.要求你指定几个参数化更快的R-CNN网络的输入:

  • 网络输入大小

  • 锚箱

  • 特征提取网络

首先,指定网络输入大小。选择网络输入大小时,请考虑运行网络本身的最小大小,培训图像的大小以及通过在所选大小处理数据产生的计算成本。可行时,选择接近训练图像大小的网络输入大小,大于网络所需的输入大小。为了降低运行示例的计算成本,请指定[224 224 3]的网络输入大小,这是运行网络所需的最小大小。

inputSize = [224 224 3];

请注意,在此示例中使用的训练图像大于224-by-224,大小不同,因此您必须在培训之前在预处理步骤中调整图像中的图像大小。

接下来,使用estimateAnchorBoxes基于培训数据中对象的大小来估算锚框。为了考虑在培训之前调整图像的大小,调整培训数据的大小进行估算锚盒。采用转变对训练数据进行预处理,定义锚盒的数量并对锚盒进行估计。

preprocesedtrainingdata = transform(trainingData, @(data)preprocessData(data,inputSize));numAnchors = 3;anchorBoxes = estimateAnchorBoxes (preprocessedTrainingData numAnchors)
anchorBoxes =3×229 17 46 39 136 116

有关选择锚框的更多信息,请参见从训练数据估算锚盒(计算机视觉工具箱™)和用于对象检测的锚盒

现在,使用resnet50加载预制Reset-50型号。

featureextractionnetwork = resnet50;

选择'activation_40_relu'作为特征提取层。该特征提取层输出特征映射,向下采样的因子为16。这种向下采样量是空间分辨率和提取特征强度之间的一个很好的权衡,因为进一步向下提取的特征以空间分辨率为代价编码更强的图像特征。选择最优的特征提取层需要实证分析。您可以使用analyzeNetwork查找网络中其他潜在特征提取层的名称。

featureLayer ='activation_40_relu';

定义要检测的类的数量。

numClasses =宽度(vehicleDataset) 1;

创建更快的R-CNN对象检测网络。

lgraph = fasterrcnlayers(输入,numcrasses,anchorboxes,featureextractionnetwork,featureLayer);

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

如果更快的R-CNN网络架构需要更多的控制,使用深度网络设计器手动设计更快的R-CNN检测网络。有关更多信息,请参阅R-CNN,FAST R-CNN和更快的R-CNN入门

数据增强

数据增强用于通过在培训期间随机转换原始数据来提高网络精度。通过使用数据增强,您可以为培训数据添加更多品种而实际上必须增加标记的训练样本的数量。

采用转变通过水平翻转图像和相关框标签来增加培训数据。请注意,数据增强不适用于测试和验证数据。理想情况下,测试和验证数据代表原始数据,并未被修改以进行无偏的评估。

AugmentedTrainingData =变换(TrainingData,@ AugmentData);

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

AugmentedData = Cell(4,1​​);为了k = 1:4数据=读取(AugmentedTrainingData);AugmentedData {k} = insertshape(数据{1},'矩形',数据{2});重置(AugmentedTrainingData);结尾图蒙太奇(AugmentedData,“BorderSize”, 10)

训练数据进行预处理

预处理增强培训数据,以及为培训做准备的验证数据。

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

阅读预处理数据。

data =阅读(trainingData);

显示图像和框边界框。

我={1}数据;bbox ={2}数据;AnnotatedImage = instrshape(我,'矩形',bbox);AnnotatedImage = IMResize(AnnotatedImage,2);图imshow(AnnotatedImage)

火车更快R-CNN

采用培训选项指定网络培训选项。放'vightationdata'到预处理的验证数据。放'checkpoinspath'到临时位置。这使得能够在培训过程中节省部分训练的探测器。如果培训被中断,例如通过停电或系统故障,您可以从已保存的检查点恢复培训。

选项=培训选项(“个”...'maxepochs'10...“MiniBatchSize”2,...'italllearnrate'1 e - 3,...'checkpoinspath'tempdir,...'vightationdata',validationdata);

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

如果用圆形%训练更快的R-CNN检测器。% *调整负重叠范围和正重叠范围,以确保培训样本的百分比与地面真相紧密重叠。[检测器,信息]= trainFasterRCNNObjectDetector(trainingData,lgraph,options,...'负极的贪婪', 0.3 [0],...'积极透过的'(0.6 - 1));别的为示例的%负载净化探测器。pretry = load('fasterrcnnresnet50endtoendvehicleexample.mat');探测器= pretrination.detector;结尾

这个例子是在具有12gb内存的Nvidia(TM) Titan X GPU上验证的。训练网络大约花了20分钟。训练时间取决于你使用的硬件。

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

i = imread(testdatatbl.imagefilename {3});i = imresize(i,输入(1:2));[bboxes,scores] =检测(探测器,i);

显示结果。

i = InsertObjectAnnotation(I,'矩形'bboxes,分数);图imshow(我)

使用测试集评估检测器

评估训练的目标检测器在一组大的图像,以衡量性能。计算机视觉工具箱™提供对象检测器评估功能,以测量常见的指标,如平均精度(evaluateDetectionPrecision)和日志平均遗漏率(evaluateDetectionMissRate).在此示例中,使用平均精度度量来评估性能。平均精度提供单个数字,该编号包含检测器对探测器(精度)和检测器找到所有相关对象(召回)的能力的能力。

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

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

在所有测试图像上运行探测器。

检测=检测(检测器,TestData,“MinibatchSize”4);

评估对象探测器使用平均精度度量。

[AP,Recall,Precision] =评估预选(检测结果,TestData);

精密/召回(PR)曲线突出显示检测器的次数变化的精确度。理想的精度在所有召回水平上都是1。使用更多数据可以帮助提高平均精度,但可能需要更多的培训时间。绘制PR曲线。

图绘图(召回,精确)xlabel('记起')ylabel('精确'网格)标题(Sprintf('平均精度=%.2f',ap))

金宝app支持功能

功能data = augmentData(数据)水平随机翻转图像和边框。tform = ronstaffine2d(“XReflection”,真正的);深圳=大小(数据{1});tform溃败= affineOutputView(深圳);{1} = imwarp数据(数据{1}、tform“OutputView”,溃败);如果需要,%Sanitize Box数据。数据{2} = allersanitizedboxes(数据{2},sz);%翘曲盒。{2} = bboxwarp数据(数据{2}、tform溃败);结尾功能targetSize data = preprocessData(数据)%调整图像大小和边界框以瞄准。sz = size(数据{1},[1 2]);scale = targetsize(1:2)./ sz;数据{1} = IMResize(数据{1},targetsize(1:2));如果需要,%Sanitize Box数据。数据{2} = allersanitizedboxes(数据{2},sz);%调整大小框。数据{2} = bboxresize(数据{2},比例);结尾

参考文献

[1]任,S.,K。他,R.Gershick和J. Sun.“更快的R-CNN:通过区域提案网络实时对象检测。”图案分析和机器智能的IEEE交易.卷。39,第6号,2017年6月,第1137-1149页。

[2] Girshick,R.,J. Donahue,T. Darrell和J. Malik。“丰富的特征层次结构,用于准确对象检测和语义细分。”2014 IEEE计算机视觉与模式识别会议论文集.Columbus, OH, June 2014, pp. 580-587。

[3] Girshick, R。“快速R-CNN。”2015年IEEE计算机愿景会议的诉讼程序.智利圣地亚哥,2015年12月,第1440-1448页。

[4] Zitnick,C.L和P. Dollar。“边缘盒子:从边缘找到对象提案。”欧洲电脑视觉会议.苏黎世,瑞士,2014年9月,第391-405页。

J. R. R., K. E. A. van de Sande, T. Gevers, and A. W. M. Smeulders。"物体识别的选择性搜索"国际计算机视觉杂志.卷。104,2013年9月2日,第154-171页。

在R2017A介绍