主要内容

培训深度学习车辆检测器

这个例子展示了如何使用深度学习训练基于视觉的车辆检测器。

概述

使用计算机视觉的车辆检测是跟踪ego车辆周围车辆的重要组成部分。许多自动驾驶应用需要检测和跟踪车辆的能力,例如前向碰撞警告、自适应巡航控制和自动车道保持。自动驾驶工具箱™ 提供预训练车辆检测器(车辆检测器车辆检测器)以实现快速原型设计。然而,预先训练的模型可能并不适合每一个应用程序,需要从头开始训练。这个例子展示了如何使用深度学习从头开始训练车辆检测器。

深度学习是一种强大的机器学习技术,您可以使用它来训练强健的目标检测器。存在几种用于目标检测的深度学习技术,包括更快的R-CNN和you only look once(YLO)v2。此示例使用列车快速故障检测器函数。有关更多信息,请参阅对象检测

下载预训练检测器

下载预训练的探测器,以避免等待训练完成。如果要训练探测器,请设置多特兰宁安迪瓦尔变量设置为true。

doTrainingAndEval=false;如果~doTrainingAndEval&&~存在('FasterrRcnnResnet50EndToEndToEndVehicleExample.mat'“文件”)disp('下载预训练检测器(118 MB)…');预训练='//www.tianjin-qmedu.com/万博1manbetxsupportfiles/vision/data/fasterRCNNResNet50EndToEndVehicleExample.mat';websave ('FasterrRcnnResnet50EndToEndToEndVehicleExample.mat', pretrainedURL);终止

加载数据集

本例使用了一个包含295幅图像的小标记数据集。其中许多图像来自加州理工大学1999年和2001年的数据集,可在加州理工大学计算机视觉网站上获得网站,由Pietro Perona创建并经许可使用。每个图像包含一个或两个标记的车辆实例。小数据集有助于探索更快的R-CNN训练过程,但在实践中,需要更多的标记图像来训练鲁棒检测器。解压缩车辆图像并加载车辆地面真实数据。

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

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

将数据集拆分为用于培训探测器的训练集和用于评估探测器的测试集。选择60%的数据进行培训。用剩下的进行评估。

rng(0)ShuffledDX=randperm(高度(车辆数据集));idx=地板(0.6*高度(车辆数据集));trainingDataTbl=车辆数据集(ShuffledDX(1:idx),:);testDataTbl=车辆数据集(ShuffledDX(idx+1:end),:);

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

imdsTrain=图像数据存储(trainingDataTbl{:,“imageFilename”});bldsTrain=boxLabelDatastore(培训数据TBL(:,“车辆”)); imdsTest=imageDatastore(testDataTbl{:,“imageFilename”});bldsTest=boxLabelDatastore(testDataTbl(:,“车辆”));

结合图像和盒标签数据存储。

训练数据=联合收割机(imdsTrain,bldsTrain);测试数据=联合收割机(imdsTest,bldsTest);

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

数据=读取(训练数据);I=数据{1};bbox=数据{2};annotatedImage=insertShape(I,“矩形”,bbox);annotatedImage=imresize(annotatedImage,2);图imshow(标注尺寸图像)

创建更快的R-CNN检测网络

更快的R-CNN目标检测网络由特征提取网络和两个子网络组成。特征提取网络通常是预训练的CNN,如ResNet-50或Inception v3。特征提取网络之后的第一个子网络是区域建议网络(RPN)训练生成对象建议-图像中可能存在对象的区域。第二个子网络训练预测每个对象建议的实际类别。

特征提取网络通常是预训练的CNN(有关详细信息,请参阅预训练深度神经网络(深度学习工具箱))。此示例使用ResNet-50进行特征提取。您也可以使用其他预训练网络,如MobileNet v2或ResNet-18,具体取决于您的应用程序要求。

使用fasterRCNNLayers为了创建一个更快的R-CNN网络,自动给定一个预训练的特征提取网络。fasterRCNNLayers要求您指定几个输入,以参数化更快的R-CNN网络:

  • 网络输入大小

  • 锚箱

  • 特征提取网络

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

inputSize=[2242243];

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

接下来,使用estimateAnchorBoxes根据训练数据中对象的大小估计锚定框。若要考虑训练前图像的大小调整,请调整训练数据的大小以估计锚定框。使用使改变对训练数据进行预处理,然后定义锚箱的数量并估计锚箱。

预处理训练数据=转换(训练数据,@(数据)预处理数据(数据,输入大小));numAnchors=4;锚点箱=估计锚点箱(预处理训练数据,numAnchors)
锚箱=4×296 91 68 65 150 125 38 29

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

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

featureExtractionNetwork = resnet50;

