主要内容

使用YOLO v4深度学习的对象检测

这个例子展示了如何使用你只看一次的版本4 (YOLO v4)深度学习网络来检测图像中的对象。在本例中,您将做到

  • 为YOLO v4对象检测网络的训练、验证和测试配置一个数据集。您还将在训练数据集上执行数据增强,以提高网络效率。

  • 从训练数据中计算锚框,用于训练YOLO v4对象检测网络。

  • 方法创建YOLO v4对象检测器yolov4ObjectDetector使用检测器的功能和训练trainYOLOv4ObjectDetector函数。

这个示例还提供了一个预训练的YOLO v4对象检测器,用于检测图像中的车辆。预训练网络使用CSPDarkNet-53作为骨干网,并在车辆数据集上进行训练。有关YOLO v4对象检测网络的信息,请参见从YOLO v4开始

加载数据集

这个例子使用了一个包含295张图片的小型车辆数据集。这些图像大多来自加州理工学院汽车1999年和2001年的数据集,可在Pietro Perona创建的加州理工学院计算视觉网站上获得,并获得许可使用。每张图像包含一个或两个标记的车辆实例。一个小数据集对于探索YOLO v4训练过程是有用的,但在实践中,需要更多的标记图像来训练一个健壮的检测器。

解压缩车辆图像并加载车辆地面真相数据。

解压缩vehicleDatasetImages.zip数据=负载(“vehicleDatasetGroundTruth.mat”);vehicleDataset = data.vehicleDataset;

车辆数据存储在一个两列表中。第一列包含图像文件路径,第二列包含边界框。

显示数据集的前几行。vehicleDataset (1:4,:)
ans =4×2表imageFilename车辆  _________________________________ _________________ {' vehicleImages / image_00001.jpg '} {[220 136 35 28]} {' vehicleImages / image_00002.jpg '} {[45 175 126 61]} {' vehicleImages / image_00003.jpg '} {[45 108 120 33]} {' vehicleImages / image_00004.jpg '} {[124 112 38 36]}
将全路径添加到本地车辆数据文件夹。vehicleDataset。imageFilename = fullfile(pwd,vehicleDataset.imageFilename);

将数据集分成训练集、验证集和测试集。选择60%的数据进行训练,10%的数据进行验证,其余的数据用于测试训练后的检测器。

rng (“默认”);shuffledIndices = randperm(height(vehicleDataset));idx =地板(0.6 *长度(shuffledIndices));trainingIdx = 1:idx;trainingDataTbl = vehicleDataset(shuffledIndices(trainingIdx),:);validationIdx = idx+1: idx+1 + floor(0.1 * length(shuffledIndices));validationDataTbl = vehicleDataset(shuffledIndices(validationIdx),:);testdx = validationIdx(end)+1: length(shuffledIndices);testDataTbl = vehicleDataset(shuffledIndices(testIdx),:);

使用imageDatastore而且boxLabelDatastore创建用于在训练和评估期间加载图像和标签数据的数据存储。

imdsTrain = imageDatastore(trainingDataTbl{:,“imageFilename”});bldsTrain = boxLabelDatastore(trainingDataTbl(:,“汽车”));imdsValidation = imageDatastore(validationDataTbl{:,“imageFilename”});bldsValidation = boxLabelDatastore(validationDataTbl(:,“汽车”));imdsTest = imageDatastore(testDataTbl{:,“imageFilename”});bldsTest = boxLabelDatastore(testDataTbl(:,“汽车”));

组合图像和框标签数据存储。

trainingData = combine(imdsTrain,bldsTrain);validationData = combine(imdsValidation,bldsValidation);testData = combine(imdsTest,bldsTest);

使用validateInputData检测无效图像、包围框或标签,即

  • 图像格式无效或包含nan的样本

  • 包含零/ nan / inf /空的包围框

  • 失踪/ non-categorical标签。

边界框的值必须是有限正整数,不能为NaN。边界框值的高度和宽度必须为正,并且位于图像边界内。

validateInputData (trainingData);validateInputData (validationData);validateInputData (testData);

显示其中一个训练图像和框标签。

data = read(trainingData);I =数据{1};Bbox =数据{2};annotatedImage = insertShape(I,“矩形”, bbox);annotatedImage = imresize(annotatedImage,2);图imshow (annotatedImage)

