主要内容

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

这个例子展示了如何训练一个“只看一次”(YOLO) v2对象检测器。

深度学习是一种强大的机器学习技术,可以用来训练强大的对象检测器。有几种用于物体检测的技术,包括Faster R-CNN和您只看一次(YOLO) v2。方法训练YOLO v2车辆检测器trainYOLOv2ObjectDetector函数。有关更多信息,请参见从YOLO v2开始(计算机视觉工具箱)

下载Pretrained探测器

下载一个预先训练的检测器,以避免必须等待训练完成。如果你想训练探测器,设置doTraining变量为true。

doTraining = false;如果~ doTraining & & ~存在(“yolov2ResNet50VehicleExample_19b.mat”“文件”) disp (“下载预先训练的检测器(98 MB)…”);pretrainedURL =“//www.ru-cchi.com/supportfiles/vision/data/yolov2ResNet50VehicleExample_19b.mat”;websave (“yolov2ResNet50VehicleExample_19b.mat”, pretrainedURL);结束

加载数据集

本例使用了一个包含295张图片的小型车辆数据集。这些图片大多来自加州理工学院赛车1999年和2001年的数据集,由Pietro Perona创建,并经许可使用。每张图片包含一个或两个标记的车辆实例。一个小的数据集对于探索YOLO v2训练过程是有用的,但在实践中,需要更多的标记图像来训练一个健壮的检测器。解压缩车辆图像并加载车辆地面真相数据。

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

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

显示数据集的前几行。vehicleDataset (1:4,:)
ans =4×2表imageFilename车辆  _________________________________ ____________ {' vehicleImages / image_00001.jpg '}{1×4双}{' vehicleImages / image_00002.jpg '}{1×4双}{' vehicleImages / image_00003.jpg '}{1×4双}{' vehicleImages / image_00004.jpg '}{1×4双}
将全路径添加到本地车辆数据文件夹。vehicleDataset。vehicleDataset.imageFilename imageFilename = fullfile (pwd);

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

rng (0);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);

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

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

创建一个YOLO v2对象检测网络

YOLO v2目标检测网络由两个子网络组成。特征提取网络和检测网络。特征提取网络通常是一个经过预先训练的CNN(有关详细信息,请参阅预训练深度神经网络).本例使用ResNet-50进行特征提取。您也可以使用其他预先训练的网络,如MobileNet v2或ResNet-18也可以根据应用程序的需求使用。与特征提取网络相比,检测子网络是一个小的CNN,由几个卷积层和针对YOLO v2的层组成。

使用yolov2Layers(计算机视觉工具箱)函数创建YOLO v2对象检测网络,自动给定预先训练的ResNet-50特征提取网络。yolov2Layers需要指定几个参数化YOLO v2网络的输入:

  • 网络输入大小

  • 锚箱

  • 特征提取的网络

首先,指定网络输入大小和类的数量。在选择网络输入大小时,要考虑网络本身所需的最小大小、训练图像的大小以及以所选大小处理数据所产生的计算成本。在可行的情况下,选择一个接近训练图像大小且大于网络所需输入大小的网络输入大小。为了减少运行示例的计算成本,指定网络输入大小为[224 224 3],这是运行网络所需的最小大小。

inputSize = [224 224 3];

定义要检测的对象类的数量。

numClasses =宽度(vehicleDataset) 1;

注意,本例中使用的训练图像大于224 * 224,并且大小不同,因此必须在训练之前的预处理步骤中调整图像的大小。

下一步,使用estimateAnchorBoxes(计算机视觉工具箱)根据训练数据中对象的大小估计锚框。为了在训练前考虑图像的大小调整,调整训练数据的大小以估计锚框。使用变换先对训练数据进行预处理,然后定义锚盒数量,并对锚盒进行估计。使用支持函数将训练数据调整为网络的输入图像大小preprocessData

trainingDataForEstimation =变换(trainingData @(数据)preprocessData(数据、inputSize));numAnchors = 7;[anchorBoxes, meanIoU] = estimateAnchorBoxes(trainingdatafestimtimation, numAnchors)
anchorBoxes =7×2162 136 85 80 149 123 43 32 65 63 117 105 33 27
meanIoU = 0.8472

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

现在,使用resnet50加载一个预训练的ResNet-50模型。

featureExtractionNetwork = resnet50;

