主要内容

火车深度学习车辆检测器

这个例子展示了如何使用深度学习训练建立车辆检测器。

概述

车辆使用计算机视觉检测是一个重要的组件在自我跟踪车辆车辆。车辆检测和跟踪的能力是许多自主驾驶所需的应用程序,比如碰撞警告,自适应巡航控制系统,自动车道保持。自动驾驶工具箱™提供pretrained车辆检测器(vehicleDetectorFasterRCNNvehicleDetectorACF),使快速原型。然而,pretrained模型可能不适合每一个应用程序,需要你从头开始训练。这个例子展示如何从头开始培训一个车辆检测器使用深度学习。

深度学习是一个功能强大的机器学习技术,你可以用它来训练健壮的对象探测器。几个深度学习对象检测存在的技术,包括更快的R-CNN和你只看一次(YOLO)意思v2。这个例子火车更快R-CNN车辆探测器使用trainFasterRCNNObjectDetector函数。有关更多信息,请参见对象检测

下载Pretrained探测器

下载pretrained检测器来避免等待培训完成。如果你想训练检测器,设置doTrainingAndEval变量为true。

doTrainingAndEval = false;如果~ doTrainingAndEval & & ~存在(“fasterRCNNResNet50EndToEndVehicleExample.mat”,“文件”)disp (“下载pretrained检测器(118 MB)…”);pretrainedURL =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/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(高度(vehicleDataset));地板idx =(0.6 *高(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对象检测网络是由特征提取的神经网络两个子网紧随其后。特征提取网络通常是一个pretrained CNN,如ResNet-50或初始v3。特征提取后的第一个子网网络地区建议网络(RPN)训练生成对象的建议——在图像领域对象都可能存在。第二个子网是训练来预测实际的类的每个对象的建议。

特征提取网络通常是一个pretrained CNN(详情,请参阅Pretrained深层神经网络(深度学习工具箱))。这个示例使用ResNet-50特征提取。您还可以使用其他pretrained网络如MobileNet v2或ResNet-18,取决于您的应用程序需求。

使用fasterRCNNLayers自动创建一个更快R-CNN网络pretrained特征提取网络。fasterRCNNLayers需要您指定几个输入参数化更快R-CNN网络:

  • 网络输入大小

  • 锚箱

  • 特征提取的网络

首先,指定网络输入的大小。在选择网络输入大小,考虑运行网络本身所需的最小大小,训练图像的大小,计算成本的处理数据选择大小。在可行的情况下,选择一个网络输入大小接近训练图像的大小和大于输入大小所需的网络。降低运行成本的计算示例中,指定一个网络输入的大小(224 224),这是网络运行所需的最小大小。

inputSize = (224 224 3);

注意,在本例中使用的训练图像是比224 - - 224和大小不同,所以你必须调整图像的预处理步骤之前的训练。

下一步,使用estimateAnchorBoxes估计锚箱基于训练数据中的对象的大小。之前考虑到图像的调整训练,调整估算锚箱的训练数据。使用变换训练数据进行预处理,然后定义锚箱的数量估计锚箱。

preprocessedTrainingData =变换(trainingData @(数据)preprocessData(数据、inputSize));numAnchors = 4;anchorBoxes = estimateAnchorBoxes (preprocessedTrainingData numAnchors)
anchorBoxes =4×296 91 68 65 150 125 38 29

在选择锚箱的更多信息,见从训练数据估计锚箱(计算机视觉工具箱™)锚箱对象检测

现在,使用resnet50加载pretrained ResNet-50模型。

featureExtractionNetwork = resnet50;

选择“activation_40_relu”特征提取层。这个特征提取层输出特征图谱downsampled的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 =阅读(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是真的。否则,加载pretrained网络。

如果doTrainingAndEval%火车R-CNN探测器越快。% * NegativeOverlapRange和PositiveOverlapRange确保调整%,训练样本与地面紧密重叠的真理。[探测器,信息]= trainFasterRCNNObjectDetector (trainingData lgraph,选项,“NegativeOverlapRange”,0.3 [0],“PositiveOverlapRange”(0.6 - 1));其他的%负载pretrained检测器的例子。pretrained =负载(“fasterRCNNResNet50EndToEndVehicleExample.mat”);探测器= pretrained.detector;结束

这个例子验证了的Nvidia GPU (TM)泰坦X 12 GB的内存。网络培训花了大约20分钟。培训时间要取决于您所使用的硬件。

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

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

显示结果。

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

评估探测器使用测试集

评估培训对象探测器在大组图像测量性能。计算机视觉工具箱™提供了对象探测器评价函数来测量常见的指标,如平均精度(evaluateDetectionPrecision)和log-average错过率(evaluateDetectionMissRate)。对于这个示例,使用平均精度指标来评估性能。平均精度提供了一个数字,包含探测器进行正确分类的能力(精度)和探测器的能力找到所有相关对象(回忆)。

应用相同的预处理变换的测试数据作为训练数据。

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

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

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

评估对象探测器使用的平均精度指标。

[据美联社、召回、精密]= evaluateDetectionPrecision (detectionResults testData);

精密/回忆(PR)曲线突显出准确的探测器在不同级别的召回。理想的精度是1在所有回忆的水平。使用更多的数据可以帮助提高平均精度,但可能需要更多的训练时间。策划公关曲线。

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

万博1manbetx支持功能

函数data = augmentData(数据)%随机翻转图像水平和边界框。tform = randomAffine2d (“XReflection”,真正的);深圳=大小(数据{1}、(1 2));tform溃败= affineOutputView(深圳);{1}= imwarp数据(数据{1}、tform“OutputView”,溃败);%清洁箱数据,如果需要的话。{2}= helperSanitizeBoxes数据(数据{2},sz);%经盒。{2}= bboxwarp数据(数据{2}、tform溃败);结束函数targetSize data = preprocessData(数据)% targetSize调整图像和边界框。深圳=大小(数据{1}、(1 2));规模= targetSize(1:2)。/深圳;{1}= imresize数据(数据{1},targetSize (1:2));%清洁箱数据,如果需要的话。{2}= helperSanitizeBoxes数据(数据{2},sz);%调整盒子。{2}= bboxresize数据(数据{2},规模);结束

引用

[1]任,S。,K. He, R. Gershick, and J. Sun. "Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks."IEEE模式分析与机器智能的事务。39卷,问题6,2017年6月,第1137 - 1149页。

[2]Girshick, R。,J. Donahue, T. Darrell, and J. Malik. "Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation."学报2014年IEEE计算机视觉与模式识别会议。哥伦布,哦,2014年6月,第580 - 587页。

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

[4]Zitnick c . L。美元,p。“边缘盒:从边缘定位对象的建议。”欧洲计算机视觉。瑞士苏黎世,2014年9月,页391 - 405。

[5]Uijlings, j·R·R。,K. E. A. van de Sande, T. Gevers, and A. W. M. Smeulders. "Selective Search for Object Recognition."国际计算机视觉杂志》上。2号卷。104年,2013年9月,页154 - 171。

另请参阅

功能

相关的话题