主要内容

fasterRCNNObjectDetector

使用Faster R-CNN深度学习检测器检测对象

描述

fasterRCNNObjectDetectorobject从图像中检测对象,使用更快的R-CNN(卷积神经网络区域)对象检测器。为了检测图像中的对象,将训练过的检测器传递给检测函数。

当使用检测功能,使用CUDA®使英伟达®强烈推荐GPU。GPU显著减少了计算时间。GPU的使用需要并行计算工具箱™。有关受支持的计算功能的信息,请参见万博1manbetxGPU支万博1manbetx持版本(并行计算工具箱)

创建

创建一个fasterRCNNObjectDetector对象通过调用trainFasterRCNNObjectDetector函数与训练数据(需要深度学习工具箱™)。

检测器= trainfastrcnnobjectdetector (trainingData,…)

属性

全部展开

此属性是只读的。

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

此属性是只读的。

训练过的快速R-CNN对象检测网络,指定为DAGNetwork(深度学习工具箱)对象。该对象存储定义Faster R-CNN检测器中使用的卷积神经网络的层。

此属性是只读的。

锚盒的大小,指定为-by-2矩阵,其中每行的格式为[高度宽度].该值在培训期间设置。

此属性是只读的。

训练Faster R-CNN检测器查找的对象类名称,指定为单元格数组。属性设置此属性trainingData的输入参数。trainFasterRCNNObjectDetector函数。类的一部分指定类名trainingData表格

此属性是只读的。

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

对象的功能

检测 使用Faster R-CNN对象检测器检测对象

例子

全部折叠

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

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

下载预训练检测器

下载预训练的检测器,以避免等待训练完成。如果你想训练检测器,设置doTraining变量为true。

doTraining = false;如果~doTraining && ~exist(“fasterRCNNResNet50EndToEndVehicleExample.mat”“文件”) disp (“下载预训练的检测器(118 MB)…”);pretrainedURL =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/vision/data/fasterRCNNResNet50EndToEndVehicleExample.mat”;websave (“fasterRCNNResNet50EndToEndVehicleExample.mat”, pretrainedURL);结束

负载数据集

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

解压缩vehicleDatasetImages.zip数据=负载(“vehicleDatasetGroundTruth.mat”);vehicleDataset = 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),:);

使用imageDatastore而且boxLabelDatastore创建用于在训练和评估期间加载图像和标签数据的数据存储。

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

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

trainingData = combine(imdsTrain,bldsTrain);validationData = combine(imdsValidation,bldsValidation);testData = combine(imdsTest,bldsTest);

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

