这个例子展示了如何训练Faster R-CNN(带卷积神经网络的区域)对象检测器。
深度学习是一种强大的机器学习技术,可以用来训练健壮的目标检测器。有几种用于目标检测的深度学习技术,包括Faster R-CNN和你只看一次(YOLO) v2。这个例子使用。训练Faster R-CNN车辆检测器TRATHFASTERRCNNOOBJECTDETECTOR.
功能。有关更多信息,请参见对象检测。
下载佩带的探测器,以避免等待培训完成。如果你想训练探测器,请设置用圆形
变量为true。
doTraining = false;如果~ doTraining & & ~存在(“fasterRCNNResNet50EndToEndVehicleExample.mat”,“文件”)disp(下载预训练检测器(118 MB)…);pretrowsurl =“//www.tatmou.com/金宝appsupportfiles/vision/data/fasterRCNNResNet50EndToEndVehicleExample.mat”;websave (“fasterRCNNResNet50EndToEndVehicleExample.mat”, pretrainedURL);结尾
这个例子使用了一个包含295张图像的小标记数据集。许多图像来自加州理工学院汽车1999和2001年的数据集,可在加州理工学院计算视觉网站,由Pietro Perona创作并经许可使用。每个图像包含一个或两个标记过的车辆实例。一个小的数据集对于探索Faster R-CNN训练过程是有用的,但在实践中,需要更多的标记图像来训练一个鲁棒检测器。解压缩车辆图像并加载车辆地面真实数据。
解压缩vevicledatasetimages.zip.data = load(“vehicleDatasetGroundTruth.mat”);vevicledataset = data.vehicledataset;
车辆数据存储在一个两列的表中,其中第一列包含图像文件路径,第二列包含车辆边界框。
将数据集拆分为培训,验证和测试集。选择60%的培训数据,验证10%,以及用于测试培训的探测器的其余部分。
rng(0) shuffledinices = randperm(height(vehicleDataset));idx = floor(0.6 * height(vehicleDataset));trainingIdx = 1: idx;trainingDataTbl = vehicleDataset (shuffledIndices (trainingIdx):);validationIdx = idx+1: idx+1 + floor(0.1 * length(shuffledinices));validationDataTbl = vehicleDataset (shuffledIndices (validationIdx):);testdx = validationIdx(end)+1: length(shuffledinices);testDataTbl = vehicleDataset (shuffledIndices (testIdx):);
使用imageDatastore
和boxLabelDatastore
创建用于在培训和评估期间加载图像和标签数据的数据存储。
imdsTrain = imageDatastore (trainingDataTbl {:,'imagefilename'});bldsTrain = boxLabelDatastore (trainingDataTbl (:,“汽车”));imdsvalidation = imageageataStore(ValidationDatatbl {:,'imagefilename'});bldsValidation = boxLabelDatastore (validationDataTbl (:,“汽车”));imdsTest = imageDatastore (testDataTbl {:,'imagefilename'});Bldstest = boxlabeldataStore(testdatatbl(:,“汽车”));
合并图像和框标签数据存储。
trainingdata =联合(Imdstrain,Bldstrain);ValidationData = Combine(IMDSValidation,BLDSvalidation);testdata =组合(IMDSTEST,BLDSTEST);
显示其中一个培训图像和框标签。
数据=读取(TrainingData);i =数据{1};bbox = data {2};AnnotatedImage = instrshape(我,“矩形”, bbox);annotatedImage = imresize (annotatedImage 2);图imshow (annotatedImage)
更快的R-CNN对象检测网络由特征提取网络组成,后跟两个子网。特征提取网络通常是预磨削的CNN,例如Reset-50或Incepion V3。特征提取网络之后的第一个子网是培训的区域提案网络(RPN),以在可能存在对象中生成对象提案的区域。第二个子网络接受培训以预测每个对象提案的实际类别。
特征提取网络通常是一个预先训练的CNN(详细信息请参见预训练的深度神经网络(深度学习工具箱))。此示例使用Reset-50进行功能提取。您还可以使用其他备用网络,如MobileNet V2或Reset-18,具体取决于您的应用程序要求。
使用fasterRCNNLayers
要自动创建更快的R-CNN网络,给出备用特征提取网络。fasterRCNNLayers
需要你指定几个参数化Faster R-CNN网络的输入:
网络输入大小
锚箱
特征提取的网络
首先,指定网络输入大小。在选择网络输入大小时,考虑运行网络本身所需的最小大小,训练图像的大小,以及在选择的大小下处理数据所产生的计算代价。在可行的情况下,选择一个与训练图像的大小接近且大于网络所需的输入大小的网络输入大小。为了降低运行该示例的计算成本,将网络输入大小指定为[224 224 3],这是运行该网络所需的最小大小。
inputSize = [224 224 3];
注意,本例中使用的训练图像大于224乘224,大小不同,因此必须在训练前的预处理步骤中调整图像的大小。
下一步,使用estimateAnchorBoxes
根据训练数据中物体的大小来估计锚箱。为了考虑训练前图像的大小,调整训练数据的大小以估计锚框。使用变换
为了预处理训练数据,然后定义锚框的数量并估计锚框。
preprocessedtrainingdata =转换(TrainingData,@(数据)预处理数据(数据,inputSize));Numanchors = 3;anchorboxes = extimateanchorboxes(PreprocessedtrainingData,Numanchors)
锚盒=3×229 17 46 39 136 116
有关选择锚盒的更多信息,请参见根据训练数据估计锚箱(计算机Vision Toolbox™)和用于对象检测的锚盒。
现在,使用resnet50
加载预训练的ResNet-50模型
featureExtractionNetwork = resnet50;
选择'activation_40_relu'
作为特征提取层。这个特征提取层输出的特征图是向下采样的16倍。这个降采样量是空间分辨率和提取的特征强度之间的一个很好的权衡,因为从网络中进一步提取的特征以牺牲空间分辨率为代价来编码更强的图像特征。选择最优特征提取层需要进行实证分析。您可以使用分析
查找网络中其他潜在特征提取层的名称。
featureLayer ='activation_40_relu';
定义要检测的类的数量。
numClasses =宽度(vehicleDataset) 1;
创建Faster R-CNN目标检测网络。
lgraph = fasterRCNNLayers (inputSize numClasses、anchorBoxes featureExtractionNetwork, featureLayer);
您可以使用可视化的网络分析
或深度学习工具箱™中的深度网络设计器。
如果需要对Faster R-CNN网络架构进行更多的控制,可以使用Deep network Designer手动设计Faster R-CNN检测网络。有关更多信息,请参见Getting Started with R-CNN, Fast R-CNN, and Faster R-CNN。
数据增强技术通过在训练过程中对原始数据进行随机变换来提高网络的精度。通过使用数据增强,您可以添加更多的变化到训练数据,而不必实际增加标记训练样本的数量。
使用变换
通过水平翻转图像和相关框标签来增加培训数据。请注意,数据增强不适用于测试和验证数据。理想情况下,测试和验证数据代表原始数据,并未被修改以进行无偏的评估。
augmentedTrainingData =变换(trainingData @augmentData);
多次读取相同的图像并显示增强的训练数据。
AugmentedData = Cell(4,1);为了k = 1:4数据=读取(AugmentedTrainingData);AugmentedData {k} = insertshape(数据{1},“矩形”、数据{2});重置(augmentedTrainingData);结尾图蒙太奇(augmentedData,“BorderSize”, 10)
预处理增强培训数据,以及为培训做准备的验证数据。
trainingData =变换(augmentedTrainingData @(数据)preprocessData(数据、inputSize));validationData =变换(validationData @(数据)preprocessData(数据、inputSize));
读取预处理数据。
数据=读取(TrainingData);
显示图像和边框框。
i =数据{1};bbox = data {2};AnnotatedImage = instrshape(我,“矩形”, bbox);annotatedImage = imresize (annotatedImage 2);图imshow (annotatedImage)
使用trainingOptions
指定网络训练选项。集“ValidationData”
到预处理的验证数据。集“CheckpointPath”
到一个临时地点。这使得在训练过程中可以保存部分训练过的探测器。如果培训被中断,例如由于停电或系统故障,您可以从保存的检查点恢复培训。
选择= trainingOptions (“个”,…“MaxEpochs”10…'minibatchsize'2,…'italllearnrate'1 e - 3,…“CheckpointPath”tempdir,…“ValidationData”, validationData);
使用TRATHFASTERRCNNOOBJECTDETECTOR.
训练更快的R-CNN对象探测器如果用圆形
是真的。否则,加载预训练的网络。
如果用圆形%训练Faster R-CNN检测器。%*调整负极源性和积极的索引,以确保培训样本的百分比与地面真相紧密重叠。[detector, info] = trainFasterRCNNObjectDetector(trainingData,lgraph,options,…“NegativeOverlapRange”,[0 0.3],…'积极透过的',[0.6 1]);别的为示例的%负载净化探测器。pretrained =负载(“fasterRCNNResNet50EndToEndVehicleExample.mat”);探测器= pretrained.detector;结尾
此示例是在具有12gb内存的Nvidia(TM) Titan X GPU上验证的。训练网络大约花了20分钟。训练时间取决于你使用的硬件。
作为快速检查,在一个测试图像上运行探测器。确保将图像调整为与培训图像相同的大小。
我= imread (testDataTbl.imageFilename {3});我= imresize(我inputSize (1:2));[bboxes,分数]=检测(探测器,I);
显示结果。
我= insertObjectAnnotation (,“矩形”bboxes,分数);图imshow(我)
在大量图像上评估训练后的目标检测器的性能。计算机视觉工具箱™提供对象检测器评估功能,以衡量一般指标,如平均精度(evaluateDetectionPrecision
)和对数平均失误率(evaluateDetectionMissRate
)。对于本例,使用平均精度度量来评估性能。平均精度提供一个单一的数字,该数字包含检测器做出正确分类的能力(精度)和检测器找到所有相关对象的能力(召回率)。
对测试数据应用与训练数据相同的预处理转换。
testdata = transform(testdata,@(data)preprocessdata(数据,inputsize));
在所有测试图像上运行检测器。
detectionResults =检测(testData探测器,“MinibatchSize”4);
使用平均精度度量评估对象检测器。
[ap, recall, precision] = evaluateDetectionPrecision(detectionResults,testData);
精确度/召回率(PR)曲线强调了探测器在不同召回率水平下的精确度。在所有召回级别上,理想的精度是1。使用更多的数据可以帮助提高平均精度,但可能需要更多的训练时间。绘制PR曲线。
图绘制(召回、精密)包含(“回忆”) ylabel (“精度”网格)在标题(Sprintf('平均精度= %.2f'据美联社)),
函数数据= upmentData(数据)%随机翻转图像和水平边界框。tform = randomAffine2d (“XReflection”,真的);sz = size(数据{1});rut = AffineOutputView(SZ,TForm);数据{1} = imwarp(数据{1},tform,'OutputView',溃败);%清除框数据(如果需要)。数据{2} = allersanitizedboxes(数据{2},sz);%翘曲盒。数据{2} = bboxwarp(数据{2},tform,rut);结尾函数Data = PreprocessData(数据,TargetSize)%调整图像和边框的大小为targetSize。Sz = size(data{1},[1 2]);规模= targetSize(1:2)。/深圳;{1} = imresize数据(数据{1},targetSize (1:2));%清除框数据(如果需要)。数据{2} = allersanitizedboxes(数据{2},sz);%调整大小框。{2} = bboxresize数据(数据{2},规模);结尾
[1]何凯,任晓东。更快的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] Girshick, R。“快速R-CNN。”2015年IEEE计算机愿景会议的诉讼程序。Santiago,智利,2015年12月,第1440-1448页。
[4] Zitnick,C.L和P. Dollar。“边缘盒子:从边缘找到对象提案。”欧洲计算机视觉会议。2014年9月,瑞士苏黎世,第391-405页。
[5] Uijlings,J.R. R.,K .. A.Van de Sande,T.Gevers和A. W. M.熔手。“选择性搜索对象识别。”国际计算机视觉杂志。第104卷,第2期,2013年9月,第154-171页。
探测
|evaluateDetectionMissRate
|evaluateDetectionPrecision
|fasterrcnnobjectdetector.
|fastRCNNObjectDetector
|insertObjectAnnotation
|rcnobjectdetector
|TRATHFASTERRCNNOOBJECTDETECTOR.
|trainFastRCNNObjectDetector
|trainRCNNObjectDetector
|trainingOptions
(深度学习工具箱)|Trainnetwork.
(深度学习工具箱)