火车对象检测器使用R-CNN深度学习

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

概观

此示例示出了如何培养的R-CNN对象检测器,用于检测停车标志。R-CNN是物体检测框架,其使用卷积神经网络(CNN)进行分类的图像区域的图像[1]内。代替使用滑动窗口中的每个区域的分类中,R-CNN检测器仅处理那些可能含有的对象的区域。这大大降低了运行时CNN所产生的计算成本。

为了说明如何培养的R-CNN停止标志检测器,本实施例如下是通常在深学习应用中使用的转印学习工作流程。在转印学习,训练上的大集合的图像的网络,诸如ImageNet [2],被用作起始点来解决新的分类或检测任务。使用这种方法的好处是,预训练的网络已经学到了丰富的影像功能,适用范围广的图像。这种学习是转移到通过微调网络的新任务。通过使小的调整的权重,从而了解到该原始任务的特征表示略有调整,以支持新任务的网络进行微调。万博1manbetx

迁移学习的优点是所需图像的数量进行培训和训练时间减少。为了说明这些优点,本实施例列车使用转印学习工作流停止标志检测器。首先一个CNN使用CIFAR-10的数据集,其具有50000个训练图像预训练。那么这个预训练的CNN是微调使用只有41个训练图像停车标志检测。如果没有训练前的CNN,训练停止的迹象探测器将需要更多的图像。

注:此示例要求计算机视觉工具箱™,图像处理工具箱™,深度学习工具箱™,统计和机器学习工具箱™。

使用CUDA功能的NVIDIA™GPU计算能力3.0或更高,强烈建议用于运行该示例。一个GPU的使用需要并行计算工具箱™。

下载CIFAR-10图像数据

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

下载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×32的RGB图像,并有50,000训练样本。

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

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

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

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

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

创建卷积神经网络(CNN)

甲CNN是由一系列的层,其中每个层定义了一个特定的计算。深学习工具箱™提供的功能,轻松地设计CNN的层与层之间。在这个例子中,下面的层被用于创建CNN:

这里所定义的网络类似于在[4]中所述的一个和开始与imageInputLayer。输入层定义的类型和CNN可以处理的数据的大小。在这个例子中,CNN用于处理CIFAR-10的图像,其是32×32的RGB图像:

%创建32x32x3 CIFAR-10张图像的图像输入层。[高度,宽度,numChannels,〜] =尺寸(trainingImages);IMAGESIZE = [高度宽度numChannels];inputLayer = imageInputLayer(IMAGESIZE)
inputLayer = ImageInputLayer与属性:名称: '' InputSize:[32 32 3]超参数DataAugmentation: '无' 归一化: 'zerocenter' NormalizationDimension: '自动' 平均数:[]

接下来,定义了网络的中间层。中间层由卷积,RELU(整流线性单位),和集中层的重复块组成。这些3个层形成卷积神经网络的核心构建块。卷积层限定套滤波器权重,其被网络训练期间更新的。所述RELU层增加了非线性到网络,这允许网络近似非线性函数映射图像像素,以与图像的语义内容。汇集层下采样数据,因为它流过网络。在有大量的层的网络,汇集层应谨慎使用,以避免在网络中过早下采样的数据。

