主要内容

对象检测使用YOLO v2意思深入学习

这个例子展示了如何训练你只看一次(YOLO)意思v2对象探测器。

深度学习是一个功能强大的机器学习技术,你可以用它来训练健壮的对象探测器。几个对象检测存在的技术,包括更快的R-CNN和你只看一次(YOLO)意思v2。这个例子火车YOLO v2意思车辆探测器使用trainYOLOv2ObjectDetector函数。有关更多信息,请参见开始使用YOLO v2的意思

下载Pretrained探测器

下载pretrained检测器来避免等待培训完成。如果你想训练检测器,设置doTraining变量为true。

doTraining = false;如果~ doTraining & & ~存在(“yolov2ResNet50VehicleExample_19b.mat”,“文件”)disp (“下载pretrained检测器(98 MB)…”);pretrainedURL =“//www.tatmou.com/金宝appsupportfiles/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双}
% fullpath添加到本地车辆数据文件夹。vehicleDataset。vehicleDataset.imageFilename imageFilename = fullfile (pwd);

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

rng (0);shuffledIndices = randperm(高度(vehicleDataset));地板idx =(0.6 *长度(shuffledIndices));trainingIdx = 1: idx;trainingDataTbl = vehicleDataset (shuffledIndices (trainingIdx):);validationIdx = idx + 1: idx + 1 +地板(0.1 *长度(shuffledIndices));validationDataTbl = vehicleDataset (shuffledIndices (validationIdx):);testIdx = validationIdx(结束)+ 1:长度(shuffledIndices);testDataTbl = vehicleDataset (shuffledIndices (testIdx):);

使用imageDatastoreboxLabelDatastore为加载图片和标签数据创建数据存储在训练和评估。

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意思对象检测网络由两个子网。一个特征提取网络之后,检测网络。特征提取网络通常是一个pretrained CNN(详情,请参阅Pretrained深层神经网络(深度学习工具箱))。这个示例使用ResNet-50特征提取。您还可以使用其他pretrained网络也可以使用如MobileNet v2或ResNet-18取决于应用程序的需求。检测子是一个小的CNN与特征提取网络和由几个卷积的一层又一层特定YOLO v2的意思。

使用yolov2Layers函数创建一个YOLO v2意思对象检测网络自动获得一个pretrained ResNet-50特征提取网络。yolov2Layers需要您指定几个输入参数化YOLO v2意思网络:

  • 网络输入大小

  • 锚箱

  • 特征提取的网络

首先,指定网络输入大小和类的数量。在选择网络输入大小,考虑网络本身所需的最小大小,训练图像的大小,计算成本的处理数据选择大小。在可行的情况下,选择一个网络输入大小接近训练图像的大小和大于输入大小所需的网络。降低运行成本的计算示例中,指定一个网络输入的大小(224 224),这是网络运行所需的最小大小。

inputSize = (224 224 3);

定义对象类检测的数量。

numClasses =宽度(vehicleDataset) 1;

注意,在本例中使用的训练图像是比224 - - 224和大小不同,所以你必须调整图像的预处理步骤之前的训练。

下一步,使用estimateAnchorBoxes估计锚箱基于训练数据中的对象的大小。之前考虑到图像的调整训练,调整估算锚箱的训练数据。使用变换训练数据进行预处理,然后定义锚箱的数量估计锚箱。调整训练数据的输入图像大小网络使用支持功能金宝apppreprocessData

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

在选择锚箱的更多信息,见从训练数据估计锚箱(计算机视觉工具箱™)锚箱对象检测

现在,使用resnet50加载pretrained ResNet-50模型。

featureExtractionNetwork = resnet50;

选择“activation_40_relu”作为特征提取层替换后层“activation_40_relu”检测子网。这个特征提取层输出特征图谱downsampled的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 =阅读(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是真的。否则,加载pretrained网络。

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

这个例子验证了在NVIDIA™泰坦X GPU 12 GB的内存。如果你的GPU内存更少,你可能会耗尽内存。如果发生这种情况,降低“MiniBatchSize”使用trainingOptions函数。培训这个网络使用这个设置需要大约7分钟。训练时间要取决于您所使用的硬件。

作为一个快速测试,运行探测器的测试图像。确保你调整图像大小相同的训练图像。

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

显示结果。

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

评估探测器使用测试集

评估培训对象探测器在大组图像测量性能。计算机视觉工具箱™提供了对象探测器评价函数来测量常见的指标,如平均精度(evaluateDetectionPrecision)和log-average错过率(evaluateDetectionMissRate)。对于这个示例,使用平均精度指标来评估性能。平均精度提供了一个数字,包含探测器进行正确分类的能力(精度)和探测器的能力找到所有相关对象(回忆)。

应用相同的预处理变换的测试数据作为训练数据。注意数据增加不是应用到测试数据。测试数据应该代表原始数据和修改的公正的评价。

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

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

preprocessedTestData detectionResults =检测(探测器);

评估对象探测器使用平均精度指标。

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

精密/回忆(PR)曲线突显出准确的探测器在不同级别的召回。理想的精度是1在所有回忆的水平。使用更多的数据可以帮助提高平均精度,但可能需要更多的训练时间。策划公关曲线。

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

代码生成

一旦探测器训练和评估,可以生成代码yolov2ObjectDetector使用GPU编码器™。看到代码生成的对象检测使用YOLO v2的意思(GPU编码器)更多细节的例子。

金宝app支持功能

函数B = augmentData (A)%应用随机水平翻转,和随机的X / Y缩放。盒子,%比例范围以外剪如果重叠高于0.25。同时,%抖动图像颜色。B =细胞(大小(A));我= {1};深圳=大小(I);如果元素个数(深圳)= = 3 & &深圳(3)= = 3 = jitterColorHSV(我,我“对比”,0.2,“颜色”0,“饱和”,0.1,“亮度”,0.2);结束%随机图像翻转和规模。tform = randomAffine2d (“XReflection”,真的,“规模”1.1 [1]);tform溃败= affineOutputView(深圳,“BoundsStyle”,“CenterOutput”);B {1} = imwarp (tform,我“OutputView”,溃败);%清洁箱数据,如果需要的话。{2}= helperSanitizeBoxes ({2}, sz);%应用相同的转换盒。[B{2},指数]= bboxwarp ({2}, tform溃败,“OverlapThreshold”,0.25);B{3} ={3}(指标);%返回原始数据只有当所有盒子都被扭曲。如果isempty(指数)B =;结束结束函数targetSize data = preprocessData(数据)% targetSize调整图像和边界框。深圳=大小(数据{1}、(1 2));规模= targetSize(1:2)。/深圳;{1}= imresize数据(数据{1},targetSize (1:2));%清洁箱数据,如果需要的话。{2}= helperSanitizeBoxes数据(数据{2},sz);%调整框新的图像大小。{2}= bboxresize数据(数据{2},规模);结束

引用

[1]Redmon,约瑟夫和阿里蒂。“YOLO9000:更好,更快,更强。“在2017年IEEE计算机视觉与模式识别会议(CVPR),6517 - 25所示。火奴鲁鲁,你好:IEEE 2017。https://doi.org/10.1109/CVPR.2017.690。