主要内容

trainYOLOv4ObjectDetector

训练YOLO v4对象检测器

描述

例子

探测器= trainYOLOv4ObjectDetector (trainingData探测器选项返回一个使用输入指定的只看一次版本4 (YOLO v4)网络训练的对象检测器探测器.输入探测器可以是未经训练或预训练的YOLO v4对象检测器。的选项输入为检测网络指定训练参数。

您还可以使用此语法对预训练的YOLO v4对象检测器进行微调。

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

你可以使用这个语法:

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

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

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

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

请注意

要运行此函数,您将需要深度学习工具箱™。

例子

全部折叠

这个例子展示了如何微调预训练的YOLO v4对象检测器来检测图像中的车辆。这个例子使用了一个在COCO数据集上训练的小型YOLO v4网络。

加载预训练的YOLO v4对象检测器并检查其属性。

探测器= yolov4ObjectDetector(“tiny-yolov4-coco”
检测器= yolov4ObjectDetector与属性:网络:[1×1 dlnetwork] AnchorBoxes: {2×1 cell} ClassNames: {80×1 cell} InputSize: [416 416 3] ModelName: 'tiny-yolov4-coco'

锚盒数量必须与YOLO v4网络的输出层数保持一致。这个微小的YOLO v4网络包含两个输出层。

探测器。网络
ans = dlnetwork with properties: Layers: [74×1 nnet.cnn.layer.Layer] Connections: [80×2 table] Learnables: [80×3 table] State: [38×3 table] InputNames: {'input_1'} OutputNames: {'conv_31' 'conv_38'} Initialized: 1 .初始化

准备培训数据

加载一个.mat文件,其中包含有关用于训练的车辆数据集的信息。存储在.mat文件中的信息是一个表。第一列包含训练图像,其余列包含标记的包围框。

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

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

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

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

imds = imageDatastore(trainingData.imageFilename);

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

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

合并数据存储。

Ds = combine(imds,blds);

指定用于调整训练图像大小的输入大小。控件时,训练图像的大小必须是32的倍数tiny-yolov4-coco而且csp-darknet53-coco预训练YOLO v4深度学习网络。还必须根据指定的输入大小调整边界框的大小。

inputSize = [224 224 3];

控件调整训练图像和包围框的大小和缩放preprocessDatahelper函数。另外,将预处理数据转换为a数据存储对象,使用变换函数。

trainingdatafestimtimation = transform(ds,@(data)preprocessData(data,inputSize));

估算锚箱

根据训练数据估计锚框。您必须为YOLO v4网络中的每个输出层分配相同数量的锚框。

numAnchors = 6;[主播,meanIoU] = estimateAnchorBoxes(trainingdatafestimate,numAnchors);Area = anchors(:,1).*anchors(:,2);[~,idx] = sort(area,“下”);锚=锚(idx,:);锚箱={锚(1:3,:);锚(4:6,:)};

配置和训练YOLO v4网络

指定类名,并配置预训练的YOLOv4深度学习网络,通过使用为新数据集重新训练yolov4ObjectDetector函数。

类= {“汽车”};探测器= yolov4ObjectDetector(“tiny-yolov4-coco”、类、anchorBoxes InputSize = InputSize);

方法指定训练选项,并在新数据集上重新训练预训练的YOLO v4网络trainYOLOv4ObjectDetector函数。

选项= trainingOptions(“个”...InitialLearnRate = 0.001,...MiniBatchSize = 16,...MaxEpochs = 40,...BatchNormalizationStatistics =“移动”...ResetInputNormalization = false,...VerboseFrequency = 30);trainedDetector = trainYOLOv4ObjectDetector(ds,检测器,options);
************************************************************************* 培训YOLO v4意思对象探测器以下对象类:* vehicle Epoch Iteration TimeElapsed LearnRate TrainingLoss _____ _________ ___________ _________ ____________ 230 00:01:07 0.001 7.215 4 60 00:01:44 0.001 1.7371 5 90 00:02:21 0.001 0.97954 7 120 00:02:57 0.001 0.65631 10 180 00:04:10 0.001 1.0774 12 210 00:04:46 0.001 0.4807 13 240 00:05:22 0.001 0.40389 15 270 00:05:59 0.001 0.57931 16 300 00:06:35 0.001 0.90734 18 330 00:07:11 0.001 0.24902 19 360 00:07:48 0.001 0.32441 21 390 00:08:24 0.001 0.23054 23 42000:09:00 0.001 0.70897 24 450 00:09:36 0.001 0.31744 26 480 00:10:12 0.001 0.36323 27 510 00:10:49 0.001 0.13696 29 540 00:11:25 0.001 0.14913 30 570 00:12:01 0.001 0.37757 32 600 00:12:37 0.001 0.36985 34 630 00:13:14 0.001 0.14034 35 660 00:13:50 0.001 0.14731 37 690 00:14:26 0.001 0.15907 38 720 00:15:03 0.001 0.11737 40 750 00:15:40 0.001 0.1855 *************************************************************************检测器培训完成。*************************************************************************

在测试图像中检测车辆

读取一个测试图像。

I = imread(“highway.png”);

使用经过微调的YOLO v4对象检测器检测测试图像中的车辆并显示检测结果。

[bboxes, scores, labels] = detect(trainedDetector,I,Threshold=0.05);detectedImg = insertObjectAnnotation(I,“矩形”、bboxes、标签);图imshow (detectedImg)

函数data = preprocessData(data,targetSize)num = 1:size(data,1) I = data{num,1};imgSize = size(I);Bboxes =数据{num,2};I = im2single(imresize(I,targetSize(1:2)));/imgSize(1:2);Bboxes = bboxresize(Bboxes,scale);data(num,1:2) = {I,bboxes};结束结束

输入参数

全部折叠

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

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

    数据 盒子 标签

    第一列必须是图像。

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

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

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

预训练或未训练的YOLO v4对象检测器,指定为yolov4ObjectDetector对象。

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

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

要为以前训练过的检测器加载检查点,请从检查点路径加载mat文件。例如,如果CheckpointPath属性指定的对象的选项“checkpath”,您可以使用此代码加载检查点mat文件。“checkpath”当前工作目录中必须在训练期间将检测器检查点保存到其中的文件夹的名称。

数据=负载(“checkpath / net_checkpoint__19__2021_12_29__01_04_15.mat”);检查点= data.net;

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

yoloDetector = trainYOLOv4ObjectDetector(trainingData,checkpoint,options);

名称-值参数

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

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

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

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

培训期间监测的信息:

  • 每次迭代的训练损失。

  • 每次迭代的学习率。

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

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

输出参数

全部折叠

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

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

  • TrainingLoss-每次迭代的训练损失。的trainYOLOv4ObjectDetector函数使用均方误差计算边界盒回归损失,交叉熵计算分类损失。

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

  • OutputNetworkIteration-返回网络的迭代次数。

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

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

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

提示

版本历史

R2022a中引入