%卷积层参数filterSize = [5 5];numFilters = 32;middleLayers = [%第一卷积层具有32个5x5x3滤波器组。一个加入的2个像素%对称填充,以确保图像边界%的包含在处理。这一点很重要,以避免在边界%的信息在被冲走太早%的网络。convolution2dLayer(filterSize,numFilters,'填充',2)%。注意,在过滤器的第三维可以,因为它被省略%是基于网络的连通性自动推导。在%这种情况下,因为该层下面的图像层,所述第三%尺寸必须是3以匹配输入信道的数量% 图片。%接着添加RELU层:reluLayer()%与具有一个3x3的空间汇集面积最大池层遵循它%和2个像素的步幅。这个下采样从数据尺寸32×32%到15×15。maxPooling2dLayer(3,“跨越论”,2)%重复3个芯层完成网络的中间。convolution2dLayer(filterSize,numFilters,'填充',2)reluLayer()maxPooling2dLayer(3,“跨越论”,2)convolution2dLayer(filterSize,2个* numFilters,'填充',2)reluLayer()maxPooling2dLayer(3,“跨越论”,2)]
middleLayers = 9X1层阵列层:1 '' 卷积32个5x5的卷积与步幅[1 1]和填充[2 2 2 2 2 '' RELU RELU 3 '' 最大池3x3的最大蓄留与步幅[2 2]和填充[0 0 0 0] -4 '' 卷积32个5x5的卷积与步幅[1 1]和填充[2 2 2 2] 5 '' RELU RELU 6 '' 最大池3x3的最大蓄留与步幅[2 2]和填充[00 0 0] 7'卷积64个5x5的卷积与步幅[1 1]和填充[2 2 2 2] 8 '' RELU RELU 9 '' 最大池3x3的最大蓄留与步幅[2 2]和填充[0 0 00]

更深的网络可以通过重复这些3个基本层被创建。然而,汇集层的数目应减少,以避免过早下采样的数据。在对学习有用的网络丢弃图像信息提早下采样。

一个CNN的最终层通常由完全连接层和一SOFTMAX损耗层的。

finalLayers = [%添加完全连接层与64个输出神经元。的输出尺寸%该层将与64的长度的阵列。fullyConnectedLayer(64)%添加RELU非线性。reluLayer%添加最后的完全连接层。在这一点上,网络必须%产品,可用于10个信号来衡量是否在输入图像%属于一个类别或另一个。该测量是使用由%随后的损耗层。fullyConnectedLayer(numImageCategories)%添加SOFTMAX损耗层和分类层。最终层使用%的完全连接层的输出来计算绝对%的图像类以上的概率分布。在训练%过程中,所有的网络权被调谐以最小化在这个损失%分类分布。softmaxLayer classificationLayer]
finalLayers = 5X1层阵列层:1“”完全连接64完全连接层2“” RELU RELU 3“”完全连接10完全连接层4“”使用SoftMax SOFTMAX 5“”分类输出crossentropyex

结合输入,中间和最后几层。

层= [inputLayer middleLayers finalLayers]
层= 15X1层阵列层:1 '' 图像输入32x32x3图像与 'zerocenter' 正常化2 '' 卷积32个5x5的卷积与步幅[1 1]和填充[2 2 2 2] 3 '' RELU RELU 4 '' 最大池3×3与步幅[2 2]和填充[0 0 0 0]的5 '最大池' 卷积32个5x5的卷积与步幅[1 1]和填充[2 2 2 2] 6 '' RELU RELU 7 '' 最大池的3x3最大池与步幅[2 2]和填充[0 0 0 0] 8 '' 卷积64个5x5的卷积与步幅[1 1]和填充[2 2 2 2] 9 '' RELU RELU 10 '' 最大池3x3的最大蓄留与步幅[2 2]和填充[0 0 0 0] 11 '' 完全连接64完全连接层12 '' RELU RELU 13 '' 完全连接10完全连接层14 '' 使用SoftMax使用SoftMax 15 '' 分类输出crossentropyex

初始化使用正态分布的随机数与0.0001标准偏差的第一卷积层的权重。这有助于提高培训的融合。

层(2).Weights = 0.0001 * randn([filterSize numChannels numFilters]);

火车CNN使用CIFAR-10数据

现在,网络结构被定义,它可以使用CIFAR-10的训练数据来训练。首先,设置使用网络训练算法trainingOptions功能。网络训练算法采用随机梯度下降动量(SGDM)与0.001最初的学习速度。在训练期间,初始学习速率降低每8个历元(1个历元被定义为一个完整穿过整个训练数据集)。训练算法运行40个时代。

注意,训练算法使用128个图像的小批量大小。如果使用用于训练一个GPU,这个尺寸可能需要由于在GPU存储器约束降低。

%设置网络培训选项OPTS = trainingOptions('SGDM'...'动量',0.9%,...'InitialLearnRate'0.001,...'LearnRateSchedule'“分段”...'LearnRateDropFactor',0.1%,...'LearnRateDropPeriod'8,...'L2Regularization',0.004,...'MaxEpochs'40,...'MiniBatchSize',128,...“放牧”,真正的);

使用列车网络trainNetwork功能。这是一个计算密集的过程,需要20-30分钟才能完成。为了节省时间运行这个例子时,预训练网络是从磁盘加载。如果您想对网络进行训练自己,设置doTraining变量如下所示为true。

需要注意的是一个支持CUDA的NVIDIA GPU™计算能力3.0或更高版本强烈建议进行培训。

%受过训练的网络是从磁盘加载运行时节省时间%的例子。这个标志设置为true对网络进行训练。doTraining = FALSE;如果doTraining%列车内的网络。cifar10Net = trainNetwork(trainingImages,trainingLabels,层,OPTS);其他%负载预先训练检测器,用于该示例。加载('rcnnStopSigns.mat''cifar10Net'结束

验证CIFAR-10网络培训

对网络进行训练后,应当验证,以确保培训是成功的。首先,第一个卷积层的过滤器权重的快速可视化可以帮助识别与培训的紧迫问题。

%提取第一卷积层的权重W = cifar10Net.Layers(2).Weights;%重新缩放权重应用于所述范围[0,1]更好的可视化W =重新调整(W);图蒙太奇(w)的

第一层的权重应具有一定的明确定义的结构。如果权重仍然看起来是随机的,那么这是一个迹象表明,网络可能需要额外的培训。在这种情况下,如上所示,第一层的过滤器已经学习边缘状从CIFAR-10的训练数据的特征。

要完全验证训练结果,使用CIFAR-10的测试数据,以测量网络的分类精度。低准确度得分指示需要额外的培训或额外的训练数据。该实施例的目的是不必对测试组达到100%的准确度,但充分地训练中使用的网络中的训练物体检测器。

%在运行测试集的网络。YTest =分类(cifar10Net,testImages);%计算的准确性。精度=总和(YTest == testLabels)/ numel(testLabels)
精度= 0.7456

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

负荷训练数据

现在,网络的CIFAR-10分类任务运作良好,转移学习方法可以用来微调网络站牌检测。

通过加载了停车标志的地面实况数据开始。

%负载地面实况数据数据=负载('stopSignsAndCars.mat''stopSignsAndCars');stopSignsAndCars = data.stopSignsAndCars;%更新的路径,图像文件,以便与本地文件系统visiondata =完整文件(toolboxdir('视力''visiondata');stopSignsAndCars.imageFilename =完整文件(visiondata,stopSignsAndCars.imageFilename);%显示地面实况数据的汇总摘要(stopSignsAndCars)
变量:映像文件名称:字符向量stopSign的41×1单元阵列:41×1个细胞carRear:41×1个细胞carFront:41×1个细胞

训练数据包含包含图像文件名和ROI标签停止的迹象,汽车方面,以及后轮表内。每个标签的投资回报率是一个边界框周围物体感兴趣的图像中。培训站牌探测器,只需要在站牌ROI的标签。汽车前部和后部必须的ROI标签被删除:

%只保持图像文件名和站牌ROI标签stopSigns = stopSignsAndCars(:,{“映像文件名称”'停止标志'});%显示一个训练图像和地面实况边界框I = imread(stopSigns.imageFilename {1});I = insertObjectAnnotation(I,'长方形',stopSigns.stopSign {1},'停止标志''行宽',8);图imshow(I)

需要注意的是,只有41这组数据中的训练图像。从仅使用41图像划痕训练的R-CNN对象检测器是不实际的,并且不会产生可靠停止标志检测器。因为停止标志检测器由微调训练已经在更大的数据集预先训练网络(CIFAR-10具有50000个的训练图像),使用一个更小的数据集是可行的。

火车R-CNN停止符号检测器

最后,使用训练R-CNN对象检测器trainRCNNObjectDetector。输入这个功能是包含标记站点标志图像,预先训练CIFAR-10网络,培训选择地面真值表。训练功能自动修改原始CIFAR-10网络,它被分类的图像分为10个类别,成可以图像分类成2类的网络:停止标志和通用背景类。

在训练期间,该输入网络权重是微调使用从地面实况数据中提取的图像块。在“PositiveOverlapRange”和图像块被用于训练“NegativeOverlapRange”参数控制。阳性训练样本都与地面实况盒那些重叠由0.5至1.0,如由包围盒相交在联合度量测量。阴性训练样本是那些由0至0.3重叠。这些参数的最佳值应通过测试上的验证集的训练检测器来选择。

对于R-CNN培训,利用MATLAB工人的并行池的强烈建议,以减少培训时间trainRCNNObjectDetector自动创建和使用并行池根据您的平行偏好设置。确保使用平行的泳池前的训练启用。

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

需要注意的是一个支持CUDA的NVIDIA GPU™计算能力3.0或更高版本强烈建议进行培训。

%A训练检测器从磁盘加载运行时,以节省时间%的例子。这个标志设置为true训练探测器。doTraining = FALSE;如果doTraining%设定培训选项选项= trainingOptions('SGDM'...'MiniBatchSize',128,...'InitialLearnRate',1E-3,...'LearnRateSchedule'“分段”...'LearnRateDropFactor',0.1%,...'LearnRateDropPeriod',100,...'MaxEpochs',100,...“放牧”,真正的);%培养的R-CNN对象检测器。这将需要几分钟的时间。rcnn = trainRCNNObjectDetector(stopSigns,cifar10Net,选项...'NegativeOverlapRange',[0 0.3],'PositiveOverlapRange'[0.5 1])其他%负载预先训练网络的例子。加载('rcnnStopSigns.mat''rcnn'结束

测试R-CNN停止符号检测器

的R-CNN对象检测器现在可以用于检测在图像停车标志。尝试一下测试图像上:

%读取测试图像testImage = imread('stopSignTest.jpg');%检测停车标志[bboxes,得分,标号] =检测(rcnn,testImage,'MiniBatchSize',128)
bboxes =1×4419 147 31 20
得分=0.9955
标签=分类范畴停止标志

的R-CNN对象检测方法返回该对象的边界框,检测分数,并且类别标签为每个检测。检测多个对象时的标记是有用的,例如停止,产量,或限速标志。分数,其范围在0和1之间,表明在检测的置信度,并且可以被用来忽略低得分检测。

%显示检测结果[得分,IDX] = MAX(评分);BBOX = bboxes(IDX,:);注释= sprintf的('%S:(置信度=%F)',标签(IDX),得分);outputImage = insertObjectAnnotation(testImage,'长方形',BBOX,注释);图imshow(outputImage)

调试提示

的R-CNN检测器内所使用的网络,也可用于处理整个测试图像。通过直接处理整个图像,这是比该网络的输入尺寸,可以产生分类分值的2-d热图。这是一个非常有用的调试工具,因为它有助于识别图像中物品被混淆网络,并可能有助于洞察改善培训。

%的训练的网络被存储在R-CNN检测器内rcnn.Network
ANS = SeriesNetwork与属性:层:[15×1 nnet.cnn.layer.Layer]

提取激活从SOFTMAX层,这是在网络中的第14层。这些是由网络产生的,因为它扫描图像的分类分值。

featureMap =激活(rcnn.Network,testImage,14);%的SOFTMAX激活被存储在3-d阵列。大小(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探测器内使用,有效地学会了识别停车标志。曾经有过其它的山峰,这可能表明该训练需要额外的负面数据,以帮助防止误报。如果是这样的话,那么你可以增加trainingOptions和再培训“MaxEpochs”。

摘要

此实施例表明了如何使用与CIFAR-10数据训练的网络来训练R-CNN停止标志对象检测器。类似的步骤之后可以接着使用深度学习训练其他对象的检测器。

参考

[1] Girshick,R.,J.多纳,T.达雷尔,和J.马立克。“丰富的功能层次结构的精确物体检测及语义分割。”计算机视觉与模式识别2014年IEEE会议论文集。俄亥俄州哥伦布市,2014年6月,第580-587。

[2]邓,J.,W.董,R. Socher,L.-J.李,李K.和L.菲菲。“ImageNet:大规模分层图像数据库。”计算机视觉与模式识别2009年IEEE会议论文集。迈阿密,佛罗里达州,2009年6月,第248-255。

[3] Krizhevsky,A.,和G.欣顿。“学习从微小的图像特征多层。”硕士论文。多伦多,加拿大多伦多,2009年大学。

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

也可以看看

||||||||||

相关话题