图中包含一个轴对象。axis对象包含一个image类型的对象。

重置(trainingData);

创建YOLO v4对象检测器网络

指定用于训练的网络输入大小。

inputSize = [608 608 3];

指定要检测的对象类的名称。

className =“汽车”

使用estimateAnchorBoxes函数根据训练数据中对象的大小估计锚框。要考虑到训练前图像的大小调整,请调整用于估计锚盒的训练数据的大小。使用变换对训练数据进行预处理,然后定义锚盒数,并对锚盒进行估计。方法将训练数据调整为网络的输入大小preprocessDatahelper函数。

rng (“默认”) trainingdatafestimtimation = transform(trainingData,@(data)preprocessData(data,inputSize));numAnchors = 9;[主播,meanIoU] = estimateAnchorBoxes(trainingdatafestimate,numAnchors);Area = anchors(:, 1).*anchors(:,2);[~,idx] = sort(area,“下”);锚=锚(idx,:);: anchorBoxes ={锚(1:3)锚(4:6 -:)锚(七章:)};

有关选择锚框的详细信息,请参见从训练数据估计锚箱(计算机视觉工具箱™)和用于对象检测的锚框

方法创建YOLO v4对象检测器yolov4ObjectDetector函数。指定在COCO数据集上训练的预训练YOLO v4检测网络的名称。指定类名和估计的锚框。

探测器= yolov4ObjectDetector(“csp-darknet53-coco”、名称、anchorBoxes InputSize = InputSize);

执行数据增强

执行数据增强以提高训练准确性。使用变换函数将自定义数据增强应用于训练数据。的augmentDataHelper函数对输入数据应用以下扩充:

  • HSV空间中的颜色抖动增强

  • 随机水平翻转

  • 随机缩放10%

请注意,数据扩充并不应用于测试和验证数据。理想情况下,测试和验证数据应该代表原始数据,并且不进行修改,以便进行公正的评估。

augmentedTrainingData = transform(trainingData,@augmentData);

读取和显示增强训练数据样本。

augmentedData = cell(4,1);k = 1:4 data = read(augmentedTrainingData);augmentedData{k} = insertShape(数据{1},“矩形”、数据{2});重置(augmentedTrainingData);结束图蒙太奇(augmentedData BorderSize = 10)

图中包含一个轴对象。axis对象包含一个image类型的对象。

指定培训项目

使用trainingOptions指定网络培训选项。使用Adam求解器训练物体检测器70个epoch,学习速率为0.001。”ResetInputNormalization”应该设置为false和BatchNormalizationStatistics应该设置为"移动”.设置”ValidationData”到验证数据。使用“ExecutionEnvironment”以确定将使用哪些硬件资源来训练网络。默认值为“auto”,在可用的情况下选择GPU,否则选择CPU。设置”CheckpointPath”到一个临时地点。这使得在训练过程中可以保存部分训练过的检测器。如果培训中断,例如由于停电或系统故障,您可以从保存的检查点恢复培训。

选项= trainingOptions(“亚当”...GradientDecayFactor = 0.9,...SquaredGradientDecayFactor = 0.999,...InitialLearnRate = 0.001,...LearnRateSchedule =“没有”...MiniBatchSize = 4,...L2Regularization = 0.0005,...MaxEpochs = 70,...BatchNormalizationStatistics =“移动”...DispatchInBackground = true,...ResetInputNormalization = false,...洗牌=“every-epoch”...VerboseFrequency = 20,...CheckpointPath = tempdir,...ValidationData = ValidationData);

训练YOLO v4对象检测器

使用trainYOLOv4ObjectDetector函数来训练YOLO v4对象检测器。本例运行在具有24 GB内存的NVIDIA™Titan RTX GPU上。使用这种设置,训练这个网络大约需要10个小时。培训时间将根据您使用的硬件而有所不同。除了训练网络,您还可以使用计算机视觉工具箱™中预先训练的YOLO v4对象检测器。

方法下载预训练的检测器downloadPretrainedYOLOv4Detectorhelper函数。设置doTraining值设为false。如果要在增强训练数据上训练检测器,请设置doTrainingValue为true。

doTraining = false;如果doTraining训练YOLO v4检测器。[detector,info] = trainYOLOv4ObjectDetector(augmentedTrainingData,detector,options);其他的为示例加载预训练的检测器。检测器= downloadPretrainedYOLOv4Detector();结束

