主要内容

培训对象探测器使用R-CNN深度学习

这个例子展示了如何使用深度学习和培训对象探测器R-CNN与卷积神经网络(地区)。

概述

这个例子展示了如何培养一个R-CNN对象检测器来检测停车标志。R-CNN是物体检测框架,它使用一个卷积神经网络(CNN)分类图像区域内图像[1]。使用滑动窗口而不是分类每个地区,R-CNN探测器只处理那些区域可能包含一个对象。这大大减少了计算成本,当运行一个CNN。

说明如何培养一个R-CNN停车标志探测器,这个例子之前,转移学习中常用的工作流深学习应用。在转移学习,网络训练大量的图片,比如ImageNet[2],作为起点来解决一个新的分类或检测任务。使用这种方法的优点是,pretrained网络已经学会了一组丰富的图像特性,适用于广泛的图像。这种学习是通过微调网络转移到新的任务。网络是由微调调整权重,这样原始的特性表征学习任务略有调整,以支持新的任务。万博1manbetx

转移学习的优点是,图像所需的培训和训练时间减少。这个例子说明这些优势,列车停车标志探测器使用转移学习工作流程。首先是CNN使用CIFAR-10 pretrained数据集,拥有50000名训练图像。那么这个pretrained CNN是调整停车标志检测使用仅仅41训练图像。没有pretraining CNN、培训停车标志探测器需要更多的图片。

注意:这个例子需要计算机视觉工具箱™,图像处理工具箱™,深度学习工具箱™,统计和机器学习的工具箱™。

使用CUDA-capable NVIDIA GPU™强烈推荐用于运行这个例子。使用GPU需要并行计算工具箱™。关于支持计算能力的信息,看到万博1manbetxGPU计算的需求(并行计算工具箱)

下载CIFAR-10图像数据

下载CIFAR-10数据集[3]。这个数据集包含50000个训练图像将用于训练CNN。

CIFAR-10数据下载到一个临时目录中

cifar10Data = tempdir;url =“https://www.cs.toronto.edu/ ~ kriz / cifar-10-matlab.tar.gz”;helperCIFAR10Data.download (url, cifar10Data);

加载CIFAR-10训练和测试数据。

[trainingImages, trainingLabels testImages testLabels] = helperCIFAR10Data.load (cifar10Data);

每个图像为32 x32 RGB图像和训练样本有50000。

大小(trainingImages)
ans =1×432 32 3 50000

CIFAR-10有10个图像类别。图像类别列表:

numImageCategories = 10;类别(trainingLabels)
ans =10×1细胞{‘飞机’}{‘汽车’}{‘鸟’}{‘猫’}{‘鹿’}{‘狗’}{‘青蛙’}{‘马’}{‘船’}{“卡车”}

你可以显示的一些训练图像使用以下代码。

图缩略图= trainingImages (:,:,:, 1:10 0);蒙太奇(缩略图)

创建一个卷积神经网络(CNN)

美国有线电视新闻网是由一系列层,每个层定义了一个特定的计算。深度学习工具箱™提供功能轻松地设计一个CNN分层技术。在这个例子中,下面的层是用来创建一个CNN:

这里定义的网络类似于一个[4]中描述,从一开始imageInputLayer。输入层定义了CNN可以处理的数据类型和尺寸。在这个例子中,CNN是用来处理CIFAR-10图像,这是32 x32 RGB图片:

%创建图像输入层32 x32x3 CIFAR-10图像。(高度、宽度、numChannels ~) = (trainingImages)大小;图象尺寸=(高度宽度numChannels);inputLayer = imageInputLayer(图象尺寸)
inputLayer = ImageInputLayer属性:名称:“InputSize: [32 32 3] Hyperparameters DataAugmentation:“没有”正常化:“zerocenter”NormalizationDimension:“汽车”的意思是:[]

接下来,定义网络的中间层。中间层是由重复的块的卷积,ReLU(修正线性单元),和汇聚层。这三层形成卷积神经网络的核心构件。的卷积层定义的过滤器权重更新在网络培训。ReLU层增加了非线性网络,从而使网络近似非线性函数图像像素映射到图像的语义内容。池层downsample数据流经网络。网络中有很多层,池层应该谨慎使用以避免过早将采样数据网络。

