主要内容

使用YOLO v2进行对象检测

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

深度学习是一种强大的机器学习技术,可用于训练强健的目标检测器。存在几种目标检测技术,包括更快的R-CNN和只看一次(YLO)v2。此示例使用trainYOLOv2ObjectDetector函数。有关更多信息,请参阅开始使用YOLO v2(计算机视觉工具箱)

下载Pretrained探测器

下载一个预训练的探测器,以避免等待训练完成。如果要训练探测器,请设置溺爱变量为true。

doTraining=false;如果~ doTraining & & ~存在(“Yolov2Resnet50车辆示例_19b.垫”“文件”) disp ('下载预训练检测器(98 MB)…');预训练='//www.tianjin-qmedu.com/万博1manbetxsupportfiles/vision/data/yolov2ResNet50VehicleExample_19b.mat';websave (“Yolov2Resnet50车辆示例_19b.垫”, pretrainedURL);终止

加载数据集

本例使用一个包含295张图像的小型车辆数据集。这些图像中有许多来自加州理工学院汽车1999年和2001年的数据集,可以在加州理工学院计算视觉中心获得网站,由Pietro Perona创建并经许可使用。每个图像包含一个或两个标记的车辆实例。一个小数据集对于探索YOLO v2培训程序非常有用,但在实践中,需要更多标记的图像来培训一个强健的检测器。解压缩车辆图像并加载车辆地面真实数据。

解压缩vehicleDatasetImages.zip数据=负载(“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);ShuffledDices=randperm(高度(车辆数据集));idx=地板(0.6*长度(分片));培训idx=1:idx;trainingDataTbl=车辆数据集(ShuffledDices(trainingIdx),:);validationIdx=idx+1:idx+1+楼层(0.1*长度(ShuffledDices));validationDataTbl=车辆数据集(ShuffledDices(validationIdx),:);testIdx=validationIdx(end)+1:长度(shuffleddinces);testDataTbl=车辆数据集(ShuffledDices(testIdx),:);

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

imdsTrain = imageDatastore (trainingDataTbl {:,“imageFilename”}); bldsTrain=boxLabelDatastore(培训数据TBL(:,“汽车”)); 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);I=data{1};bbox=data{2};annotatedImage=insertShape(I,“矩形”, bbox);annotatedImage = imresize (annotatedImage 2);图imshow (annotatedImage)

创建YOLO v2对象检测网络

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

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

  • 网络输入大小

  • 锚箱

  • 特征提取的网络

首先,指定网络输入的大小和类的数目。在选择网络输入大小时,考虑网络本身所需的最小大小、训练图像的大小以及处理所选大小的数据所产生的计算成本。当可行时,选择与TR大小接近的网络输入大小。aining image并大于网络所需的输入大小。要减少运行示例的计算成本,请指定网络输入大小[224 224 3],这是运行网络所需的最小大小。

inputSize = [224 224 3];

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

numClasses =宽度(vehicleDataset) 1;

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

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

trainingDataForEstimation=转换(trainingData,@(data)预处理数据(data,inputSize));numAnchors=7;[anchorBoxes,MeaniIOU]=估计anchorBoxes(trainingDataForEstimation,numAnchors)
锚箱=7×2162 136 85 80 149 123 43 32 65 63 117 105 33 27
meanIoU = 0.8472

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

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

featureExtractionNetwork = resnet50;

选择“激活\u 40\u relu”作为特征提取层替换后的层“激活\u 40\u relu”与检测子网。该特征提取层输出特征地图,该地图以16的系数进行下采样。这种下采样量在空间分辨率和提取特征的强度之间是一种很好的折衷,因为在网络更深处提取的特征以空间分辨率为代价编码更强的图像特征。选择最佳特征提取层需要进行实证分析。

featureLayer =“激活\u 40\u relu”

创建YOLO v2对象检测网络

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

您可以使用可视化网络analyzeNetwork或来自深度学习工具箱™的深度网络设计师。

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

数据增加

数据扩充用于通过在训练期间随机变换原始数据来提高网络精度。通过使用数据扩充,您可以向训练数据添加更多种类,而无需实际增加标记训练样本的数量。

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

augmentedTrainingData =变换(trainingData @augmentData);

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

%可视化增强图像。增强数据=单元(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);

显示图像和边框。

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

火车YOLO v2对象检测器

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

选择= trainingOptions (“个”...“MiniBatchSize”,16,...“初始学习率”1 e - 3,...“MaxEpochs”, 20岁,...“CheckpointPath”tempdir,...“ValidationData”,预处理验证数据);

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

如果溺爱%培训YOLO v2检测仪。[检测器,信息]=TrainyLov2Object检测器(预处理的训练数据、lgraph、选项);其他的%以负载预训练检测器为例。pretrained =负载(“Yolov2Resnet50车辆示例_19b.垫”);探测器= pretrained.detector;终止

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

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

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

显示结果。

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

使用测试集评估检测器

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

对测试数据应用与训练数据相同的预处理变换。请注意,数据扩充不应用于测试数据。测试数据应代表原始数据,且不作修改,以便进行无偏评估。

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

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

检测结果=检测(检测器,预处理的检测数据);

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

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

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

图绘制(召回、精密)包含(“回忆”) ylabel (“精度”网格)在…上头衔(斯普林特)('平均精度= %.2f'据美联社)),

代码生成

一旦对检测器进行了培训和评估,您就可以为检测器生成代码yolov2ObjectDetector使用GPU编码器™。看到使用YOLO v2生成对象检测的代码(GPU编码器)例如更多的细节。

万博1manbetx支持功能

函数B=数据(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(深圳,“邦兹风格”“CenterOutput”);B{1}=imwarp(I,tform,“OutputView”,溃败);%如果需要,请清理方框数据。A{2} = helperSanitizeBoxes(A{2}, sz);%对框应用相同的变换。[B{2},指数]= bboxwarp ({2}, tform溃败,“OverlapThreshold”,0.25); B{3}=A{3}(指数);%仅当所有的框被扭曲时返回原始数据。如果isempty(indices) 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计算机视觉与模式识别大会(CVPR), 6517 - 25所示。火奴鲁鲁,HI: IEEE, 2017。https://doi.org/10.1109/CVPR.2017.690。