主要内容

使用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.zipdata =负载(“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。vehicleDataset.imageFilename imageFilename = fullfile (pwd);

将数据集分为训练集、验证集和测试集。选择60%的数据进行训练,10%进行验证,剩下的用于测试训练过的检测器。

rng (“默认”);shuffledIndices = randperm(高度(vehicleDataset));idx = floor(0.6 * length(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 =结合(imdsTrain bldsTrain);validationData =结合(imdsValidation bldsValidation);testData =结合(imdsTest bldsTest);

使用validateInputData为了检测无效的图像、边界框或标签,即

  • 图像格式无效或包含nan的示例

  • 包含0 / nan / info /空的包围框

  • 失踪/ non-categorical标签。

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

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

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

data =阅读(trainingData);我={1}数据;bbox ={2}数据;annotatedImage = insertShape(我“矩形”, bbox);annotatedImage = imresize (annotatedImage 2);图imshow (annotatedImage)

图中包含一个axes对象。坐标轴对象包含一个image类型的对象。

重置(trainingData);

创建一个YOLO v4对象检测器网络

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

inputSize = [608 608 3];

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

className =“汽车”

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

rng (“默认”) trainingdataforetimation = transform(trainingData,@(data)preprocessData(data,inputSize));numAnchors = 9;[锚,meanIoU] = estimateAnchorBoxes (trainingDataForEstimation numAnchors);Area = anchor (:, 1).*anchor (:,2);[~, idx] =排序(区域,“下”);锚=锚(idx:);: anchorBoxes ={锚(1:3)锚(4:6 -:)锚(七章:)};

有关选择锚框的更多信息,请参见根据训练数据估计锚盒(计算机视觉工具箱™)和对象检测的锚框

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

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

执行数据增加

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

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

  • 随机水平翻转

  • 随机缩放10%

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

augmentedTrainingData =变换(trainingData @augmentData);

读取和显示增强训练数据的示例。

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

图中包含一个axes对象。坐标轴对象包含一个image类型的对象。

指定培训选项

使用trainingOptions指定网络培训选项。使用亚当求解器训练物体检测器70个周期,以恒定的学习率0.001。”ResetInputNormalization”应该设置为false和BatchNormalizationStatistics应该设置为“移动”.设置”ValidationData”到验证数据。使用“ExecutionEnvironment”确定将使用什么硬件资源来训练网络。默认值为"auto",如果GPU可用,则选择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对象检测器。本例运行在NVIDIA™Titan RTX GPU上,内存为24 GB。使用这种设置训练这个网络大约需要10个小时。训练时间取决于您使用的硬件。除了训练网络,您还可以使用计算机视觉工具箱™中预先训练的YOLO v4对象检测器。

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

doTraining = false;如果doTraining%训练YOLO v4检测器。[探测器,信息]= trainYOLOv4ObjectDetector (augmentedTrainingData、探测器、期权);其他的为示例加载预先训练的检测器。探测器= downloadPretrainedYOLOv4Detector ();结束

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

我= imread (“highway.png”);[bboxes、分数、标签]=检测(探测器,我);

显示结果。

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

图中包含一个axes对象。坐标轴对象包含一个image类型的对象。

使用测试集评估检测器

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

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

testData detectionResults =检测(探测器);

用平均精度度量对目标检测器进行评估。

[据美联社、召回、精密]= evaluateDetectionPrecision (detectionResults testData);

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

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

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

支持功能

执行数据扩充的辅助函数。

函数data = augmentData (A)应用随机水平翻转和随机X/Y缩放。盒子,如果重叠超过0.25,则裁剪边界外缩放的%。同时,抖动图像颜色。data =细胞(大小(A));ii = 1: I = A{ii,1};bboxes = {ii, 2};标签= {ii, 3};深圳=大小(I);如果numel(sz) == 3 && sz(3) == 3 I = jitterColorHSV(I,...对比= 0.0,...色调= 0.1,...饱和= 0.2,...亮度= 0.2);结束%随机翻转图像。tform = randomAffine2d(XReflection=true,Scale=[1 1.1]);溃败= affineOutputView(深圳、tform BoundsStyle =“centerOutput”);I = imwarp(我tform OutputView =溃败);对盒子应用相同的变换。[bboxes,指数]= bboxwarp (bboxes、tform溃败,OverlapThreshold = 0.25);标签=标签(指标);只有在通过翘曲删除所有框时才返回原始数据。如果isempty(indexes) data(ii,:) = A(ii,:);其他的数据(ii):) ={我bboxes标签};结束结束结束函数targetSize data = preprocessData(数据)调整图像的大小,并将像素缩放到0和1之间。同时规模%对应的边界框。ii = 1:size(data,1) I = data{ii,1};imgSize =大小(I);bboxes = {ii, 2}数据;我= im2single (imresize(我targetSize (1:2)));规模= targetSize(1:2)。/ imgSize (1:2);bboxes = bboxresize (bboxes、规模);数据(ii, 1:2) ={我bboxes};结束结束

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

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

参考文献

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

另请参阅

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

相关的例子

更多关于

Baidu
map