%卷积层参数filterSize = 5 [5];numFilters = 32;middleLayers = [%第一卷积层32 5 x5x3过滤器有一个银行。一个%对称填充2像素添加,以确保图像边界%都包含在处理。这是重要的,以避免%信息在边界过早被冲走了%网络。convolution2dLayer (filterSize numFilters,“填充”,2)%注意第三维的过滤器可以省略,因为它%是自动推导出基于网络的连通性。在%因为这一层图像层,第三层%维度必须3匹配通道输入的数量%的形象。%下添加ReLU层:reluLayer ()%遵循用max池层有3 x3空间池区%的步幅2像素。这down-samples数据维度%为32 x32 15连接。maxPooling2dLayer (3“步”,2)%重复3芯层完成网络的中间。convolution2dLayer (filterSize numFilters,“填充”,2)reluLayer () maxPooling2dLayer (3“步”(2)convolution2dLayer filterSize 2 * numFilters“填充”,2)reluLayer () maxPooling2dLayer (3“步”2)]
middleLayers x1 = 9层阵列层:1“卷积32 5 x5的隆起与步幅[1]和填充2 2 2 2 2”ReLU ReLU 3”麦克斯池3 x3马克斯池步(2 - 2)和填充(0 0 0 0)4”卷积32 5 x5旋转步[1]和填充(2 2 2 2)5”ReLU ReLU 6”马克斯池3 x3马克斯池步(2 - 2)和填充[0 0 0 0]7“卷积64 5 x5旋转步[1]和填充2 2 2 2 8”ReLU ReLU 9”麦克斯池3 x3马克斯池步(2 - 2)和填充[0 0 0 0]

更深层次的网络可能由重复这三个基本层次。然而,汇聚层的数量应该减少过早地避免将采样数据。Downsampling早期网络中丢弃学习有用的图像信息。

CNN的最后一层通常是由完全连接层和一层softmax损失。

finalLayers = [%添加一个与64年完全连接层神经元的输出。输出的大小%这一层将数组长度为64。fullyConnectedLayer (64)%添加一个ReLU非线性。reluLayer%添加最后一个完全连接层。在这一点上,网络必须%生产10信号可以用来衡量是否输入图像%属于一个类别或另一个。这个测量是使用%的后续损失层。fullyConnectedLayer (numImageCategories)%添加一层一层和分类将softmax损失。最后一层使用%的输出完全连接层计算分类%的概率分布图像类。在培训期间%的过程,所有的调整网络权值,以减少损失%的分布。softmaxLayer classificationLayer]
finalLayers x1 = 5层阵列层:1“完全连接64完全连接层2”ReLU ReLU 3“完全连接10完全连接层4”Softmax Softmax crossentropyex 5”分类输出

结合输入、中间和最后一层。

层= [inputLayer middleLayers finalLayers]
层= 15 x1层与层:数组1”的形象输入32 x32x3图像zerocenter正常化2”卷积32 5 x5旋转步[1]和填充(2 2 2 2)3”ReLU ReLU 4”马克斯池3 x3马克斯池步(2 - 2)和填充[0 0 0 0]5“卷积32 5 x5的隆起与步幅[1]和填充(2 2 2 2)6”ReLU ReLU 7”麦克斯池3 x3马克斯池步(2 - 2)和填充[0 0 0 0]8”卷积64 5 x5旋转步[1]和填充(2 2 2 2)9”ReLU ReLU 10”马克斯池3 x3马克斯池步(2 - 2)和填充[0 0 0 0]11“完全连接64完全连接层12”ReLU ReLU 13“完全连接10完全连接层14”Softmax Softmax crossentropyex 15”分类输出

初始化第一卷积层权重使用正态分布随机数和标准偏差为0.0001。这有助于提高训练的收敛。

层(2)。重量= 0.0001 * randn ([filterSize numChannels numFilters]);

CNN使用CIFAR-10数据进行训练

现在,定义了网络体系结构,它可以使用CIFAR-10训练数据训练。首先,建立了网络训练算法使用trainingOptions(深度学习工具箱)函数。网络训练算法采用随机梯度下降法与初始动量(个)学习速率为0.001。在培训过程中,最初的学习速率降低每8时代(1时代被定义为一个完整的通过整个训练数据集)。训练算法运行40时代。

注意训练算法使用一个mini-batch 128张图片的大小。如果是使用GPU进行训练,这个尺寸可能需要降低由于GPU内存限制。

%设置网络训练选项选择= trainingOptions (“个”,“动量”,0.9,“InitialLearnRate”,0.001,“LearnRateSchedule”,“分段”,“LearnRateDropFactor”,0.1,“LearnRateDropPeriod”8“L2Regularization”,0.004,“MaxEpochs”现年40岁的“MiniBatchSize”,128,“详细”,真正的);

