主要内容

trainFasterRCNNObjectDetector

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

描述

训练一个检测器

例子

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

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

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

恢复培训检测器

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

微调探测器

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

额外的属性

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

例子

全部折叠

加载训练数据。

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

随机打乱训练数据。

rng (0);shuffledIdx = randperm(height(trainingData));trainingData = trainingData(shuffledIdx,:);

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

imds = imageDatastore(trainingData.imageFilename);

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

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

合并数据存储。

Ds = combine(imds, blds);

设置网络层。

lgraph = layerGraph(data.detector.Network);

配置培训选项。

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

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

检测器= trainFasterRCNNObjectDetector(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中心宽度高度偏航].这些向量表示每个图像中对象的边界框的位置和大小。

    如果包围框是轴向对齐的,则不需要指定偏航角。因此,边界框将被描述为形式为[的边界框的- x4矩阵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此外,GridSize属性设置为网络中最后一个最大池化层的输出大小。

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

    layers = [imageInputLayer([28 28 3]) convolution2dLayer([5 5],10) reluLayer() fulllyconnectedlayer (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目标是训练一个定制的更快R-CNN网络。

    提示

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

有关创建更快R-CNN网络的更多信息,请参见R-CNN,快速R-CNN,快速R-CNN

培训选项,由trainingOptions(深度学习工具箱)函数(需要深度学习工具箱)。若要为网络训练指定求解器和其他选项,请使用trainingOptions

请注意

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

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

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

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

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

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

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

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

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

frcnn = trainFasterRCNNObjectDetector(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”还有一个标量。选择一个值,确保多尺度锚框的大小与地面真实数据中对象的大小相当。

默认设置“汽车”根据ground truth数据中对象的大小选择层数。选择的级别数量可以涵盖对象大小的范围。

依赖关系

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

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

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

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

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

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

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

培训期间监控的信息:

  • 每次迭代的训练损失。

  • 每次迭代的训练精度。

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

  • 每次迭代的学习率。

培训时的验证信息选项输入包含验证数据:

  • 每次迭代的验证损失。

  • 每次迭代的验证精度。

  • 在每个迭代中验证RMSE。

培训结束时计算的度量:

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

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

输出参数

全部折叠

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

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

  • 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、Fast R-CNN和Faster 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] 负训练样本设置为与地面真值框重叠的样本0 ~ 0.3。

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

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

兼容性的考虑

全部展开

R2019b的行为发生了变化

参考文献

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

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

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

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

扩展功能

在R2017a中介绍