主要内容

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

此示例显示如何培训您只需看一次(YOLO)V2对象检测器。

深度学习是一种强大的机器学习技术,可以用来训练健壮的目标探测器。有几种目标检测技术,包括Faster R-CNN和you only look once (YOLO) v2。这个例子训练YOLO v2车辆检测器使用Trainyolov2ObjectDetector.函数。有关更多信息,请参见yolo v2入门(电脑视觉工具箱)

下载预用探测器

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

doTraining = false;如果〜存在dotraining &&〜存在(“yolov2ResNet50VehicleExample_19b.mat”'文件')disp(“下载预训练探测器(98 MB)……”);pretrainedURL =“//www.tatmou.com/金宝appsupportfiles/vision/data/yolov2ResNet50VehicleExample_19b.mat”;WebSave(“yolov2ResNet50VehicleExample_19b.mat”,pretrowsurl);结束

加载数据集

此示例使用包含295个图像的小型车辆数据集。这些图像中的许多图片来自Caltech汽车1999和2001年数据集,可在Caltech计算视觉上提供网站,由Pietro Perona创作并获得许可使用。每个图像包含一个或两个已标记的车辆实例。一个小的数据集对于探索YOLO v2训练过程很有用,但在实践中,需要更多标记的图像来训练健壮的检测器。解压缩车辆图像,加载车辆地面真实数据。

解压缩vehicleDatasetImages.zipdata =负载('车辆有绳索地面纠址.MAT');vehicleDataset = data.vehicleDataset;

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

%显示数据集的前几行。车辆驾驶仪(1:4,:)
ans =.4×2表ImageFilename车辆_________________________________________________00001.jpg'} {1×4 double} {1×4 double} {1×4 double} {'limpleimages / image_00003.jpg'} {1×4 double} {'Lastmages / Image_00004.jpg'} {1×4双}
%将全路添加到本地车辆数据文件夹。vevicledataset.imagefilename = fullfile(pwd,vevicledataset.imagefilename);

将数据集分解为训练集、验证集和测试集。选择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):);

imageageAtastore.boxlabeldatastore.创建用于在培训和评估期间加载图像和标签数据的数据存储。

imdstrain = imageageataStore(trainingDatatbl {:,'imagefilename'});bldsTrain = boxLabelDatastore (trainingDataTbl (:,“汽车”));imdsValidation = imageDatastore (validationDataTbl {:,'imagefilename'});bldsvalidation = boxlabeldataStore(ValidationDatatbl(:,“汽车”));imdstest = imageageataStore(testdatatbl {::,'imagefilename'});bldsTest = boxLabelDatastore (testDataTbl (:,“汽车”));

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

trainingdata =联合(Imdstrain,Bldstrain);ValidationData = Combine(IMDSValidation,BLDSvalidation);testdata =组合(IMDSTEST,BLDSTEST);

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

数据=读取(TrainingData);我={1}数据;bbox ={2}数据;AnnotatedImage = instrshape(我,'长方形',bbox);AnnotatedImage = IMResize(AnnotatedImage,2);图imshow(AnnotatedImage)

创建YOLO V2对象检测网络

YOLO V2对象检测网络由两个子网组成。特征提取网络,后跟检测网络。特征提取网络通常是倒托尔CNN(有关详细信息,请参阅普里德深度神经网络).此示例使用Reset-50进行功能提取。您还可以使用其他佩带网络,如MobileNet V2或Reset-18,也可以根据应用要求使用。与特征提取网络相比,检测子网络是小CNN,并且由一些卷积层和用于YOLO V2的层组成。

使用yolov2镶嵌(电脑视觉工具箱)函数以自动创建YOLO V2对象检测网络,给出预级resnet-50特征提取网络。yolov2镶嵌要求您指定参数化yolo v2网络的几个输入:

  • 网络输入大小

  • 锚箱

  • 特征提取网络

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

InputSize = [224 224 3];

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

numclasses =宽度(车辆达到)-1;

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

接下来,使用extimateanchorboxes.(电脑视觉工具箱)根据训练数据中对象的大小估计锚盒。为了考虑在训练前调整图像的大小,调整用于估计锚盒的训练数据的大小。用转变对训练数据进行预处理,定义锚盒的数量并对锚盒进行估计。使用支持函数将训练数据调整为网络的输入图像大小金宝apppreprocessData

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

有关选择锚盒的更多信息,请参阅从训练数据估算锚盒(电脑视觉工具箱)(计算机视觉工具箱™)和用于物体检测的锚盒(电脑视觉工具箱)

现在,使用resnet50加载预制Reset-50型号。

featureextractionnetwork = resnet50;

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

FeatureLayer =“activation_40_relu”;

创建YOLO V2对象检测网络。

lgraph = yolov2layers(输入,numcrasses,anchorboxes,featureextractionnetwork,featureLayer);

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

如果需要对YOLO v2网络架构进行更多的控制,可以使用“Deep network Designer”手工设计YOLO v2检测网络。有关更多信息,请参见设计YOLO v2检测网络(电脑视觉工具箱)

数据增强

在训练过程中,通过随机变换原始数据来提高网络的精度。通过使用数据增广,您可以向训练数据添加更多的种类,而不必实际增加已标记训练样本的数量。

转变通过水平随机翻转图像和相关的框标签来增加训练数据。注意,数据扩充并不适用于测试和验证数据。理想情况下,测试和验证数据应该能够代表原始数据,并且不作任何修改,以便进行公正的评估。