选择“激活\u 40\u relu”作为特征提取层。该特征提取层输出特征映射,向下采样的因子为16。这种向下采样量是空间分辨率和提取特征强度之间的一个很好的权衡,因为进一步向下提取的特征以空间分辨率为代价编码更强的图像特征。选择最优的特征提取层需要实证分析。您可以使用分析网络查找网络中其他潜在特征提取图层的名称。

特征层=“激活\u 40\u relu”

定义要检测的类的数量。

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

创建更快的R-CNN对象检测网络。

LGRAPHE=fasterRCNNLayers(输入大小、NumClass、锚箱、featureExtractionNetwork、featureLayer);

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

如果更快的R-CNN网络架构需要更多的控制,使用深度网络设计器手动设计更快的R-CNN检测网络。有关更多信息,请参见开始与R-CNN,快速的R-CNN,更快的R-CNN

数据增加

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

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

augmentedTrainingData =变换(trainingData @augmentData);

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

增强数据=单元(4,1);对于k=1:4 data=read(augmentedTrainingData);augmentedData{k}=insertShape(data{1}),“矩形”,数据{2});重置(增强训练数据);终止图蒙太奇(增强数据,“边界大小”, 10)

训练数据进行预处理

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

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

读取预处理的数据。

数据=读取(训练数据);

显示图像和框的边界框。

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

火车快R-CNN

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

选项=培训选项(“sgdm”...“MaxEpochs”7...“MiniBatchSize”1....“初始学习率”1 e - 3,...“检查点路径”, tempdir);

使用列车快速故障检测器训练更快的R-CNN目标探测器,如果多特兰宁安迪瓦尔为true。否则,加载预训练网络。

如果多特兰宁安迪瓦尔%训练更快的R-CNN探测器。%*调整负超程和正超程,以确保%训练样本与地面真相紧密重叠。[detector,info]=列车FastErrorCnnObjectDetector(列车数据、lgraph、选项、,...“负超范围”,[0 0.3],...“正超范围”,[0.6 1]);其他的%以负载预训练检测器为例。预训练=负荷('FasterrRcnnResnet50EndToEndToEndVehicleExample.mat');探测器= pretrained.detector;终止

此示例已在具有12GB内存的Nvidia(TM)Titan X GPU上验证。训练网络大约需要20分钟。培训时间因您使用的硬件而异。

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

I=imread(testDataTbl.imageFilename{1});I=imresize(I,输入大小(1:2));[b盒,分数]=检测(检测器,I);

显示结果。

我= insertObjectAnnotation (,“矩形”,b框,分数);图1(I)

使用测试集评估探测器

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

对测试数据应用与训练数据相同的预处理转换。

testData=转换(testData,@(data)预处理数据(data,inputSize));

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

如果doTrainingAndEval检测结果=检测(检测器、测试数据、,“MinibatchSize”,4);其他的%以负载预训练检测器为例。预训练=负荷('FasterrRcnnResnet50EndToEndToEndVehicleExample.mat');检测结果=预训练。检测结果;终止

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

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

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

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

万博1manbetx支持功能

作用data = augmentData(数据)水平随机翻转图像和边框。tform = randomAffine2d (“XReflection”,true);sz=size(数据{1}[12]);rout=affineOutputView(sz,tform);data{1}=imwarp(数据{1},tform,“OutputView”,溃败);%如果需要,请清理方框数据。数据{2}=助手操作系统(数据{2},sz);%曲轴箱。数据{2}=bboxwarp(数据{2},tform,rout);终止作用targetSize data = preprocessData(数据)%将图像和边界框调整为targetSize。Sz = size(data{1},[1 2]);规模= targetSize(1:2)。/深圳;{1} = imresize数据(数据{1},targetSize (1:2));%如果需要,请清理方框数据。数据{2}=助手操作系统(数据{2},sz);%调整盒子。{2} = bboxresize数据(数据{2},规模);终止

工具书类

Ren, S., K. He, R. Gershick, J. Sun。更快的R-CNN:面向区域提议网络的实时目标检测模式分析和机器智能的IEEE交易第39卷,第6期,2017年6月,第1137-1149页。

[2] Girshick,R.,J.Donahue,T.Darrell和J.Malik.“用于精确目标检测和语义分割的丰富特征层次。”2014年IEEE计算机视觉和模式识别会议记录哥伦布,俄亥俄州,2014年6月,第580-587页。

[3] 快速R-CNN2015年IEEE计算机视觉国际会议记录智利圣地亚哥,2015年12月,第1440-1448页。

C. L.齐特尼克和P. Dollar。"边缘框:从边缘定位对象"欧洲计算机视觉会议.瑞士苏黎世,2014年9月,第391-405页。

[5] 《物体识别的选择性搜索》国际计算机视觉杂志第104卷第2期,2013年9月,第154-171页。

另见

功能

相关话题