主要内容

trainYOLOv2ObjectDetector

训练YOLO v2对象检测器

描述

训练一个探测器

例子

探测器= trainYOLOv2ObjectDetector (trainingDatalgraph选项返回一个使用输入指定的版本2 (YOLO v2)网络架构训练的对象检测器lgraph.的选项输入为检测网络指定训练参数。

例子

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

培训检测器

例子

探测器= trainYOLOv2ObjectDetector (trainingData检查点选项从保存的检测器检查点恢复训练。

你可以使用这个语法:

  • 增加更多的训练数据,继续训练。

  • 通过增加最大迭代次数来提高训练精度。

微调检测器

探测器= trainYOLOv2ObjectDetector (trainingData探测器选项继续训练YOLO v2对象检测器。使用此语法微调检测器。

多尺度的培训

探测器= trainYOLOv2ObjectDetector (___“TrainingImageSize”,trainingSizes除了使用上述语法中的输入参数外,还使用名称-值对指定用于多尺度训练的图像大小。

额外的属性

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

例子

全部折叠

将车辆检测的训练数据加载到工作区中。

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

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

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

随机打乱数据进行训练。

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

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

imds = imageDatastore(trainingData.imageFilename);

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

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

合并数据存储。

Ds = combine(imds, blds);

加载一个预先初始化的YOLO v2对象检测网络。

净=负荷(“yolov2VehicleDetector.mat”);Lgraph = net.lgraph
lgraph = LayerGraph with properties: Layers: [25×1 nnet.cnn.layer.Layer] Connections: [24×2 table] InputNames: {'input'} OutputNames: {'yolov2OutputLayer'}

检查YOLO v2网络中的层及其属性。您还可以按照中给出的步骤创建YOLO v2网络创建YOLO v2对象检测网络

lgraph。层
ans = 25x1带有图层的图层数组:1的输入图像输入128 x128x3图片2的conv_1卷积16 3 x3的隆起与步幅[1]和填充[1 1 1 1]3“BN1”批量标准化批量标准化4的relu_1 ReLU ReLU 5“maxpool1”马克斯池2 x2马克斯池步(2 - 2)和填充[0 0 0 0]6‘conv_2卷积32 3 x3的隆起与步幅[1]和填充[1 1 1 1]7“BN2”批量标准化批量标准化8 ' relu_2 ReLU ReLU 9“maxpool2”马克斯池2 x2马克斯池步(2 - 2)和填充[0 00 0] 10 conv_3卷积64 3 x3的隆起与步幅[1]和填充[1 1 1 1]11“BN3”批量标准化批量标准化12的relu_3 ReLU ReLU 13“maxpool3”马克斯池2 x2马克斯池步(2 - 2)和填充[0 0 0 0]14 conv_4卷积128 3 x3的隆起与步幅[1]和填充[1 1 1 1]15“BN4”批量标准化批量标准化16的relu_4 ReLU ReLU 17 yolov2Conv1卷积128 3 x3的隆起与步幅[1]和填充18“相同”'yolov2Relu1' ReLU ReLU 20 'yolov2Conv2' Convolution 128 3x3 convolutions with stride [1 1] and padding 'same' 21 'yolov2Batch2' Batch Normalization Batch Normalization 22 'yolov2Relu2' ReLU ReLU 23 'yolov2ClassConv' Convolution 24 1x1 convolutions with stride [1 1] and padding [0 0 0 0 0] 24 'yolov2Transform' YOLO v2Transform Layer。YOLO v2转换层与4锚。25 'yolov2OutputLayer' YOLO v2输出YOLO v2输出4个锚。

配置网络培训选项。

选项= trainingOptions(“个”...“InitialLearnRate”, 0.001,...“详细”,真的,...“MiniBatchSize”, 16岁,...“MaxEpochs”30岁的...“洗牌”“永远”...“VerboseFrequency”30岁的...“CheckpointPath”, tempdir);

培训YOLO v2网络。

[detector,info] = trainYOLOv2ObjectDetector(ds,lgraph,options);
************************************************************************* 培训YOLO v2意思对象探测器以下对象类:*车辆培训单CPU。|========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习  | | | | ( hh: mm: ss) | RMSE | |率损失  | |========================================================================================| | 1 | 1 | 00:00:01 | 7.13 | 50.8 | 0.0010 | | 2 | 30 | 00:00:14 | 1.35 | 1.8 | 0.0010 | | 4 | 60 | 00:00:27 | 1.13 | 1.3 | 0.0010 | | 90 | | 00:00:39 | 0.64 | 0.4 | 0.0010 | | 120 | | 00:00:51 |0.65 | 0.4 | 0.0010 | | 150 | | 00:01:04 | 0.72 | 0.5 | 0.0010 | | 180 | | 00:01:16 | 0.52 | 0.3 | 0.0010 | | 210 | | 00:01:28 | 0.45 | 0.2 | 0.0010 | | 240 | | 00:01:41 | 0.61 | 0.4 | 0.0010 | | 270 | | 00:01:52 | 0.43 | 0.2 | 0.0010 | | 300 | | 00:02:05 | 0.42 | 0.2 | 0.0010 | | 19 | 330 | 00:02:17 | 0.52 | 0.3 | 0.0010 | | 360 | | 00:02:29 | 0.43 | 0.2 | 0.0010 | | 22 | 390 | 00:02:42 | 0.43 | 0.2 | 0.0010 | | 24 | 420 | 00:02:54 | 0.59 | 0.4 | 0.0010 | | 25 | 450 |00:03:06 | 0.61 | 0.4 | 0.0010 | | 480 | | 27 00:03:18 | 0.65 | 0.4 | 0.0010 | | 510 | | 29日00:03:31 | 0.48 | 0.2 | 0.0010 | | 540 | | 00:03:42 | 0.34 | 0.1 | 0.0010  | |========================================================================================| 检测器训练完成。*************************************************************************

检查检测器的性能。

探测器
检测器= yolov2ObjectDetector with properties: ModelName: 'vehicle'网络:[1×1 DAGNetwork] TrainingImageSize:[128 128]锚箱:[4×2 double] ClassNames:车辆

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

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

将一个测试映像读入工作区。

Img = imread(“detectcars.png”);

在测试图像上运行训练过的YOLO v2对象检测器进行车辆检测。

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

显示检测结果。

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

输入参数

全部折叠

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

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

    数据 盒子 标签

    第一列必须是图像。

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

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

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

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

请注意

当使用表指定训练数据时trainYOLOv2ObjectDetector函数检查这些条件

  • 边界框的值必须为整数。否则,函数自动将每个非整数值舍入为最接近的整数。

  • 边界框不能为空,必须在图像区域内。在训练网络时,该函数忽略空的边界框和部分或完全位于图像区域之外的边界框。

层图,指定为aLayerGraph对象。该层图包含YOLO v2网络的体系结构。方法创建此网络yolov2Layers函数。或者,您也可以使用yolov2TransformLayerspaceToDepthLayer,yolov2OutputLayer功能。有关创建自定义YOLO v2网络的详细信息,请参见设计一个YOLO v2检测网络

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

请注意

trainYOLOv2ObjectDetector函数不支持以下训练选项:

  • trainingOptions洗牌值,“一次”而且“every-epoch”使用数据存储输入时不支持。

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

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

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

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

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

yoloDetector = trainYOLOv2ObjectDetector(trainingData,checkpoint,options);

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

用于多尺度训练的图像大小集,指定为-by-2矩阵,其中每一行的形式为[高度宽度].对于每个训练时期,输入的训练图像被随机调整为一个在此集合中指定的图像大小。

如果没有指定trainingSizes,函数将此值设置为YOLO v2网络图像输入层中的大小。网络将所有训练图像调整为这个值。

请注意

输入trainingSizes的图像输入层中为多尺度训练指定的值必须大于或等于输入大小lgraph输入参数。

高度而且宽度输入值trainingSizes指定的,必须能被高度和宽度整除blockSize的输入参数。spaceToDepthLayer函数。

名称-值参数

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

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

例子:“ExperimentManager”“没有”设置“ExperimentManager”“没有”

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

培训期间监测的信息:

  • 每次迭代的训练损失。

  • 每次迭代的训练精度。

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

  • 每次迭代的学习率。

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

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

  • 每个迭代的验证精度。

  • 每次迭代验证RMSE。

输出参数

全部折叠

训练YOLO v2对象检测器,返回为yolov2ObjectDetector对象。您可以训练YOLO v2对象检测器来检测多个对象类。

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

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

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

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

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

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

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

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

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

更多关于

全部折叠

数据预处理

默认情况下,trainYOLOv2ObjectDetector函数对训练图像进行预处理:

  • 调整输入图像的大小以匹配网络的输入大小。

  • 将输入图像的像素值归一化到范围[0,1]。

当您使用表指定训练数据时,trainYOLOv2ObjectDetector函数为预处理执行数据增强。该函数通过以下方式扩充输入数据集:

  • 横向反映训练数据。水平翻转训练数据中每个图像的概率为0.5。

  • 对训练数据进行统一缩放(缩放),缩放因子从范围[1,1.1]的连续均匀分布中随机选取。

  • 随机颜色抖动的亮度,色相,饱和度和对比度。

通过使用数据存储指定训练数据时,trainYOLOv2ObjectDetector函数不执行数据扩充。方法来增加数据存储中的训练数据变换函数,然后用增强训练数据对网络进行训练。有关如何在使用数据存储时应用增强的详细信息,请参见预处理深度学习数据(深度学习工具箱)

培训损失

在训练过程中,YOLO v2目标检测网络优化了预测边界盒与地面真相之间的MSE损失。损失函数定义为

K 1 0 年代 2 j 0 B 1 j o b j x x 2 + y y 2 + K 1 0 年代 2 j 0 B 1 j o b j w w 2 + h h 2 + K 2 0 年代 2 j 0 B 1 j o b j C C 2 + K 3. 0 年代 2 j 0 B 1 j n o o b j C C 2 + K 4 0 年代 2 1 o b j c c l 一个 年代 年代 e 年代 p c p c 2

地点:

  • 年代是网格单元格的数量。

  • B每个网格单元格中的包围框数。

  • 1 j o b j 是1,如果j网格单元格中的包围框负责探测物体。否则设置为0。网格单元负责检测对象,如果该网格单元中ground truth与边界框之间的重叠大于等于0.6。

  • 1 j n o o b j 是1,如果j网格单元格中的包围框不包含任何对象。否则设置为0。

  • 1 o b j 如果在网格单元格中检测到对象,则为1.否则设置为0。

  • K1K2K3.,K4是重量。若要调整权重,请修改LossFactors属性来创建输出层yolov2OutputLayer函数。

损失函数可以分为三个部分:

  • 本地化的损失

    损失函数的第一项和第二项包括局部化损失。它测量的误差之间的预测边界框和地面真相。计算定位损失的参数包括预测边界盒的位置、大小和地面真实值。各参数定义如下。

    • x y ,是中心j相对于网格单元格的包围框

    • x y ,是相对于网格单元的地真相的中心

    • w 而且 h 是宽与高的关系吗j网格单元格中的包围框,分别。预测包围框的大小是相对于输入图像的大小指定的。

    • w 而且 h 网格单元中地面的宽度和高度是真实的吗,分别。

    • K1是定位损失的权重。增加此值可增加边界框预测误差的权重。

  • 信心丧失

    损失函数的第三项和第四项是信心损失。第三项测量客体性(置信度评分)错误时,一个对象被检测到j网格单元格的包围框.第四项测量对象性误差时,没有检测到的对象j网格单元格的包围框.计算置信损失的参数定义如下。

    • C是自信心得分的吗j网格单元格中的包围框

    • Ĉ网格单元中ground truth的置信度是多少

    • K2在预测的包围框中检测到对象时,对象性误差的权重。的值可以调整K2从包含对象的网格单元格中衡量置信度得分。

    • K3.当在预测的包围框中未检测到对象时,对象性误差的权重。的值可以调整K3.从不包含对象的网格单元格中衡量置信度得分。

    当不包含对象的网格单元数多于包含对象的网格单元数时,置信度损失会导致训练发散。为了解决这个问题,增加for的值K2并降低for的值K3.

  • 分类损失

    损失函数的第五项是分类损失。例如,假设在网格单元中包含的预测边界框中检测到一个对象.然后,分类损失测量网格单元中每个类的类条件概率之间的平方误差.分类损失计算参数定义如下:

    • pc)为对象类的估计条件类概率c在网格单元中

    • p c 对象类的实际条件类概率是多少c在网格单元中

    • K4在网格单元格中检测到对象时用于分类错误的权重。增加此值可增加分类损失的权重。

提示

参考文献

[1]约瑟。R、S. K.迪夫瓦拉、R. B.格什克和F.阿里。“你只看一次:统一、实时的物体检测。”在IEEE计算机视觉与模式识别会议论文集(CVPR),第779-788页。拉斯维加斯,内华达州:CVPR, 2016。

[2]约瑟。R和f阿里。“YOLO 9000:更好、更快、更强。”在IEEE计算机视觉与模式识别会议论文集(CVPR)第6517-6525页。檀香山,HI: CVPR, 2017。

版本历史

在R2019a中引入

Baidu
map