主要内容

trainFastRCNNObjectDetector

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

描述

训练一个探测器

例子

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

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

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

培训检测器

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

微调检测器

trainedDetector= trainFastRCNNObjectDetector (trainingData探测器选项继续用额外的训练数据训练检测器或执行更多的训练迭代以提高检测器的精度。

海关区域建议

trainedDetector= trainFastRCNNObjectDetector (___“RegionProposalFcn”,proposalFcn可选地训练自定义区域提议函数,proposalFcn,使用前面的任何输入。如果未指定建议函数,则该函数使用边缘框的变体[2]算法。

额外的属性

trainedDetector= trainFastRCNNObjectDetector (___名称,值使用一个或多个指定的其他选项名称,值对参数。

例子

全部折叠

加载训练数据。

数据=负载(“rcnnStopSigns.mat”“stopSigns”“fastRCNNLayers”);stopSigns = data.stopSigns;fastRCNNLayers = data.fastRCNNLayers;

为镜像文件添加全路径。

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

随机打乱数据进行训练。

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

使用表中的文件创建一个imageDatastore。

imds = imageDatastore(stopSigns.imageFilename);

使用表中的标签列创建boxLabelDatastore。

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

合并数据存储。

Ds = combine(imds, blds);

停止标志训练图像大小不同。对数据进行预处理,将图像和方框调整为预定义的大小。

ds = transform(ds,@(data)preprocessData(data,[920 968 3]));

设置网络培训选项。

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

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

frcnn = trainFastRCNNObjectDetector(ds, fastRCNNLayers, options,...“NegativeOverlapRange”, [0 0.1],...“PositiveOverlapRange”, [0.7 1]);
******************************************************************* 训练快速R-CNN对象探测器以下对象类:* stopSign——>从训练数据存储中提取区域建议……。单GPU训练。|=======================================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch | Mini-batch |基地学习  | | | | ( hh: mm: ss) | | |精度损失RMSE |率  | |=======================================================================================================| | 1 | 1 | 00:00:29 | 0.3787 | 93.59% | 0.96 | 0.0010 | | 10 | | 00:05:14 | 0.3032 | 0.95 | 0.0010 | | 98.52%|=======================================================================================================| 检测器训练完成。*******************************************************************

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

Img = imread(“stopSignTest.jpg”);

运行探测器。

[bbox, score, label] = detect(frcnn, img);

显示检测结果。

detectedImg = insertObjectAnnotation(img,“矩形”bbox,分数);图imshow (detectedImg)

金宝app支持功能

函数data = preprocessData(data,targetSize)将图像和包围框的大小调整为targetSize。scale = targetSize(1:2)。{1} /大小(数据,[1 - 2]);数据{1}= imresize(数据{1},targetSize(1:2));Bboxes = round(数据{2});数据{2}= bboxresize(bboxes,scale);结束

输入参数

全部折叠

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

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

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

    数据 盒子 标签

    第一列必须是图像。

    形式为[的包围框的-by-4矩阵xy宽度高度],其中[x,y]表示边界框的左上角坐标。

    第三列必须是单元格数组,包含-by-1包含对象类名的分类向量。数据存储返回的所有类别数据必须包含相同的类别。

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

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

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

  • 当您将网络指定为SeriesNetwork,一个数组对象,或通过网络名称,通过添加ROI最大池化层,以及新的分类和回归层来支持对象检测,网络自动转换为Fast 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对象必须是一个有效的快速R-CNN对象检测网络。你也可以用aLayerGraph对象训练自定义快速R-CNN网络。

    提示

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

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

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

请注意

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

  • trainingOptions“一次”而且“every-epoch”洗牌组合数据存储输入不支持选项。金宝app

  • trainingOptions“平行”而且“multi-gpu”ExecutionEnvironment当使用组合数据存储输入时,不支持金宝app选项。

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

保存的检测器检查点,指定为fastRCNNObjectDetector对象。若要在训练期间定期保存检测器检查点,请指定CheckpointPath.若要控制保存检查点的频率,请参见CheckPointFrequency而且CheckPointFrequencyUnit培训选项。

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

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

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

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

先前训练的快速R-CNN对象检测器,指定为fastRCNNObjectDetector对象。

区域提议方法,指定为函数句柄。如果未指定区域建议函数,则该函数将实现EdgeBoxes的变体[2]算法。函数必须具有如下形式:

[bboxes,scores] = proposalFcn(I)

输入,对象中定义的图像trainingData表格函数必须返回矩形框,bboxes,在4数组。每行bboxes包含一个四元素向量,(x, y,宽度、高度).这个向量以像素为单位指定边界框的左上角和大小。类中的每个包围框也必须返回一个分数1的向量。得分越高,表示边界框更有可能包含一个对象。这些分数是用来选择最强的n地区,n的值定义NumStrongestRegions

依赖关系

如果没有指定自定义建议函数,并且使用表作为输入训练数据,则该函数使用Edge Boxes算法的变体。如果使用数据存储为多通道图像输入训练数据,则必须指定自定义区域建议函数。

名称-值参数

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

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

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

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

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

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


一个而且B是边界框。

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

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

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


一个而且B是边界框。

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

从每个训练图像中随机采样的区域建议数,由整数指定。减少要采样的区域数量,以减少内存使用和加速训练。降低该值也会降低训练精度。

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

依赖关系

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

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

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

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

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

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

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

培训期间监测的信息:

  • 每次迭代的训练损失。

  • 每次迭代的训练精度。

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

  • 每次迭代的学习率。

输出参数

全部折叠

训练快速R-CNN对象检测器,返回作为fastRCNNObjectDetector对象。

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

  • 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”,则该函数自动将网络转换为基于预训练的有效Fast R-CNN网络模型resnet50(深度学习工具箱)模型。方法手动指定自定义Fast R-CNN网络LayerGraph(深度学习工具箱)从预训练的DAG网络中提取。详情请参见创建快速R-CNN对象检测网络

  • 该表描述了如何将每个命名网络转换为Fast 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”

    若要修改网络并将其转换为Fast R-CNN网络,请参见设计一个R-CNN,快速R-CNN和一个更快R-CNN模型

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

参考文献

Girshick, Ross。“快速R-CNN。”IEEE计算机视觉国际会议论文集.2015.

齐特尼克,c·劳伦斯,彼得·杜乐。“边框:从边定位对象建议。”计算机视觉- eccv 2014.施普林格国际出版,2014,第391-405页。

扩展功能

版本历史

在R2017a中引入