选择“activation_40_relu”作为特征提取层来代替后层“activation_40_relu”与检测子网。这个特征提取层输出的特征图被下采样了16倍。这个下采样量是空间分辨率和提取特征强度之间的一个很好的权衡,因为在网络中进一步提取的特征以空间分辨率为代价编码更强的图像特征。选择最优特征提取层需要进行实证分析。

featureLayer =“activation_40_relu”

创建YOLO v2对象检测网络。

lgraph = yolov2Layers (inputSize numClasses、anchorBoxes featureExtractionNetwork, featureLayer);

您可以可视化使用的网络analyzeNetwork或从深度学习工具箱™中的深度网络设计器。

如果需要对YOLO v2网络体系结构进行更多的控制,请使用深度网络设计器手动设计YOLO v2检测网络。有关更多信息,请参见设计一个YOLO v2检测网络(计算机视觉工具箱)

数据增加

数据增强是通过训练过程中对原始数据的随机变换来提高网络精度的一种方法。通过使用数据增强,您可以为训练数据添加更多的多样性,而不必实际增加标记训练样本的数量。

使用变换通过水平随机翻转图像和相关框标签来增强训练数据。注意,数据扩充并不应用于测试和验证数据。理想情况下,测试和验证数据应该代表原始数据,并且不进行修改,以便进行无偏评价。

augmentedTrainingData =变换(trainingData @augmentData);

多次读取相同的图像并显示增强训练数据。

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

训练数据进行预处理

对增强训练数据和验证数据进行预处理,为训练做准备。

preprocessedTrainingData =变换(augmentedTrainingData @(数据)preprocessData(数据、inputSize));preprocessedValidationData =变换(validationData @(数据)preprocessData(数据、inputSize));

读取预处理后的训练数据。

data =阅读(preprocessedTrainingData);

显示图像和边框。

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

训练YOLO v2对象检测器

使用trainingOptions指定网络培训选项。集“ValidationData”到预处理的验证数据。集“CheckpointPath”到一个临时地点。这使得在训练过程中可以保存部分训练过的检测器。如果培训中断,例如由于停电或系统故障,您可以从保存的检查点恢复培训。

选择= trainingOptions (“个”...“MiniBatchSize”, 16岁,...“InitialLearnRate”1 e - 3,...“MaxEpochs”, 20岁,...“CheckpointPath”tempdir,...“ValidationData”, preprocessedValidationData);

使用trainYOLOv2ObjectDetector(计算机视觉工具箱)函数来训练YOLO v2对象检测器doTraining是真的。否则,加载预训练的网络。

如果doTraining训练YOLO v2检测器。[探测器,信息]= trainYOLOv2ObjectDetector (preprocessedTrainingData、lgraph选项);其他的为示例加载预先训练的检测器。pretrained =负载(“yolov2ResNet50VehicleExample_19b.mat”);探测器= pretrained.detector;结束

这个例子是在NVIDIA™Titan X GPU上验证的,内存为12 GB。如果你的GPU内存较少,你可能会耗尽内存。如果发生这种情况,降低“MiniBatchSize”使用trainingOptions函数。使用这种设置训练这个网络大约需要7分钟。根据使用的硬件不同,培训时间也不同。

作为快速测试,在测试映像上运行检测器。请确保将图像的大小调整到与训练图像相同的大小。

我= imread (“highway.png”);我= imresize(我inputSize (1:2));[bboxes,分数]=检测(探测器,I);

显示结果。

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

使用测试集评估检测器

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

对测试数据应用与训练数据相同的预处理变换。注意,数据扩充没有应用到测试数据。试验数据应代表原始数据,不作任何修改,以便进行无偏评价。

preprocessedTestData =变换(testData @(数据)preprocessData(数据、inputSize));

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

detectionResults = detect(检测器,预处理testdata);

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

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

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

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

代码生成

训练和评估了检测器之后,就可以为yolov2ObjectDetector使用GPU编码器™。看到基于YOLO v2的目标检测代码生成(GPU编码器)示例了解更多细节。

支持功能

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

参考文献

雷德蒙,约瑟夫和阿里·法哈迪。“YOLO9000:更好、更快、更强。”在2017年IEEE计算机视觉与模式识别会议, 6517 - 25所示。檀香山,HI: IEEE, 2017。https://doi.org/10.1109/CVPR.2017.690。

Baidu
map