列车网络使用trainNetwork(深度学习工具箱)函数。这是一个计算密集型过程需要20 - 30分钟才能完成。为了节省时间在运行这个例子,pretrained网络加载从磁盘。如果你想自己训练网络,设置doTraining变量所示为true。

请注意,CUDA-capable NVIDIA GPU™强烈推荐培训。

%训练网络从磁盘加载运行时节省时间%的例子。这个标志设置为true来训练网络。doTraining = false;如果doTraining%训练网络。cifar10Net = trainNetwork (trainingImages、trainingLabels层,选择);其他的%负载pre-trained检测器的例子。负载(“rcnnStopSigns.mat”,“cifar10Net”)结束

验证CIFAR-10网络培训

网络训练后,应该进行验证以确保培训是成功的。首先,第一个卷积的快速可视化层的过滤重量训练可以帮助识别任何直接的问题。

%提取第一个卷积层权重w = cifar10Net.Layers (2) .Weights;%重新调节权重区间[0,1]的更好的可视化w =重新调节(w);图蒙太奇(w)

第一层的重量应该有一些定义良好的结构。如果重量仍然看起来随机,那么这是一个迹象表明,网络可能需要额外的培训。在这种情况下,如上所示,第一层过滤器已经学会了或者想从CIFAR-10训练数据特征。

完全验证培训结果,使用CIFAR-10测试数据来衡量网络的分类精度。准确性较低分数表明额外的培训或额外的训练数据是必需的。这个例子的目的不一定是达到100%的准确率测试集,但是足够训练一个网络用于训练对象探测器。

%在测试集上运行网络。欧美=分类(cifar10Net testImages);%计算的准确性。精度=(欧美= = testLabels) /元素个数之和(testLabels)
精度= 0.7456

进一步的培训将提高精度,但这不是必要的培训的目的R-CNN对象探测器。

负荷训练数据

现在的网络运行良好CIFAR-10分类任务,学习方法可以用来调整转移网络停车标志检测。

首先加载的地面实况数据停止的迹象。

%加载地面实况数据data =负载(“stopSignsAndCars.mat”,“stopSignsAndCars”);stopSignsAndCars = data.stopSignsAndCars;%更新图像文件的路径与本地文件系统visiondata = fullfile (toolboxdir (“愿景”),“visiondata”);stopSignsAndCars。imageFilename = fullfile (visiondata stopSignsAndCars.imageFilename);%显示地面实况数据的总结总结(stopSignsAndCars)
变量:imageFilename: 41×1单元阵列的特征向量stopSign: 41×1细胞carRear: 41×1细胞carFront: 41×1细胞

训练数据中包含一个表,其中包含的图像文件名和ROI标签停车标志,汽车方面,和恐惧。每个ROI标签是一个边界框周围感兴趣的对象在一个图像。培训停止信号探测器,只有停车标志ROI标签是必要的。汽车前后的ROI标签必须被移除:

%只保留图像文件名和停车标志ROI标签stopSigns = stopSignsAndCars (:, {“imageFilename”,“stopSign”});%显示一个训练图像和地面真理边界框我= imread (stopSigns.imageFilename {1});我= insertObjectAnnotation (,“矩形”,stopSigns.stopSign {1},“停车标志”,“线宽”8);图imshow(我)

注意,只有41训练图像在这个数据集。从头开始培训一个R-CNN对象检测器只使用41图像是不切实际的,不会产生一个可靠的停止信号检测器。因为停车标志探测器是由微调训练网络,pre-trained在更大的数据集(CIFAR-10 50000训练图像),使用更小的数据集是可行的。

火车R-CNN停车标志探测器

最后,火车R-CNN对象探测器使用trainRCNNObjectDetector。这个函数的输入是地面真值表包含标记停车标志图像,在pre-trained CIFAR-10网络,和培训选项。训练函数自动修改原始CIFAR-10网络,分类图像分为10类,成一个网络,可以将图像分为两类:停车标志和一个通用的背景类。

在培训过程中,输入调整网络权值使用图像补丁从地面实况中提取数据。“PositiveOverlapRange”和“NegativeOverlapRange”参数控制图像补丁用于培训。积极训练样本是那些重叠与地面真理盒由0.5到1.0的边界框的十字路口在联盟度量。消极训练样本是那些重叠到0到0.3。这些参数的最佳值应该选择测试检测器对准一个验证集。

R-CNN培训,使用并行的MATLAB工人强烈建议减少训练时间trainRCNNObjectDetector自动创建并使用一个平行的根据您的池计算机视觉工具箱的偏好。确保启用并行池的使用前培训。

