主要内容

trainRCNNObjectDetector

训练一个R-CNN深度学习对象检测器

描述

例子

探测器= trainRCNNObjectDetector (trainingData网络选项训练一个基于R-CNN(卷积神经网络区域)的目标检测器。该函数使用深度学习来训练检测器检测多个对象类。

R-CNN的实现没有为每个对象类训练SVM分类器。

此功能要求您拥有深度学习工具箱™和统计和机器学习工具箱™。建议您还使用并行计算工具箱™与CUDA一起使用®使英伟达®GPU。有关受支持的计算功能的信息,请参见金宝appGPU计算要求(并行计算工具箱)

探测器= trainRCNNObjectDetector (___名称,值返回一个探测器对象,其可选输入属性由一个或多个对象指定名称,值对参数。

探测器= trainRCNNObjectDetector (___”,RegionProposalFcn”,proposalFcn)使用自定义区域建议函数可选地训练R-CNN检测器。

探测器信息= trainRCNNObjectDetector(___还返回关于每个迭代的训练进度的信息,例如训练损失和准确性。

探测器= trainRCNNObjectDetector (___名称,值使用一个或多个指定的其他选项名称,值对参数和任何先前的输入。

例子

全部折叠

加载训练数据和网络层。

负载(“rcnnStopSigns.mat”“stopSigns”“层”

将图像目录添加到MATLAB路径中。

imDir = fullfile(matlabroot,“工具箱”“愿景”“visiondata”...“stopSignImages”);目录(imDir);

将网络训练选项设置为使用32个小批量大小,以减少GPU内存占用。降低InitialLearningRate以降低网络参数更改的速率。在对预训练的网络进行微调时,这是有益的,可以防止网络变化过快。

选项= trainingOptions(“个”...“MiniBatchSize”32岁的...“InitialLearnRate”1 e-6...“MaxEpochs”10);

训练R-CNN检测器。训练可能需要几分钟才能完成。

rcnn = trainRCNNObjectDetector(stopSigns, layers, options,“NegativeOverlapRange”, [0 0.3]);
******************************************************************* 培训一个R-CNN对象探测器以下对象类:* stopSign步骤1的3:从27日训练图像提取区域建议……。第三步中的第二步:训练神经网络对训练数据中的对象进行分类…|=========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习| | | | | | |精度损失速率(秒)  | |=========================================================================================| | 50 | 3 | 9.27 | 0.2895 | 96.88% | 0.000001 | | 100 | | 14.77 | 0.2443 | 93.75% | 0.000001 | | 150 | | 20.29 | 0.0013 | 100.00% | 0.000001 | | | 200 | | 0.000001 | 25.94 | 0.1524 | 96.88%|=========================================================================================| Network training complete. Step 3 of 3: Training bounding box regression models for each object class...100.00%...done. R-CNN training complete. *******************************************************************

在测试图像上测试R-CNN检测器。

Img = imread(“stopSignTest.jpg”);[bbox, score, label] = detect(rcnn, img,“MiniBatchSize”、32);

显示最强检测结果。

[score, idx] = max(score);Bbox = Bbox (idx,:);注释= sprintf('%s:(可信度= %f)', label(idx), score);detectedImg = insertObjectAnnotation(img,“矩形”, bbox,注释);图imshow (detectedImg)

从路径中删除映像目录。

rmpath (imDir);

使用附加数据恢复训练R-CNN对象检测器。为了说明这个过程,一半的地面真相数据将用于初始训练探测器。然后,使用所有数据恢复训练。

加载训练数据并初始化训练选项。

负载(“rcnnStopSigns.mat”“stopSigns”“层”) stopSigns。imageFilename = fullfile(toolboxdir(“愿景”),“visiondata”...stopSigns.imageFilename);选项= trainingOptions(“个”...“MiniBatchSize”32岁的...“InitialLearnRate”1 e-6...“MaxEpochs”10...“详细”、假);

用部分真实信息训练R-CNN检测器。

rcnn = trainRCNNObjectDetector(stopSigns(1:10,:),图层,选项,“NegativeOverlapRange”, [0 0.3]);

从检测器获得训练好的网络层。当您将网络层数组传递给trainRCNNObjectDetector在美国,他们被原样用于继续培训。

网络= rcnn.Network;层=网络。层;

使用所有培训数据恢复培训。

rcnnFinal = trainRCNNObjectDetector(stopSigns, layers, options);

为两个对象类(狗和猫)创建R-CNN对象检测器。

objectClasses = {“狗”“猫”};

该网络必须能够对狗、猫和“背景”类进行分类,以便进行训练trainRCNNObjectDetector.在本例中,添加了一个one来包含背景。

numClassesPlusBackground = numel(objectClasses) + 1;

网络的最后一层全连接层定义了网络可以分类的类的数量。将最终的全连接层设置为输出大小等于类的数量加上一个背景类。

层= [...imageInputLayer([28 28 1]) convolution2dLayer(5,20) fullyConnectedLayer(numClassesPlusBackground);classificationLayer softmaxLayer () ()];

这些网络层现在可以用来训练R-CNN两类对象检测器。

创建R-CNN对象检测器,并将其设置为使用已保存的网络检查点。在网络训练期间,每个纪元都会保存一个网络检查点trainingOptions设置“CheckpointPath”参数。如果您的培训课程意外终止,网络检查点非常有用。

加载停止标志训练数据。

负载(“rcnnStopSigns.mat”“stopSigns”“层”

为映像文件添加完整路径。

stopSigns。imageFilename = fullfile(toolboxdir(“愿景”),“visiondata”...stopSigns.imageFilename);

属性设置“CheckpointPath”trainingOptions函数。

checkpointLocation = tempdir;选项= trainingOptions(“个”“详细”假的,...“CheckpointPath”, checkpointLocation);

用一些图像训练R-CNN对象检测器。

rcnn = trainRCNNObjectDetector(stopSigns(1:3,:),图层,选项);

加载一个保存的网络检查点。

wildcardFilePath = fullfile(checkpointLocation,“convnet_checkpoint__ * .mat”);contents = dir(wildcardFilePath);

加载其中一个检查点网络。

Filepath = fullfile(contents(1).folder,contents(1).name);检查点=加载(文件路径);checkpoint.net
ans = SeriesNetwork with properties: Layers: [15×1 nnet.cnn.layer.Layer]

创建一个新的R-CNN对象检测器,并将其设置为使用保存的网络。

rcnnCheckPoint = rcnnObjectDetector();rcnnCheckPoint。RegionProposalFcn = @ rcnnobjectdetector . proseregions;

将Network设置为保存的网络检查点。

rcnnCheckPoint。网络= checkpoint.net
rcnnCheckPoint = rcnnObjectDetector with properties: Network: [1×1 SeriesNetwork] ClassNames: {'stopSign' 'Background'} RegionProposalFcn: @rcnnObjectDetector. proseregions

输入参数

全部折叠

已标记的地面真实图像,指定为具有两列或多列的表。

如果使用表,则表必须有两个或多个列。表的第一列必须包含带有路径的映像文件名。图像必须是灰度或真彩色(RGB),它们可以是任何格式支持金宝appimread.其余每一列都必须是单元格向量,包含-by-4表示单个对象类的矩阵,例如车辆,或停车标志.列包含的4元双数组格式为[的包围框xy宽度高度].该格式指定了相应图像中左上角的位置和包围框的大小。要创建基本真值表,可以使用图片标志应用程序或贴标签机视频要根据生成的ground truth创建训练数据表,请使用objectDetectorTrainingData函数。

表变量名定义了对象类名。要创建基本真值表,请使用图片标志小于32x32的方框不用于训练。

网络,指定为SeriesNetwork(深度学习工具箱),一个数组(深度学习工具箱)对象,layerGraph(深度学习工具箱)对象,或者通过网络名。中定义的对象类进行分类trainingData表格的SeriesNetwork(深度学习工具箱)(深度学习工具箱),layerGraph(深度学习工具箱)对象在深度学习工具箱中可用。

  • 当您将网络指定为SeriesNetwork,一个数组对象,或通过网络名称,通过添加新的分类和回归层来支持对象检测,网络自动转换为R-CNN网络。金宝app

  • 数组(深度学习工具箱)对象必须包含一个支持对象类数量的分类层,再加上一个背景类。金宝app使用此输入类型可自定义每层的学习率。数组的示例(深度学习工具箱)对象:

    layers = [imageInputLayer([28 28 3]) convolution2dLayer([5 5],10) reluLayer() fullyConnectedLayer(10) softmaxLayer() classificationLayer()];

  • 当您将网络指定为SeriesNetwork数组,或网络的名称,卷积和全连接层的权重初始化为“narrow-normal”

  • 网络名称必须为以下有效网络名称之一。您还必须安装相应的附加组件。

  • LayerGraph对象必须是一个有效的R-CNN对象检测网络。你也可以用aLayerGraph训练自定义R-CNN网络。

看到R-CNN入门,快R-CNN,快R-CNN了解更多关于如何创建R-CNN网络的信息。

控件返回的训练选项trainingOptions(深度学习工具箱)函数从深度学习工具箱。要指定网络训练的求解器和其他选项,请使用trainingOptions

请注意

trainRCNNObjectDetector不支持以下培训选项金宝app:

  • ValidationDataValidationFrequency,或ValidationPatience选项

名称-值参数

指定可选参数对为Name1 = Value1,…,以=家,在那里名字参数名称和价值对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。

在R2021a之前,使用逗号分隔每个名称和值,并将其括起来名字在报价。

例子:“PositiveOverlapRange”(0.5 - 1)

包围框重叠范围的正训练样本比,指定为逗号分隔的对,由'PositiveOverlapRange'和一个二元向量。向量包含范围为[0,1]的值。在指定范围内与地面真值边界框重叠的区域建议作为正训练样本。

的重叠比PositiveOverlapRange而且NegativeOverlapRange定义为:

一个 r e 一个 一个 B 一个 r e 一个 一个 B


一个而且B是边界框。

包围框重叠范围的负训练样本比,指定为逗号分隔的对,由'NegativeOverlapRange'和一个二元向量。向量包含范围为[0,1]的值。在指定范围内与ground truth边界盒重叠的区域建议作为负训练样本。

用于生成训练样本的最强区域建议的最大数量,指定为逗号分隔的对,由'NumStrongestRegions'和一个整数。减小这个值可以加快处理时间,尽管这样做会降低训练的准确性。若要使用所有区域建议,请将此值设置为

自定义区域建议函数句柄,指定为逗号分隔的对,由'RegionProposalFcn'和函数名。如果未指定自定义区域建议函数,则“边缘盒”算法的默认变体[3],开始rcnnObjectDetector,使用。一个自定义proposalFcn必须具有以下功能形式:

[bboxes,scores] = proposalFcn(I)

输入,对象中定义的图像groundTruth表格函数中必须返回矩形包围框4数组。每行bboxes包含一个四元素向量,[xy宽度高度],它指定边界框的左上角和大小(以像素为单位)。类中的每个包围框也必须返回一个分数1的向量。分数越高,表示边界框更有可能包含一个对象。分数用于选择最强的区域,您可以在其中指定NumStrongestRegions

框回归层名称,指定为逗号分隔的对,由'BoxRegressionLayer'和一个字符向量。有效值为“汽车”或者输入网络中某个层的名称。该层的输出激活被用作特征来训练回归模型,以细化检测到的包围框。

如果名字是“汽车”,然后trainRCNNObjectDetector根据输入网络类型自动从输入网络中选择一个层:

  • 如果输入网络是一个SeriesNetwork或者一个数组对象,然后函数选择最后一个卷积层。

  • 如果输入网络是一个LayerGraph,则该函数选择最后一个全连接层的源。

检测器训练实验监测,规定为实验。监控(深度学习工具箱)对象,用于实验管理器(深度学习工具箱)您可以使用该对象跟踪训练的进度,更新训练结果表中的信息字段,记录训练所使用的指标的值,并生成训练图。

培训期间监测的信息:

  • 每次迭代的训练损失。

  • 每次迭代的训练精度。

  • 盒回归层的训练均方根误差(RMSE)。

  • 每次迭代的学习率。

输出参数

全部折叠

经过训练的基于r - cnn的对象检测器,返回为rcnnObjectDetector对象。您可以训练R-CNN检测器检测多个对象类。

培训信息,作为具有以下字段的结构返回。每个字段是一个数字向量,每次训练迭代有一个元素。在特定迭代中未计算的值表示为

  • TrainingLoss-每次迭代的训练损失。这是用于训练R-CNN网络的分类和回归损失的组合。

  • TrainingAccuracy-每次迭代的训练集精度

  • BaseLearnRate-每次迭代的学习率

限制

  • R-CNN的实现没有为每个对象类训练SVM分类器。

提示

  • 为了加速训练的数据预处理,trainRCNNObjectDetector自动创建并使用一个并行池并行偏好设置.这需要并行计算工具箱。

  • VGG-16、VGG-19、ResNet-101和Inception-ResNet-v2是大型号。使用大图像进行训练可能会产生“内存不足”错误。为了减轻这些错误,在调用之前手动调整图像的大小以及边界框接地真值数据trainRCNNObjectDetector

  • 该函数支持迁移学习。金宝app当网络按名称输入时,例如“resnet50”,然后软件根据预训练的结果自动将网络转换为有效的R-CNN网络模型resnet50(深度学习工具箱)模型。方法手动指定自定义R-CNN网络LayerGraph(深度学习工具箱)从预训练的DAG网络中提取。看到创建R-CNN对象检测网络

  • 使用trainingOptions(深度学习工具箱)函数启用或禁用详细打印。

参考文献

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

[2] Girshick, R.“快速R-CNN。”IEEE计算机视觉国际会议论文集.2015,第1440-1448页。

齐特尼克,c·劳伦斯,p·道尔。边框:从边定位对象建议。计算机视觉- eccv,施普林格国际出版社。2014,第391-405页。

扩展功能

版本历史

在R2016b中引入