主要内容

trainSSDObjectDetector

训练SSD深度学习对象检测器

描述

训练一个探测器

例子

trainedDetector= trainSSDObjectDetector (trainingData探测器选项使用深度学习训练单发多盒检测器(SSD)。您可以训练SSD检测器检测多个对象类。使用此语法可以训练未经训练或预训练的SSD对象检测网络。您还可以使用此语法使用额外的训练数据对网络进行微调,或者执行更多的训练迭代以提高检测器的精度。

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

trainedDetector= trainSSDObjectDetector (trainingData选项训练指定为a的SSD对象检测器LayerGraph(深度学习工具箱)对象。不推荐使用此语法,并将在未来的版本中删除。

培训检测器

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

额外的属性

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

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

例子

全部折叠

这个例子展示了如何在车辆数据集上训练SSD对象检测器,并用于检测图像中的车辆。

将训练数据加载到工作区中。

数据=负载(“vehicleTrainingData.mat”);trainingData = data.vehicleTrainingData;

指定存储训练样本的目录。为训练数据中的文件名添加全路径。

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

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

imds = imageDatastore(trainingData.imageFilename);

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

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

合并数据存储。

Ds = combine(imds,blds);

指定用于创建SSD对象检测器的基本网络。

baseNetwork = layerGraph(resnet50);

指定要检测的类的名称。

classNames = {“汽车”};

指定用于训练网络的锚框。

锚定箱= {[30 60;60 30;50 50;100 100),...[40 70;70 40;60 60;120 120]};

指定连接到检测子网的特征提取层的名称。

layersToConnect = [“activation_22_relu”“activation_40_relu”];

创建SSD对象检测器ssdObjectDetector函数。

检测器= ssdObjectDetector(baseNetwork,classNames,anchorBoxes,...DetectionNetworkSource = layersToConnect);

指定培训选项。

选项= trainingOptions(“个”...InitialLearnRate = 0.001,...MiniBatchSize = 16,...Verbose = true,...MaxEpochs = 30,...洗牌=“从不”...VerboseFrequency = 10);

训练SSD对象检测器。

[detector,info] = trainSSDObjectDetector(ds,detector,options);
************************************************************************* 培训一个SSD对象探测器以下对象类:*车辆培训单CPU。初始化输入数据规范化。|=======================================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch | Mini-batch |基地学习  | | | | ( hh: mm: ss) | | |精度损失RMSE |率  | |=======================================================================================================| | 1 | 1 | 00:00:04 | 42.7980 | 39.23% | 2.10 | 0.0010 | | 1 | 10 | 00:00:38 | 3.1443 | 99.48% | 1.48 | 0.0010 | | 2 | 20 | 00:01:22 | 2.4110 |30 99.45% | 1.16 | 0.0010 | | 2 | | 00:01:58 | 3.6181 | 99.33% | 1.18 | 0.0010 | | 3 | 40 | 00:02:40 | 2.0148 | 99.48% | 0.88 | 0.0010 | | 3 | 50 | 00:03:17 | 3.9796 | 99.42% | 0.75 | 0.0010 | | 4 | 60 | 00:04:00 | 4.0148 | 99.60% | 0.69 | 0.0010 | | 70 | | 00:04:36 | 1.6519 | 99.50% | 0.86 | 0.0010 | | 80 | | 00:05:17 | 1.8625 | 99.63% | 0.84 | 0.0010 | | 90 | | 00:05:51 | 1.3560 | 99.65% | 0.73 | 0.0010 | | 6 | 100 | 00:06:32 | 1.2340 | 99.82% | 0.64 | 0.0010 | | 110 | | 00:07:13 |1.6821 99.59% | | 0.71 | 0.0010 | | 120 | | 00:07:48 | 1.4340 | 99.86% | 0.63 | 0.0010 | | 130 | | 00:08:31 | 1.1701 | 99.90% | 0.53 | 0.0010 | | 140 | | 00:09:07 | 1.0795 | 99.86% | 0.58 | 0.0010 | | 150 | | 00:09:48 | 1.0765 | 99.84% | 0.66 | 0.0010 | | 160 | | 00:10:22 | 0.9774 | 99.88% | 0.55 | 0.0010 | | 170 | | 00:11:03 | 0.7405 | 99.87% | 0.51 | 0.0010 | | 180 | | 00:11:37 | 0.8487 | 0.57 | 0.0010 | | 99.83%|=======================================================================================================| 培训完成:马克思时代完成。探测器训练完毕。*************************************************************************

通过检查每次迭代的训练损失来验证训练的准确性。

图表(info.TrainingLoss)网格包含(“迭代次数”) ylabel (“每次迭代的训练损失”
SSD训练损耗

读取一个测试图像。

Img = imread(“ssdTestDetect.png”);

使用训练好的SSD对象检测器检测测试图像中的车辆。

[bboxes,scores] = detect(检测器,img);

显示检测结果。

如果(~isempty(bboxes)) img = insertObjectAnnotation(img,“矩形”bboxes,分数);结束图imshow (img)
SSD输出

输入参数

全部折叠

带标签的真实图像,指定为数据存储或表。

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

    数据 盒子 标签

    第一列必须是图像。

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

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

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

未训练或预训练的SSD对象检测器,指定为ssdObjectDetector对象。

未训练或预训练的SSD网络,指定为aLayerGraph对象。该层图包含了SSD多盒网络的体系结构。

培训选项,指定为TrainingOptionsSGDMTrainingOptionsRMSProp,或TrainingOptionsADAM对象返回的trainingOptions(深度学习工具箱)函数。要指定用于网络训练的求解器名称和其他选项,请使用trainingOptions(深度学习工具箱)函数。

请注意

trainSSDObjectDetector函数不支持以下训练选项:金宝app

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

  • 不支持数据存储输入金宝app洗牌培训选项设置为“从不”ExecutionEnvironment培训选项为“multi-gpu”.有关使用数据存储进行并行训练的详细信息,请参见使用数据存储进行并行训练和后台调度(深度学习工具箱)

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

要为以前训练过的检测器加载检查点,请从检查点路径加载mat文件。例如,如果CheckpointPath属性指定的对象的选项' / checkpath ',您可以使用此代码加载检查点mat文件。

数据=负载(“/ checkpath / ssd_checkpoint__216__2018_11_16__13_34_30.mat”);Checkpoint = data.detector;

mat文件的名称包括迭代号和保存检测器检查点的时间戳。探测器保存在探测器文件的变量。将这个文件传递回trainSSDObjectDetector函数:

ssdDetector = trainSSDObjectDetector(trainingData,checkpoint,options);

名称-值参数

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

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

例子:“PositiveOverlapRange”(0.5 - 1)设置垂直轴方向为向上。

之间的包围框重叠率范围0而且1,指定为两元素向量。在指定范围内与地面真值包围盒重叠的锚盒作为正训练样本。该函数使用两个边界框之间的交集-并集来计算重叠比。

之间的包围框重叠率范围0而且1,指定为两元素向量。在指定范围内与地面真值包围盒重叠的锚盒作为负训练样本。该函数使用两个边界框之间的交集-并集来计算重叠比。

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

培训期间监测的信息:

  • 每次迭代的训练损失。

  • 每次迭代的训练精度。

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

  • 每次迭代的学习率。

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

  • 每次迭代中的验证损失。

  • 每个迭代的验证精度。

  • 每次迭代验证RMSE。

输出参数

全部折叠

训练SSD对象检测器,返回为ssdObjectDetector对象。您可以训练SSD对象检测器检测多个对象类。

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

  • TrainingLoss-每次迭代的训练损失计算为回归损失与分类损失之和。为了计算回归损失,用trainSSDObjectDetector函数采用平滑L1损失函数。计算分类损失trainSSDObjectDetector函数使用了软最大和二进制交叉熵损失函数。

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

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

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

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

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

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

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

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

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

参考文献

[1]刘伟文,安格洛夫,D.尔汉,C.塞格迪,S.里德,C.傅,A.C.伯格。“SSD:单次多盒探测器。”欧洲计算机视觉会议(ECCV),施普林格Verlag, 2016

版本历史

R2020a中引入

全部展开