AugmentedTrainingData =变换(TrainingData,@ AugmentData);

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

%可视化增强图像。augmentedData =细胞(4,1);k = 1:4数据=读取(AugmentedTrainingData);AugmentedData {k} = insertshape(数据{1},'长方形',数据{2});重置(AugmentedTrainingData);结束图蒙太奇(AugmentedData,'毗邻',10)

预处理培训数据

预处理增强培训数据,以及为培训做准备的验证数据。

preprocessedtrainingdata = transform(augmentedtrainingdata,@(data)preprocessdata(数据,inputsize));preprocessedvalidationdata = transform(validationdata,@(data)preprocessdata(数据,inputsize));

阅读预处理的培训数据。

数据=读取(PreprocessedTrainingData);

显示图像和边界框。

我={1}数据;bbox ={2}数据;AnnotatedImage = instrshape(我,'长方形',bbox);AnnotatedImage = IMResize(AnnotatedImage,2);图imshow(AnnotatedImage)

火车yolo v2对象探测器

培训选项指定网络培训选项。放'vightationdata'到预处理的验证数据。放'checkpoinspath'到临时位置。这使得能够在培训过程中节省部分训练的探测器。如果培训被中断,例如通过停电或系统故障,您可以从已保存的检查点恢复培训。

选项=培训选项('sgdm'......“MiniBatchSize”, 16岁,......“InitialLearnRate”,1e-3,......'maxepochs'20,......'checkpoinspath',Tempdir,......'vightationdata', preprocessedValidationData);

Trainyolov2ObjectDetector.(电脑视觉工具箱)函数培训YOLO V2对象探测器如果doTraining是真的。否则,加载佩带的网络。

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

此示例在NVIDIA™Titan X GPU上验证了具有12 GB的内存。如果您的GPU内存较少,则可能会用完内存。如果发生这种情况,降低了“MiniBatchSize”使用培训选项函数。培训此网络使用此设置需要大约7分钟。培训时间因您使用的硬件而异。

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

我= imread ('highway.png');i = imresize(i,输入(1:2));[bboxes,scores] =检测(探测器,i);

显示结果。

i = InsertObjectAnnotation(i,'长方形',bboxes,得分);图imshow(i)

使用测试集评估探测器

在大量图像上评估训练的对象检测器以测量性能。Computer Vision Toolbox™提供对象检测器评估功能,以测量平均精度等常用度量(评估要求)和日志平均小姐率(评估法律).对于本例,使用平均精度度量来评估性能。平均精度提供了一个单一的数字,该数字包括探测器进行正确分类的能力(精度)和探测器找到所有相关对象的能力(回忆)。

对测试数据应用与训练数据相同的预处理转换。注意,数据扩充并不应用于测试数据。测试数据应能代表原始数据,且不作任何修改,以便进行公正的评估。

preprocessedtestdata = transform(testdata,@(data)preprocessdata(数据,inputsize));

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

detectionResults = detect(检测器,preprocesedtestdata);

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

[AP,Recall,Precision] =评估regetEcision(检测结果,预处理型Data);

精密/召回(PR)曲线突出显示检测器的次数变化的精确度。理想的精度在所有召回水平上都是1。使用更多数据可以帮助提高平均精度,但可能需要更多的培训时间。绘制PR曲线。

图绘图(召回,精确)xlabel('记起')ylabel('精确') 网格标题(sprintf ('平均精度=%.2f',ap))

代码生成

一旦检测器被训练和评估,您就可以为Yolov2ObjectDetector.使用GPU编码器™。看使用YOLO V2的对象检测的代码生成(GPU编码器)有关更多详细信息的示例。

金宝app支持功能

功能B = augmentData (A)%应用随机水平翻转和随机X/Y缩放。盒子,如果重叠高于0.25,则缩小界限的%缩小。还,%抖动图像颜色。b =单元格(大小(a));我=一个{1};sz =尺寸(i);如果numel(sz)==3 && sz(3) ==3 I = jitterColorHSV(I,......“对比”,0.2,......“颜色”,0,......'饱和',0.1,......'亮度', 0.2);结束%随机翻转和缩放图像。tform = ronstaffine2d('Xreflection',真的,'规模',[1 1.1]);rut = AffineOutputView(SZ,TForm,“BoundsStyle”'centeroutput');B {1} = imwarp (tform,我'OutputView',溃败);%如果需要,对框数据进行消毒。{2} = allersanitizeboxes(a {2},sz);对方框应用相同的转换。[b {2},索引] = bboxwarp(a {2},tform,rut,'重叠阈值', 0.25);B{3} ={3}(指标);只有在通过翘曲删除所有框时,才能返回原始数据。如果isempty(索引)b = a;结束结束功能Data = PreprocessData(数据,TargetSize)%将图像大小调整为targetsize。sz = size(数据{1},[1 2]);scale = targetsize(1:2)./ sz;数据{1} = IMResize(数据{1},targetsize(1:2));%如果需要,对框数据进行消毒。数据{2} = allersanitizedboxes(数据{2},sz);%调整到新图像大小的大小。数据{2} = bboxresize(数据{2},比例);结束

参考文献

[1] Redmon,Joseph和Ali Farhadi。“YOLO9000:更好,更快,更强。”在2017年电脑视觉和模式识别的IEEE会议(CVPR),6517-25。檀香山,嗨:ieee,2017. https://doi.org/10.1109/cvpr.2017.690。