主要内容

使用更快的R-CNN深度学习的目标检测

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

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

下载Pretrained探测器

下载一个预先训练过的检测器,以避免等待训练完成。如果你想训练探测器,设置doTraining变量为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创作并经许可使用。每个图像包含一个或两个标记过的车辆实例。一个小的数据集对于探索Faster R-CNN训练过程是有用的,但在实践中,需要更多的标记图像来训练一个鲁棒检测器。解压缩车辆图像并加载车辆地面真实数据。

解压缩vehicleDatasetImages.zipdata =负载('车辆有绳索地面纠址.MAT');vehicleDataset = data.vehicleDataset;

车辆数据存储在双列表中,第一列包含图像文件路径,第二列包含车辆边界框。

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

RNG(0)Shuffled indices = Randperm(高度(车辆达到));IDX =楼层(0.6 *高度(车辆型履带));trainingIdx = 1:IDX;trainingdatatbl =车辆驾驶仪(shuffleddindes(trainingidx),:);validationIdx = IDX + 1:IDX + 1 +楼层(0.1 *长度(Shuffledindices));ValidationDataTBL =车辆(Shuffledindices(validationIdx),:);testIdx = ValidationIDX(END)+1:长度(Shuffleddindes);testdatatbl =车辆levledataset(shuffleddindes(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需要你指定几个参数化Faster R-CNN网络的输入:

  • 网络输入大小

  • 锚箱

  • 特征提取的网络

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

inputSize = [224 224 3];

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

下一步,使用extimateanchorboxes.根据训练数据中物体的大小来估计锚箱。为了考虑训练前图像的大小,调整训练数据的大小以估计锚框。使用变换首先对训练数据进行预处理,然后定义锚箱的数量,并对锚箱进行估计。

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

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

现在,使用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,FAST 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 = transform(augmentedtrainingdata,@(data)preprocessdata(数据,inputsize));ValidationData = Transform(ValidationData,@(数据)预处理数据(数据,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训练Faster R-CNN物体检测器doTraining是真的。否则,加载预训练的网络。

如果doTraining%训练Faster R-CNN检测器。% *调整NegativeOverlapRange和PositiveOverlapRange以确保%表示训练样本与ground truth紧密重叠。[detector, info] = trainFasterRCNNObjectDetector(trainingData,lgraph,options,......“NegativeOverlapRange”, 0.3 [0],......“PositiveOverlapRange”(0.6 - 1));其他的%加载该示例的预训练检测器。pretrained =负载(“fasterRCNNResNet50EndToEndVehicleExample.mat”);探测器= pretrination.detector;结束

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

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

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

显示结果。

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

使用测试集评估检测器

在大量图像上评估训练后的目标检测器的性能。计算机视觉工具箱™提供对象检测器评估功能,以衡量一般指标,如平均精度(evaluateDetectionPrecision)和日志平均小姐率(evaluateDetectionMissRate).对于本例,使用平均精度度量来评估性能。平均精度提供一个单一的数字,该数字包含检测器做出正确分类的能力(精度)和检测器找到所有相关对象的能力(召回率)。

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

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

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

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

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

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

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

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

金宝app支持功能

函数data = augmentData(数据)%随机翻转图像和边界框水平。tform = ronstaffine2d('Xreflection',真正的);深圳=大小(数据{1});tform溃败= affineOutputView(深圳);{1} = imwarp数据(数据{1}、tform“OutputView”,溃败);%清除框数据(如果需要)。数据{2}= helperSanitizeBoxes(数据{2},sz);%经盒。{2} = bboxwarp数据(数据{2}、tform溃败);结束函数targetSize data = preprocessData(数据)%调整图像和边框的大小为targetSize。sz = size(数据{1},[1 2]);scale = targetsize(1:2)./ sz;数据{1} = IMResize(数据{1},targetsize(1:2));%清除框数据(如果需要)。数据{2}= helperSanitizeBoxes(数据{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计算机视觉与模式识别会议论文集.哥伦布,OH, 2014年6月,580-587页。

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

Zitnick, C. L.和P. Dollar。“边缘盒:从边缘定位对象提案。”欧洲计算机视觉会议.苏黎世,瑞士,2014年9月,第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页。

另请参阅

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

相关的话题