为了节省时间在运行这个例子,pretrained网络加载从磁盘。如果你想自己训练网络,设置doTraining变量所示为true。

请注意,CUDA-capable NVIDIA GPU™强烈推荐培训。

%一个训练有素的探测器从磁盘加载运行时节省时间%的例子。这个标志设置为真正的训练检测器。doTraining = false;如果doTraining%设置培训选项选择= trainingOptions (“个”,“MiniBatchSize”,128,“InitialLearnRate”1 e - 3,“LearnRateSchedule”,“分段”,“LearnRateDropFactor”,0.1,“LearnRateDropPeriod”,100,“MaxEpochs”,100,“详细”,真正的);%火车R-CNN对象探测器。这将需要几分钟时间。rcnn = trainRCNNObjectDetector (stopSigns cifar10Net,选项,“NegativeOverlapRange”,0.3 [0],“PositiveOverlapRange”(0.5 - 1))其他的%负载pre-trained网络的例子。负载(“rcnnStopSigns.mat”,“rcnn”)结束

测试R-CNN停车标志探测器

R-CNN对象探测器现在可以用来探测停车标志的图片。试试在测试图像:

%阅读测试图像testImage = imread (“stopSignTest.jpg”);%检测停车标志[bboxes,分数,标签]=检测(rcnn testImage,“MiniBatchSize”,128)
bboxes =1×4419 147年31日20
分数=0.9955
标签=明确的分类stopSign

R-CNN对象检测方法返回的对象边界框,检测得分,一个类标签为每个检测。标签是有用的,当检测多个对象,如停止,产量,或限速标志。分数介于0和1之间,表明检测和信心可以用来忽略低评分检测。

%显示检测结果[得分,idx] = max(分数);bbox = bboxes (idx:);注释= sprintf (' % s:(信心= % f) '标签(idx),得分);outputImage = insertObjectAnnotation (testImage,“矩形”bbox,注释);图imshow (outputImage)

调试技巧

网络中使用R-CNN检测器也可以用于整个测试过程的图像。通过直接处理整个图像,这是大于网络的输入大小,可以生成二维分类热图分数。这是一个有用的调试工具,因为它帮助识别物品混淆网络的图像中,并可能帮助提供洞察改善培训。

%训练网络存储在R-CNN探测器rcnn.Network
ans = SeriesNetwork属性:层:[15×1 nnet.cnn.layer.Layer]

提取激活(深度学习工具箱)从将softmax层14层网络中。这些分类分数产生的网络扫描图像。

(rcnn featureMap =激活。网络testImage 14);%将softmax激活存储在一个三维数组。大小(featureMap)
ans =1×343 78 2

第三维度featureMap对应于对象类。

rcnn.ClassNames
ans =2×1细胞{' stopSign}{‘背景’}

停车标志特征地图存储在第一频道。

stopSignMap = featureMap (:: 1);

激活的大小输出小于输入图像网络中由于将采样操作。产生更好的可视化,调整stopSignMap输入图像的大小。这是一个非常粗糙的近似映射图像像素和激活应该只用于演示目的。

%调整stopSignMap可视化大小(高度、宽度、~)= (testImage);stopSignMap = imresize (stopSignMap(高度、宽度));%可视化特征地图叠加在测试图像。featureMapOnImage = imfuse (testImage stopSignMap);图imshow (featureMapOnImage)

测试图像对应的停车标志和最大的峰值网络激活。这有助于验证中使用的CNN R-CNN探测器实际上已经学会了识别停车标志。有其他山峰,这可能表明,训练需要额外的负面数据来帮助防止假阳性。如果是这样的话,那么你可以增加MaxEpochs trainingOptions和重新培训。

总结

这个例子展示了如何训练一个R-CNN停车标志对象探测器使用网络与CIFAR-10训练数据。类似的措施可能会跟着火车其他对象探测器使用深度学习。

引用

[1]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页。

[2]邓小平,J。,W. Dong, R. Socher, L.-J. Li, K. Li, and L. Fei-Fei. "ImageNet: A Large-Scale Hierarchical Image Database."学报2009年IEEE计算机视觉与模式识别会议。迈阿密,佛罗里达,2009年6月,页248 - 255。

[3]Krizhevsky,。和g·辛顿。“学习的多层功能从微小的图像。”硕士论文,多伦多大学。多伦多,加拿大,2009。

[4]https://code.google.com/p/cuda-convnet/

另请参阅

|(深度学习工具箱)|(深度学习工具箱)||||||(深度学习工具箱)||(深度学习工具箱)

相关的话题