主要内容

trainFasterRCNNObjectDetector

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

描述

训练一个探测器

例子

trainedDetector= trainFasterRCNNObjectDetector (trainingData网络选项使用深度学习训练一个更快的R-CNN(卷积神经网络区域)目标检测器。您可以训练一个Faster R-CNN检测器来检测多个对象类。

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

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

培训检测器

trainedDetector= trainFasterRCNNObjectDetector (trainingData检查点选项从探测器检查点恢复训练。

微调检测器

trainedDetector= trainFasterRCNNObjectDetector (trainingData探测器选项继续训练一个具有额外微调选项的更快R-CNN对象检测器。将此语法与其他训练数据一起使用,或执行更多的训练迭代,以提高检测器的准确性。

额外的属性

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

例子

全部折叠

加载训练数据。

数据=负载(“fasterRCNNVehicleTrainingData.mat”);trainingData = data.vehicleTrainingData;trainingData。我米一个geFilename = fullfile(toolboxdir(“愿景”),“visiondata”...trainingData.imageFilename);

随机打乱数据进行训练。

rng (0);shuffledIdx = randperm(高度(trainingData));trainingData = trainingData(shuffledIdx,:);

使用表中的文件创建映像数据存储。

imds = imageDatastore(trainingData.imageFilename);

使用表中的标签列创建框标签数据存储。

blds = boxLabelDatastore(trainingData(:,2:end));

合并数据存储。

Ds = combine(imds, blds);

设置网络层。

lgraph = layerGraph(data.detector.Network);

配置培训选项。

选项= trainingOptions(“个”...“MiniBatchSize”, 1...“InitialLearnRate”1 e - 3,...“MaxEpochs”7...“VerboseFrequency”, 200,...“CheckpointPath”, tempdir);

火车探测器。训练需要几分钟。调整NegativeOverlapRange和PositiveOverlapRange,以确保训练样本与地面真相紧密重叠。

检测器= trainfastrcnnobjectdetector (ds, lgraph, options,...“NegativeOverlapRange”, 0.3 [0],...“PositiveOverlapRange”(0.6 - 1));
************************************************************************* 培训快R-CNN对象探测器以下对象类:*车辆培训单一的GPU。初始化输入数据规范化。|=============================================================================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch | Mini-batch | RPN Mini-batch | RPN Mini-batch |基地学习  | | | | ( hh: mm: ss) | | |精度损失精度RMSE | | RMSE |率  | |=============================================================================================================================================| | 1 | 1 |就是| 0.8771 | 0.83 | | 97.30% 91.41% | 0.71 | 0.0010 | | 200 | | 00:01:15 | 0.5324 | 0.15 | | 100.00% 88.28% | 0.70 | 0.0010 | | 2 | 400 | 00:02:40 | 0.4732 | 0.15 | | 100.00% 92.19% | 0.63 | 0.0010 | | 3 | 600 | 00:04:03 | 0.4776 | 0.09 | | 97.14% 96.88% | 0.59 | 0.0010 | | 3 | 800 | 00:05:23 | 0.5269 | 0.18 | | 97.44% 89.06% | 0.68 | 0.0010 | | 1000 | | 00:06:44 | 0.9749 | 100.00% | | 85.16% | 1.00 | 0.0010 | | 1200 | | 00:08:07 | 1.1952 | 0.13 | | 97.62% 77.34% | 1.27 | 0.0010 | |5 | 1400 | 00:09:24 | 0.6577 | 100.00% | | 76.38% | 0.72 | 0.0010 | | 6 | 1600 | 00:10:46 | 0.6951 | 100.00% | | 90.62% | 0.94 | 0.0010 | | 7 | 1800 | 00:12:08 | 0.5341 | 96.08% | 0.09 | 86.72% | 0.53 | 0.0010 | | 7 | 2000 | 00:13:26 | 0.3333 | 100.00% | 0.12 | 94.53% | 0.61 | 0.0010 | | 7 | 2065 | 00:13:52 | 1.0564 | 100.00% | | 71.09% | 1.23 | 0.0010 | |=============================================================================================================================================| Detector training complete. *******************************************************************

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

Img = imread(“highway.png”);

运行探测器。

[bbox, score, label] = detect(检测器,img);

显示检测结果。

detectedImg = insertShape(img,“矩形”, bbox);图imshow (detectedImg)

输入参数

全部折叠

标记的基本值,指定为数据存储或表。

每个包围框的格式必须为[xy宽度高度].

  • 如果使用数据存储,则必须设置数据,以便使用而且readall函数返回带有两列或三列的单元格数组或表。当输出包含两列时,第一列必须包含边界框,第二列必须包含标签,{盒子标签}。当输出包含三列时,第二列必须包含边界框,第三列必须包含标签。在本例中,第一列可以包含任何类型的数据。例如,第一列可以包含图像或点云数据。

    数据 盒子 标签
    第一列可以包含数据,例如点云数据或图像。 第二列必须是单元格数组,包含形式为[的包围框的-by-5矩阵x中心y中心宽度高度偏航].向量表示每个图像中对象的包围框的位置和大小。 第三列必须是单元格数组,包含-by-1包含对象类名的分类向量。数据存储返回的所有类别数据必须包含相同的类别。

    有关更多信息,请参见用于深度学习的数据存储(深度学习工具箱)

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

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

  • 当您将网络指定为SeriesNetwork,一个数组对象,或通过网络名称,该函数通过添加区域建议网络(RPN)、ROI最大池化层和新的分类和回归层来支持对象检测,将网络转换为Faster R-CNN网络。金宝app此外,GridSizeROI最大池化层属性设置为网络中最后一个最大池化层的输出大小。

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

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

  • 当您将网络指定为SeriesNetwork对象,数组,或由网络名称,其他卷积和全连接层的权重初始化为“narrow-normal”.该函数添加这些权重来创建网络。

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

    网络名称 特征提取层名称 ROI池化层OutputSize 描述
    alexnet(深度学习工具箱) “relu5” (6 - 6) 最后一个最大池化层被ROI最大池化层取代
    vgg16(深度学习工具箱) “relu5_3” 7 [7]
    vgg19(深度学习工具箱) “relu5_4”
    squeezenet(深度学习工具箱) “fire5-concat” (14日14)
    resnet18(深度学习工具箱) “res4b_relu” 在特征提取层之后插入ROI池化层。
    resnet50(深度学习工具箱) “activation_40_relu”
    resnet101(深度学习工具箱) “res4b22_relu”
    googlenet(深度学习工具箱) “inception_4d-output”
    mobilenetv2(深度学习工具箱) “block_13_expand_relu”
    inceptionv3(深度学习工具箱) “mixed7” 17 [17]
    inceptionresnetv2(深度学习工具箱) “block17_20_ac”

  • LayerGraph对象必须是有效的Faster R-CNN对象检测网络。您可以使用fasterRCNNLayers函数创建LayerGraph目的是训练一个定制的Faster R-CNN网络。

    提示

    如果你的网络是一个DAGNetwork,使用layerGraph(深度学习工具箱)函数将网络转换为LayerGraph对象。的描述创建一个自定义的Faster R-CNN网络创建更快的R-CNN对象检测网络的例子。

有关创建Faster R-CNN网络的详细信息,请参见R-CNN入门,快R-CNN,快R-CNN

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

请注意

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

  • 属性时,不支持数据存储输入金宝appDispatchInBackground培训选项真正的

此外,如果使用组合数据存储输入,该函数不支持以下训练选项:金宝app

  • “一次”而且“every-epoch”'的值洗牌的参数

  • “平行”而且“multi-gpu”'的值ExecutionEnvironment的参数

保存的检测器检查点,指定为fasterRCNNObjectDetector对象。要在每个纪元之后保存检测器,请设置“CheckpointPath”属性时,trainingOptions函数。建议在每个纪元之后保存一个检查点,因为网络训练可能需要几个小时。

要为以前训练过的检测器加载检查点,请从检查点路径加载mat文件。例如,如果“CheckpointPath”的属性选项“/ tmp”,加载一个检查点mat文件使用:

数据=负载(“/ tmp / faster_rcnn_checkpoint__105__2016_11_18__14_25_08.mat”);

mat文件的名称包括迭代号和指示探测器检查点保存时间的时间戳。探测器保存在探测器文件的变量。将此文件传递回trainFasterRCNNObjectDetector功能:

frcnn = trainfastrcnnobjectdetector (stopSigns,...data.detector选项);

先前训练的Faster R-CNN对象检测器,指定为fasterRCNNObjectDetector对象。使用此语法可以使用额外的训练数据继续训练检测器,或者执行更多的训练迭代以提高检测器的精度。

名称-值对参数

的可选逗号分隔对名称,值参数。的名字参数名称和价值对应的值。的名字必须出现在引号内。您可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家

例子:“PositiveOverlapRange”,(0.75 - 1)

训练方法,指定为逗号分隔的对,由'TrainingMethod“端到端”“四步”

  • “端到端”-同时训练区域建议和区域分类子网络。

  • “四步”-分四步分别训练区域建议和区域分类子网络。

正训练样本的包围框重叠比例,指定为逗号分隔的对,由“PositiveOverlapRange”和以下其中之一:

  • 为所有四个训练阶段指定相同重叠比的2元素向量。

  • 2 × 2矩阵,仅用于端到端训练方法。矩阵的第一行定义区域提议子网络的重叠比。第二行定义区域分类子网的重叠比。

  • 4 × 2矩阵,仅用于四步训练方法。矩阵的每一行都指定了四个训练阶段的重叠比。

取值范围为[0,1]。在指定范围内与地面真值边界框重叠的区域建议作为正训练样本。

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

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


一个而且B是边界框。

负训练样本的包围框重叠率,指定为逗号分隔的对,由'NegativeOverlapRange和下面的其中一个。

  • 一个指定重叠比的2元素向量。

  • 2 × 2矩阵,仅用于端到端训练方法。矩阵的第一行定义区域提议子网络的重叠比。第二行定义区域分类子网的重叠比。

  • 4 × 2矩阵,仅用于四步训练方法。矩阵的每一行都指定了四个训练阶段的重叠比。

取值范围为[0,1]。在指定范围内与ground truth边界盒重叠的区域建议作为负训练样本。

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

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


一个而且B是边界框。

用于生成训练样本的最强区域建议的最大数目,指定为逗号分隔的对,由“NumStrongestRegions”一个正整数。降低这个值可以加快处理时间,但代价是训练的准确性。若要使用所有区域建议,请将此值设置为

建议从每个训练图像中随机采样的区域数量,指定为整数、1 × 2向量或1 × 4向量。使用1 × 2向量进行端到端训练。使用1 × 4向量进行四步训练。减少要采样的区域数量,以减少内存使用并加快训练速度。降低该值也会降低训练精度。

当你设定TrainingMethod“端到端”,区域提议的数量可以设置为1 × 2的向量。向量的第一个元素必须是区域建议子网的采样区域数。第二个元素必须是为区域分类子网采样的区域数量。

当你设定TrainingMethod“四步”,区域提议的数量可以设置为1 × 4的向量。的th元素的要采样的区域数目th培训步骤。

最小图像维度(宽度或高度)的长度,指定为逗号分隔的对,由“SmallestImageDimension”一个正整数。训练图像调整大小,使最短维度的长度等于指定的整数。默认情况下,训练图像不会调整大小。调整训练图像的大小有助于减少训练图像较大时的计算成本和内存使用。典型值范围为400-600像素。

依赖关系

  • SmallestImageDimension属性仅支持表输入训金宝app练数据。要调整数据存储输入的输入数据的大小,请使用变换函数。

用于构建区域建议网络(RPN)的锚盒金字塔的最小锚盒大小,指定为由逗号分隔的对组成“MinBoxSizes”和一个2矩阵。每行定义[高度宽度]一个锚箱。

默认的“汽车”设置使用地面真实数据中每个类的包围框的最小大小和中位数长宽比。为了删除冗余的框大小,该函数保留相交-并集值小于或等于0.5的框。此行为确保使用最少数量的锚框来覆盖所有对象大小和纵横比。

时,锚框计算基于MinBoxSizes,th锚箱尺寸为:

round(MinBoxSizes(i,:) .* BoxPyramidScale,^ (0:NumBoxPyramidLevels-1)')

依赖关系

  • 如果指定网络为,则不能使用此属性LayerGraph对象或从探测器检查点恢复训练。

  • MinBoxSizes属性仅支持表格格式金宝app的输入训练。若要估计数据存储输入的锚定框,请使用estimateAnchorBoxes函数。

锚盒金字塔比例因子用于依次增大锚盒大小,指定为逗号分隔对组成“BoxPyramidScale”一个标量。建议取值范围为1 ~ 2。增大此值可获得更快的结果。减小数值以获得更高的精度。

依赖关系

  • BoxPyramidScale属性仅支持以表格格金宝app式输入训练数据。若要估计数据存储输入的锚定框,请使用estimateAnchorBoxes函数。

锚框金字塔中的层数,指定为由逗号分隔的对组成“NumBoxPyramidLevels”一个标量。选择一个值,确保多尺度锚框的大小与地面真实数据中对象的大小相当。

默认设置“汽车”根据地面真实数据中对象的大小选择层数。选择的层数覆盖对象大小的范围。

依赖关系

  • NumBoxPyramidLevels属性仅支持以表格格金宝app式输入训练数据。若要估计数据存储输入的锚定框,请使用estimateAnchorBoxes函数。

训练期间的冻结批归一化,指定为逗号分隔的对,由'FreezeBatchNormalization”,真正的.该值表示在训练时是否将输入层冻结到网络。将此值设置为真正的如果你训练的是小批量的。小批量会导致批均值和方差的差估计,而这是有效的批归一化所必需的。

如果您没有为'指定值FreezeBatchNormalization,函数将属性设置为:

  • 真正的如果'MiniBatchSize的名称-值参数trainingOptions(深度学习工具箱)函数小于8

  • 如果'MiniBatchSize的名称-值参数trainingOptions(深度学习工具箱)函数大于等于8

您必须为'指定一个值FreezeBatchNormalization来覆盖此默认行为。

输出参数

全部折叠

训练更快的R-CNN对象检测器,返回为fasterRCNNObjectDetector对象。

训练进度信息,作为包含八个字段的结构数组返回。每个领域对应一个训练阶段。

  • TrainingLoss-每次迭代的训练损失为均方误差(MSE),计算为定位误差、置信度损失和分类损失的总和。有关训练损失函数的更多信息,请参见培训损失

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

  • TrainingRMSE-训练均方根误差(RMSE)是由每次迭代的训练损失计算出来的RMSE。

  • BaseLearnRate-每次迭代的学习率。

  • ValidationLoss-每次迭代的验证损失。

  • ValidationAccuracy-每个迭代的验证精度。

  • ValidationRMSE-在每个迭代中验证RMSE。

  • FinalValidationLoss-培训结束时的最终验证损失。

  • FinalValidationRMSE-在培训结束时最终验证RMSE。

每个字段是一个数字向量,每次训练迭代有一个元素。在特定迭代中未计算的值被赋值为.结构体包含ValidationLossValidationAccuracyValidationRMSEFinalValidationLoss,FinalValidationRMSE仅当选项指定验证数据。

提示

  • 为了加速训练的数据预处理,trainFastRCNNObjectDetector根据并行首选项设置自动创建和使用并行池。有关设置这些首选项的详细信息,请参见并行偏好设置.使用并行计算首选项需要“并行计算工具箱”。

  • VGG-16、VGG-19、ResNet-101和Inception-ResNet-v2是大型号。使用大图像进行训练可能会产生“内存不足”错误。要减轻这些错误,请尝试以下一个或多个选项:

  • 该函数支持迁移学习。金宝app当你输入网络按姓名,如“resnet50”,则该函数自动将网络转换为基于预训练的有效Faster R-CNN网络模型resnet50(深度学习工具箱)模型。方法手动指定自定义的Faster R-CNN网络LayerGraph(深度学习工具箱)从预训练的DAG网络中提取。详情请参见创建更快的R-CNN对象检测网络

  • 该表描述了如何将每个已命名网络转换为Faster R-CNN网络。特征提取层名称指定ROI池化层处理的层。ROI输出大小指定ROI池化层输出的特征映射的大小。

    网络名称 特征提取层名称 ROI池化层OutputSize 描述
    alexnet(深度学习工具箱) “relu5” (6 - 6) 最后一个最大池化层被ROI最大池化层取代
    vgg16(深度学习工具箱) “relu5_3” 7 [7]
    vgg19(深度学习工具箱) “relu5_4”
    squeezenet(深度学习工具箱) “fire5-concat” (14日14)
    resnet18(深度学习工具箱) “res4b_relu” 在特征提取层之后插入ROI池化层。
    resnet50(深度学习工具箱) “activation_40_relu”
    resnet101(深度学习工具箱) “res4b22_relu”
    googlenet(深度学习工具箱) “inception_4d-output”
    mobilenetv2(深度学习工具箱) “block_13_expand_relu”
    inceptionv3(深度学习工具箱) “mixed7” 17 [17]
    inceptionresnetv2(深度学习工具箱) “block17_20_ac”

    有关如何修改网络转换为Faster R-CNN网络的信息,请参见设计一个R-CNN,快速R-CNN和一个更快R-CNN模型

  • 在训练过程中,从训练图像中处理多个图像区域,每个图像的图像区域数量由NumRegionsToSample财产。的PositiveOverlapRange而且NegativeOverlapRange属性控制用于训练的图像区域。积极训练样本是那些与地面真理盒重叠0.6到1.0的样本,由边界盒相交-联合度量(IoU)衡量。负训练样本是那些重叠0到0.3的样本。通过在验证集上测试训练好的检测器来选择这些属性的值。

    重叠值 描述
    PositiveOverlapRange设置为(0.6 - 1) 正面训练样本被设置为与地面真相盒重叠0.6到1.0的样本,由包围盒IoU度量来衡量。
    NegativeOverlapRange设置为0.3 [0] 负训练样本设置为与ground truth box重叠0 ~ 0.3的样本。

    如果你设置PositiveOverlapRange(0.6 - 1),则函数将正训练样本设置为与地面真值盒重叠0.6 ~ 1.0的样本,由包围盒IoU度量度量。如果你设置NegativeOverlapRange0.3 [0],则函数将负训练样本设置为与ground truth box重叠的样本0 ~ 0.3。

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

兼容性的考虑

全部展开

R2019b的行为发生了变化

参考文献

[1]任,S., K. He, R. Girschick和J. Sun。更快的R-CNN:使用区域提议网络实现实时目标检测神经信息处理系统研究进展.2015年第28卷。

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

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

齐特尼克,c.l., P. Dollar。边框:从边定位对象建议。计算机视觉- eccv 2014, 391 - 405。苏黎世,瑞士:ECCV, 2014。

扩展功能

在R2017a中引入