主要内容

训练一个深度学习车辆检测器

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

概述

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

深度学习是一种强大的机器学习技术,可以用来训练健壮的目标探测器。有几种用于目标检测的深度学习技术,包括Faster R-CNN和you only look once (YOLO) v2。这个例子训练一个更快的R-CNN车辆检测器使用trainFasterRCNNObjectDetector函数。有关更多信息,请参见对象检测

下载Pretrained探测器

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

doTrainingAndEval = false;如果~ doTrainingAndEval & & ~存在(“fasterRCNNResNet50EndToEndVehicleExample.mat”“文件”) disp (“下载预训练探测器(118 MB)……”);pretrainedURL =“//www.tatmou.com/金宝appsupportfiles/vision/data/fasterRCNNResNet50EndToEndVehicleExample.mat”;websave (“fasterRCNNResNet50EndToEndVehicleExample.mat”, pretrainedURL);结束

加载数据集

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

解压缩vehicleDatasetImages.zipdata =负载(“vehicleDatasetGroundTruth.mat”);vehicleDataset = data.vehicleDataset;

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

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

rng(0) shuffledIdx = randperm(height(vehicleDataset)));idx = floor(0.6 * height(vehicleDataset));trainingDataTbl = vehicleDataset (shuffledIdx (1: idx):);testDataTbl = vehicleDataset (shuffledIdx (idx + 1:结束):);

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

imdsTrain = imageDatastore (trainingDataTbl {:,“imageFilename”});bldsTrain = boxLabelDatastore (trainingDataTbl (:,“汽车”));imdsTest = imageDatastore (testDataTbl {:,“imageFilename”});bldsTest = boxLabelDatastore (testDataTbl (:,“汽车”));

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

trainingData =结合(imdsTrain bldsTrain);testData =结合(imdsTest bldsTest);

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

data =阅读(trainingData);我={1}数据;bbox ={2}数据;annotatedImage = insertShape(我“矩形”, bbox);annotatedImage = imresize (annotatedImage 2);图imshow (annotatedImage)

创建更快的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 = [224 224 3];

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

下一步,使用estimateAnchorBoxes根据训练数据中对象的大小估计锚盒。为了考虑在训练前调整图像的大小,调整用于估计锚盒的训练数据的大小。使用变换对训练数据进行预处理,定义锚盒的数量并对锚盒进行估计。

preprocesedtrainingdata = transform(trainingData, @(data)preprocessData(data,inputSize));numAnchors = 4;anchorBoxes = estimateAnchorBoxes (preprocessedTrainingData numAnchors)
anchorBoxes =4×296 91 68 65 150 125 38 29

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

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

featureExtractionNetwork = resnet50;

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

featureLayer =“activation_40_relu”

定义要检测的类的数量。

numClasses =宽度(vehicleDataset) 1;

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

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

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

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

数据增加

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

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

augmentedTrainingData =变换(trainingData @augmentData);

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

augmentedData =细胞(4,1);k = 1:4 data = read(augmentedTrainingData);augmentedData {k} = insertShape(数据{1},“矩形”、数据{2});重置(augmentedTrainingData);结束图蒙太奇(augmentedData,“BorderSize”, 10)

训练数据进行预处理

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

trainingData =变换(augmentedTrainingData @(数据)preprocessData(数据、inputSize));

读取预处理后的数据。

data =阅读(trainingData);

显示图像和框的边界框。

我={1}数据;bbox ={2}数据;annotatedImage = insertShape(我“矩形”, bbox);annotatedImage = imresize (annotatedImage 2);图imshow (annotatedImage)

火车快R-CNN

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

选择= trainingOptions (“个”...“MaxEpochs”7...“MiniBatchSize”,1,...“InitialLearnRate”1 e - 3,...“CheckpointPath”, tempdir);

使用trainFasterRCNNObjectDetector训练更快的R-CNN对象检测器doTrainingAndEval是真的。否则,加载预训练的网络。

如果doTrainingAndEval%训练更快的R-CNN检测器。% *调整负重叠范围和正重叠范围,以确保%表示训练样本与ground truth紧密重叠。[检测器,信息]= trainFasterRCNNObjectDetector(trainingData,lgraph,options,...“NegativeOverlapRange”, 0.3 [0],...“PositiveOverlapRange”(0.6 - 1));其他的%负载预训练检测器为例。pretrained =负载(“fasterRCNNResNet50EndToEndVehicleExample.mat”);探测器= pretrained.detector;结束

这个例子是在具有12gb内存的Nvidia(TM) Titan X GPU上验证的。训练网络大约花了20分钟。训练时间取决于你使用的硬件。

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

我= imread (testDataTbl.imageFilename {1});我= imresize(我inputSize (1:2));[bboxes,分数]=检测(探测器,I);

显示结果。

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

使用测试集评估检测器

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

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

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

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

如果doTrainingAndEval detectionResults = detect(检测器,testData,“MinibatchSize”4);其他的%负载预训练检测器为例。pretrained =负载(“fasterRCNNResNet50EndToEndVehicleExample.mat”);detectionResults = pretrained.detectionResults;结束

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

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

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

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

金宝app支持功能

函数data = augmentData(数据)水平随机翻转图像和边框。tform = randomAffine2d (“XReflection”,真正的);Sz = size(data{1},[1 2]);rout = affineOutputView(sz, tform);{1} = imwarp数据(数据{1}、tform“OutputView”,溃败);%如果需要,对框数据进行消毒。数据{2}= helperSanitizeBoxes(数据{2},sz);%经盒。{2} = bboxwarp数据(数据{2}、tform溃败);结束函数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},规模);结束

参考文献

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

R.格希克、J.多纳休、T.达雷尔和J.马利克。精确目标检测和语义分割的丰富特征层次2014 IEEE计算机视觉与模式识别会议论文集.Columbus, OH, June 2014, pp. 580-587。

[3] Girshick, R。“快速R-CNN。”2015 IEEE计算机视觉国际会议论文集.智利圣地亚哥,2015年12月,第1440-1448页。

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

J. R. R., K. E. A. van de Sande, T. Gevers, and A. W. M. Smeulders。"物体识别的选择性搜索"国际计算机视觉杂志.第104卷第2期,2013年9月,154-171页。

另请参阅

功能

相关的话题