data = read(trainingData);I =数据{1};Bbox =数据{2};annotatedImage = insertShape(I,“矩形”, 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要求您指定几个参数化Faster R-CNN网络的输入:

  • 网络输入大小

  • 锚箱

  • 特征提取网络

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

inputSize = [224 224 3];

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

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

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

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

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

featureextracactionnetwork = resnet50;

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

featureLayer =“activation_40_relu”

定义要检测的类的数量。

numClasses = width(vehicleDataset)-1;

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

lgraph = fastrcnnlayers (inputSize,numClasses,anchorBoxes, featureextracactionnetwork,featureLayer);

您可以可视化网络使用情况analyzeNetwork或来自深度学习工具箱™的深度网络设计器。

如果需要对Faster R-CNN网络架构进行更多的控制,请使用Deep network Designer手动设计Faster R-CNN检测网络。有关更多信息,请参见R-CNN入门,快R-CNN,快R-CNN

数据增加

数据增强是通过在训练过程中随机转换原始数据来提高网络的准确性。通过使用数据增强,您可以为训练数据添加更多的多样性,而无需实际增加标记训练样本的数量。

使用变换通过水平随机翻转图像和相关框标签来增强训练数据。请注意,数据增强并不应用于测试和验证数据。理想情况下,测试和验证数据是原始数据的代表,并且没有被修改以进行公正的评估。

augmentedTrainingData = transform(trainingData,@augmentData);

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

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

预处理训练数据

对增强训练数据和验证数据进行预处理,为训练做准备。

trainingData = transform(augmentedTrainingData,@(data)preprocessData(data,inputSize));validationData = transform(validationData,@(data)preprocessData(data,inputSize));

读取预处理数据。

data = read(trainingData);

显示图像和框包围框。

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

列车提速R-CNN

使用trainingOptions指定网络培训选项。集“ValidationData”到预处理的验证数据。集“CheckpointPath”到一个临时地点。这使得在训练过程中可以保存部分训练过的检测器。如果培训中断,例如由于停电或系统故障,您可以从保存的检查点恢复培训。

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

使用trainFasterRCNNObjectDetector训练更快的R-CNN物体检测器如果doTraining是真的。否则,加载预训练的网络。

如果doTraining训练更快的R-CNN检测器。% *调整负重叠范围和正重叠范围以确保训练样本与实际情况紧密重叠。。[detector, info] = trainfastrcnnobjectdetector (trainingData,lgraph,options,...“NegativeOverlapRange”, 0.3 [0],...“PositiveOverlapRange”(0.6 - 1));其他的为示例加载预训练的检测器。预训练=负荷(“fasterRCNNResNet50EndToEndVehicleExample.mat”);检测器=预训练的。结束

这个例子是在Nvidia(TM) Titan X GPU上验证的,内存为12 GB。训练这个网络大约需要20分钟。训练时间取决于您使用的硬件。

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

I = imread(testDataTbl.imageFilename{3});I = imresize(I,inputSize(1:2));[bboxes,scores] = detect(检测器,I);

显示结果。

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

使用测试集评估检测器

在大量图像上评估训练过的目标检测器的性能。计算机视觉工具箱™提供对象检测器评估功能,以测量常见指标,如平均精度(evaluateDetectionPrecision)和对数平均失误率(evaluateDetectionMissRate).对于本例,使用平均精度度量来评估性能。平均精度提供了一个单一的数字,其中包括探测器进行正确分类的能力(精度)和探测器找到所有相关对象的能力(召回率)。

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

testData = transform(testData,@(data)preprocessData(data,inputSize));

在所有测试映像上运行检测器。

detectionResults = detect(检测器,testData,“MinibatchSize”4);

使用平均精度度量来评估目标检测器。

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

精度/召回(PR)曲线强调了探测器在不同召回级别下的精度。在所有召回级别上,理想的精度为1。使用更多的数据有助于提高平均精度,但可能需要更多的训练时间。绘制PR曲线。

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

万博1manbetx支持功能

函数数据= augmentData(数据)随机水平翻转图像和包围框。tform = randomAffine2d(“XReflection”,真正的);Sz = size(数据{1});rout = affineOutputView(sz,tform);数据{1}= imwarp(数据{1},tform,“OutputView”,溃败);如果需要,消毒盒子数据。%data{2} = helperSanitizeBoxes(data{2}, sz);%变形盒。数据{2}= bboxwarp(数据{2},tform,rout);结束函数data = preprocessData(data,targetSize)将图像和包围框的大小调整为targetSize。Sz = size(data{1},[1 2]);scale = targetSize(1:2)./sz;数据{1}= imresize(数据{1},targetSize(1:2));如果需要,消毒盒子数据。%data{2} = helperSanitizeBoxes(data{2}, sz);%调整盒子大小。数据{2}= bboxresize(数据{2},规模);结束

参考文献

[1] Ren, S., K. He, R. Gershick, J. Sun。更快的R-CNN:使用区域提议网络实现实时目标检测IEEE模式分析与机器智能汇刊.第39卷,第6期,2017年6月,第1137-1149页。

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

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

齐特尼克,c.l., P. Dollar。边框:从边定位对象建议。欧洲计算机视觉会议.瑞士苏黎世,2014年9月,第391-405页。

[5]伊吉林斯,J. R. R., K. E. A.范·德·桑德,T.格弗斯和A. W. M.斯莫尔德。对象识别的选择性搜索国际计算机视觉杂志.第104卷,第2期,2013年9月,第154-171页。

在R2017a中引入