主要内容

基于YOLO v2深度学习的目标检测

此示例显示如何训练you only look once(YOLO)v2对象检测器。

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

下载预训练检测器

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

doTraining=false;如果~doTraining&&~存在('yolov2resnet50vehiceexample_19b.mat',“文件”)disp('下载预训练检测器(98 MB)…'); 预训练='//www.tatmou.com/金宝appsupportfiles/vision/data/yolov2ResNet50VehicleExample_19b.mat';韦伯斯韦('yolov2resnet50vehiceexample_19b.mat',训练前;终止

加载数据集

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

解压vehicleDatasetImages.zip数据=负载(“vehicleDatasetGroundTruth.mat”);vehicleDataset=data.vehicleDataset;

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

%显示第一个数据集的行。车辆数据集(1:4,:)
ans=4×2表目前,UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUjpg'}{1×4双精度}
%将完整路径添加到本地车辆数据文件夹。vehicleDataset.imageFilename=fullfile(pwd,vehicleDataset.imageFilename);

将数据集拆分为训练集、验证集和测试集。选择60%的数据用于训练,10%用于验证,其余数据用于测试经过训练的检测器。

rng(0);ShuffledDices=randperm(高度(车辆数据集));idx=地板(0.6*长度(ShuffledDices));trainingIdx=1:idx;trainingDataTbl=车辆数据集(ShuffledDices(trainingIdx),:;validationIdx=idx+1:idx+1+地板(0.1*长度(ShuffledDices));validationDataTbl=车辆数据集(ShuffledDices(validationIdx),:);testIdx=validationIdx(end)+1:length(shuffleddinces);testDataTbl=vehicleDataset(shuffleddinces(testIdx),:);

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

imdstrain = imageageataStore(trainingDatatbl {:,“imageFilename”});bldsTrain=boxLabelDatastore(培训数据TBL(:,“车辆”));imdsValidation=imageDatastore(validationDataTbl{:,“imageFilename”});bldsValidation=boxLabelDatastore(validationDataTbl(:,“车辆”));imdstest = imageageataStore(testdatatbl {::,“imageFilename”}); bldsTest=boxLabelDatastore(testDataTbl(:,“车辆”));

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

培训数据=联合收割机(imdsTrain,bldsTrain);验证数据=联合收割机(imdsValidation,bldsValidation);测试数据=联合收割机(imdsTest,bldsTest);

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

数据=读取(训练数据);I=数据{1};bbox=数据{2};annotatedImage=insertShape(I,“矩形”,bbox);annotatedImage=imresize(annotatedImage,2);地物imshow(annotatedImage)

创建YOLO v2对象检测网络

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

使用约洛夫2层函数用于在给定预训练的ResNet-50特征提取网络的情况下自动创建YOLO v2对象检测网络。约洛夫2层要求您指定几个用于参数化YOLO v2网络的输入:

  • 网络输入大小

  • 锚箱

  • 特征提取网络

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

inputSize=[2242243];

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

numClasses=宽度(车辆数据集)-1;

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

接下来,使用估计锚箱根据训练数据中对象的大小估计锚定框。若要考虑训练前图像的大小调整,请调整训练数据的大小以估计锚定框。使用使改变对训练数据进行预处理,然后定义锚盒的数量并估计锚盒。使用支持函数将训练数据调整为网络的输入图像大小金宝app预处理数据.

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
平均IOU=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(输入大小、numclass、锚箱、featureExtractionNetwork、featureLayer);

您可以使用分析网络或来自Deep Learning工具箱的Deep Network Designer™.

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

数据扩充

数据增强用于通过在培训期间随机转换原始数据来提高网络精度。通过使用数据增强,您可以为培训数据添加更多品种而实际上必须增加标记的训练样本的数量。

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

augmentedTrainingData=转换(trainingData,@augmentData);

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

%可视化增强图像。增强数据=单元(4,1);对于k=1:4数据=读取(增强训练数据);augmentedData{k}=insertShape(数据{1}),“矩形”,数据{2});重置(增强训练数据);终止图蒙太奇(增强数据,'毗邻',10)

训练数据预处理

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

预处理训练数据=转换(增强训练数据,@(数据)预处理数据(数据,输入大小));预处理验证数据=转换(验证数据,@(数据)预处理数据(数据,输入大小));

读取预处理的训练数据。

数据=读取(预处理的训练数据);

显示图像和边界框。

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

列车YLOV2目标探测器

使用培训选项指定网络培训选项。设置“验证数据”到预处理的验证数据。设置“检查点路径”到一个临时地点。这样可以在培训过程中保存部分经过培训的探测器。如果培训被中断,例如断电或系统故障,您可以从保存的检查点恢复培训。

选项=培训选项(“sgdm”,...“MiniBatchSize”,16,....“初始学习率”,1e-3,...“MaxEpochs”,20,...“检查点路径”,Tempdir,...“验证数据”,预处理验证数据);

使用Trainyolov2oObject检测器用于培训YLO v2目标探测器的功能,如果溺爱是真的。否则,加载佩带的网络。

如果溺爱%训练yolo v2探测器。[检测器,信息]=TrainyLov2Object检测器(预处理的训练数据、lgraph、选项);其他的%以负载预训练检测器为例。预训练=负荷('yolov2resnet50vehiceexample_19b.mat'); 检测器=预训练检测器;终止

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

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

I=imread(“高速公路,巴布亚新几内亚”); I=imresize(I,输入大小(1:2));[b盒,分数]=检测(检测器,I);

显示结果。

I=插入对象注释(I,“矩形”,b框,分数);图1(I)

使用测试集评估探测器

在大量图像上评估经过训练的目标检测器,以测量性能。计算机视觉工具箱™ 提供对象检测器评估功能,以测量常见指标,如平均精度(评估检测精度)并记录平均未命中率(评估法律)。在此示例中,使用平均精度度量来评估性能。平均精度提供了一个数字,该数字包含检测器进行正确分类的能力(精度)和检测器查找所有相关对象的能力(召回)。

将与训练数据的测试数据应用相同的预处理变换。请注意,数据增强不适用于测试数据。测试数据应代表原始数据,并未被修改以进行无偏析的评估。

preprocessedTestData=转换(testData,@(data)preprocessData(data,inputSize));

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

检测=检测(检测器,预处理型Data);

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

[ap,召回率,精密度]=评估检测精密度(检测结果,预处理检测数据);

精度/召回(PR)曲线突出显示了检测器在不同召回水平下的精度。理想的精度在所有召回水平下为1。使用更多数据有助于提高平均精度,但可能需要更多的训练时间。绘制PR曲线。

图表(召回率、精度)xlabel(“召回”)伊拉贝尔(“精确性”)网格在…上头衔(斯普林特)('平均精度=%.2f'(美联社)

代码生成

探测器培训并评估后,您可以生成代码Yolov2物体检测器使用GPU编码器™. 看见使用YOLO v2生成目标检测代码(GPU编码器)有关更多详细信息,请参见示例。

金宝app辅助功能

作用B=数据(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=随机仿射2d(“外部选择”符合事实的“规模”,[1.1]);路由=仿射输出视图(sz,tform,“邦兹风格”,“中心输出”); B{1}=imwarp(I,tform,“OutputView”,溃败);%如果需要,请清理方框数据。A{2}=helpersanizizeboxes(A{2},sz);%对框应用相同的变换。[B{2},索引]=bboxwarp(A{2},tform,rout,“重叠阈值”,0.25); B{3}=A{3}(指数);%仅当通过扭曲移除所有框时,才返回原始数据。如果isempty(指数)B=A;终止终止作用数据=预处理数据(数据,targetSize)%将图像和边界框调整为targetSize。sz=大小(数据{1}[12]);比例=目标尺寸(1:2)。/sz;data{1}=imresize(data{1},targetSize(1:2));%如果需要,请清理方框数据。数据{2}=助手操作系统(数据{2},sz);%将框大小调整为新的图像大小。数据{2}=bboxresize(数据{2},比例);终止

参考

[1] 雷蒙、约瑟夫和阿里·法哈迪。YOLO9000:更好、更快、更强2017年IEEE计算机视觉和模式识别会议(CVPR), 6517–25. 檀香山,你好:IEEE,2017年。https://doi.org/10.1109/CVPR.2017.690.