在测试图像上运行检测器。

I = imread(“highway.png”);[bboxes,scores,labels] = detect(检测器,I);

显示结果。

I = insertObjectAnnotation(I,“矩形”bboxes,分数);图imshow(我)

图中包含一个轴对象。axis对象包含一个image类型的对象。

使用测试集评估检测器

在大量图像上评估训练过的目标检测器的性能。计算机视觉工具箱™提供对象检测器评估功能,以测量常见指标,如平均精度(evaluateDetectionPrecision)和对数平均失误率(evaluateDetectionMissRate).对于本例,使用平均精度度量来评估性能。平均精度提供了一个单一的数字,其中包括探测器进行正确分类的能力(精度)和探测器找到所有相关对象的能力(召回率)。

在所有测试映像上运行检测器。

detectionResults = detect(检测器,testData);

使用平均精度度量来评估目标检测器。

[ap,recall,precision] = evaluateDetectionPrecision(detectionResults,testData);

精度/召回(PR)曲线强调了探测器在不同召回级别下的精度。在所有召回级别上,理想的精度为1。使用更多的数据有助于提高平均精度,但可能需要更多的训练时间。绘制PR曲线。

图(召回率,精度)“回忆”起) ylabel (“精度”网格)标题(sprintf ("平均精度= %.2f"据美联社)),

图中包含一个轴对象。标题为Average Precision = 0.88的axes对象包含一个line类型的对象。

支持功能

辅助功能,用于执行数据增强。

函数数据= augmentData(A)应用随机水平翻转,随机X/Y缩放。盒子%缩放到边界外,如果重叠大于0.25则被剪切。同时,%抖动图像颜色。data = cell(size(A));ii = 1:size(A,1) I = A{ii,1};bboxes = A{ii,2};标签= A{ii,3};sz = size(I);如果== 3 && sz(3) == 3 I = jitterColorHSV(I,...对比= 0.0,...色调= 0.1,...饱和= 0.2,...亮度= 0.2);结束%随机翻转图像。tform = randomAffine2d(XReflection=true,Scale=[1 1.1]);rout = affineOutputView(sz,tform,BoundsStyle=“centerOutput”);I = imwarp(I,tform,OutputView=rout);对方框应用相同的变换。[bboxes,indices] = bboxwarp(bboxes,tform,rout,OverlapThreshold=0.25);标签=标签(索引);%仅当所有方框通过扭曲删除时才返回原始数据。如果isempty(indexes) data(ii,:) = A(ii,:);其他的data(ii,:) = {I,bboxes,labels};结束结束结束函数data = preprocessData(data,targetSize)调整图像大小并将像素缩放到0到1之间。同时缩放%对应的包围框。ii = 1:size(data,1) I = data{ii,1};imgSize = size(I);Bboxes =数据{ii,2};I = im2single(imresize(I,targetSize(1:2)));/imgSize(1:2);Bboxes = bboxresize(Bboxes,scale);data(ii,1:2) = {I,bboxes};结束结束

用于下载预训练的YOLO v4对象检测器的Helper函数。

函数检测器= downloadPretrainedYOLOv4Detector()下载预先训练的yolov4检测器。。如果~ (“yolov4CSPDarknet53VehicleExample_22a.mat”“文件”如果~ (“yolov4CSPDarknet53VehicleExample_22a.zip”“文件”) disp (“下载预训练的检测器…”);pretrainedURL =“https://ssd.mathworks.com/supportfiles/vision/data/yolov4CSPDarknet53VehicleExample_22a.zip”;websave (“yolov4CSPDarknet53VehicleExample_22a.zip”, pretrainedURL);结束解压缩(“yolov4CSPDarknet53VehicleExample_22a.zip”);结束预训练=负荷(“yolov4CSPDarknet53VehicleExample_22a.mat”);检测器=预训练的。结束

参考文献

[1]阿列克谢·博奇科夫斯基,王建尧,廖宏远马克。“YOLOv4:目标检测的最佳速度和准确性。“2020,arXiv: 2004.10934.https://arxiv.org/abs/2004.10934。

另请参阅

||||(深度学习工具箱)|

相关的例子

更多关于

Baidu
map