主要内容

trainYOLOv2ObjectDetector

训练YOLO v2对象检测器

描述

火车一个检测器

例子

探测器= trainYOLOv2ObjectDetector (trainingDatalgraph选项返回使用输入指定的“只看一次”版本2 (YOLO v2)网络体系结构训练的对象检测器lgraph.的选项输入为检测网络指定训练参数。

例子

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

恢复培训检测器

例子

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

你可以使用这个语法:

  • 添加更多的训练数据并继续训练。

  • 通过增加迭代的最大次数来提高训练的准确性。

微调检测器

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

多尺度的培训

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

额外的属性

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

例子

全部折叠

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

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

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

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

随机打乱训练数据。

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

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

imd = imageDatastore (trainingData.imageFilename);

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

建筑物= boxLabelDatastore (trainingData(:, 2:结束));

结合数据存储。

Ds = combine(imds, blds);

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

网=负载(“yolov2VehicleDetector.mat”);lgraph = net.lgraph
lgraph =具有属性的LayerGraph: Layers: [25×1 nnet.cnn.layer.Layer] Connections: [24×2 table] InputNames: {'input'} OutputNames: {'yolov2OutputLayer'}

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

lgraph。层
带有图层的图层数组: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“相同”'yolov2Batch1'批量归一化批量归一化19 'yolov2Relu1' ReLU ReLU 20 'yolov2Conv2' Convolution 128 3x3 convolutions with stride [1 1] and padding 'same' 21 'yolov2Batch2' Batch Normalization批量归一化22 'yolov2Relu2' ReLU ReLU 23 'yolov2ClassConv' Convolution 24 1x1 convolutions with stride [1 1] and padding [0 0 0 0] 24 'yolov2Transform' YOLO v2Transform Layer。YOLO v2转换层与4锚。25 'yolov2OutputLayer' YOLO v2Output YOLO v2输出4锚。

配置网络培训选项。

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

培训YOLO v2网络。

[探测器,信息]= trainYOLOv2ObjectDetector (ds、lgraph选项);
************************************************************************* 培训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  | |========================================================================================| 检测器训练完成。*************************************************************************

检查探测器的性能。

探测器
网络:[1×1 DAGNetwork] TrainingImageSize: [128 128] AnchorBoxes: [4×2 double] ClassNames: vehicle

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

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

将测试映像读入工作空间。

img = imread (“detectcars.png”);

在测试图像上运行训练好的YOLO v2对象检测器,用于车辆检测。

[bboxes,分数]=检测(探测器,img);

显示检测结果。

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

输入参数

全部折叠

标记的地面真实图像,指定为数据存储或表。

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

    数据 盒子 标签

    第一列必须是图像。

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

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

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

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

请注意

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

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

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

层图,指定为LayerGraph对象。层图包含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文件。

data =负载(“/ checkpath / yolov2_checkpoint__216__2018_11_16__13_34_30.mat”);检查点= data.detector;

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

yoloDetector = trainYOLOv2ObjectDetector (trainingData、检查点、期权);

以前训练过的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 ,是相对于网格单元格的ground truth的中心

    • w 而且 h 是宽度和高度的吗j网格单元格中的边界框,分别。预测边界框的大小是相对于输入图像的大小指定的。

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

    • K1为定位损失的权重。增加此值可增加包围框预测误差的权重。

  • 信心丧失

    损失函数的第三项和第四项构成信心损失。第三项度量客体性中检测到对象时的(置信度评分)错误j网格单元格的边界框.第四项测量的是在没有检测到物体时的物体性误差j网格单元格的边界框.计算置信度损失的参数定义如下。

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

    • Ĉ网格单元中地面真相的置信度分数是多少

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

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

    当不包含对象的网格单元数大于包含对象的网格单元数时,信任损失会导致训练发散。要解决这个问题,请增加for的值K2并减小for的值K3.

  • 分类损失

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

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

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

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

提示

参考文献

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

[2]约瑟。R和F.阿里。“YOLO 9000:更好、更快、更强。”在IEEE计算机视觉与模式识别会议论文集, 6517 - 6525页。火奴鲁鲁,HI: CVPR, 2017。

版本历史

介绍了R2019a

Baidu
map