主要内容

이번역페이지는최신내용을담고있지않습니다。최신내용을문으로보려면여기를클릭하십시오。

R-cnn딥러닝을사용하여객체검출기훈련시키기

이예제에서는딥러닝과R-CNN与卷积神经网络(地区)을사용하여객체검출기를훈련시키는방법을다룹니다。

개요

이예제에서는정지표지판을검출하도록R-CNN객체검출기를훈련시키는방법을다룹니다。R-CNN은컨벌루션신경망(CNN)을사용하여영상내의영상영역을분류하는객체검출프레임워크입니다[1]。R-CNN검출기는슬라이딩윈도우를사용하여각영역을분류하는대신사물을포함할가능성이있는영역만처리합니다。이로marketing해cnn을실행할때발생하는계산비용이크게줄어듭니다。

R-CNN정지표지판검출기를훈련시키는방법을설명하기위해,이예제는딥러닝활용분야에서널리사용되는전이학습워크플로를따릅니다。전이학습에서는ImageNet[2]과같은대규모의영상모음에대해훈련된신경망을새로운분류또는검출작업의출발점으로사용합니다。이방법의이점은사전훈련된신경망이다양한영상에적용할수있는다양한영상특징을이미학습했다는데있습니다。이렇게학습된내용은신경망의미세조정을통해새로운작업에옮겨적용할수있습니다。원래작업을위해학습된특징표현이새로운작업에사용될수있도록맞춰질수있게가중치를소폭변경함으로써신경망이미세조정됩니다。

전이학습의이점은훈련에필한상의개수와훈련시간이줄어든다는데있습니다。이러한이점을보여주기위해,이예제에서는전이학습워크플로를사용하여정지표지판검출기를훈련시킵니다。먼저50000개의훈련영상을포함하는CIFAR-10데이터세트를사용하여CNN을사전훈련시킵니다。그런다음단41개의훈련영상을사용하여정지표지판을검출하도록이사전훈련된CNN을미세조정합니다。CNN을사전훈련시키지않으면정지표지판검출기를훈련시키는데훨씬더많은영상이필요할것입니다。

참고:이예제를실행하려면计算机视觉工具箱™,图像处理工具箱™,深度学习工具箱™및统计和机器学习工具箱™가필합니다。

이예제를실행할때는cuda지원nvidia™gpu를사용하는것이권장됩니다。GPU를사용하려면并行计算工具箱™가필합니다。지원되는计算能力에대한자세한내용은릴리스별gpu지원(并行计算工具箱)항목을참조하십시오。

Cifar-10상데이터다운로드하기

Cifar-10데이터세트[3]를다운로드합니다。이데이터셋은cnn을훈련시키는데사용될50,000개의훈련상을포함합니다。

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);

각상은32x32 RGB상이고,총50000개의훈련샘플이있습니다。

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

Cifar-10에는10개의상범주가있습니다。상범주를나열해보겠습니다。

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

다음코드를사용하여몇몇훈련상을시할수있습니다。

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

컨벌루션신경망(cnn)만들기

Cnn은일련의계층으로구성되며,각계층은특정계산을정의합니다。深度学习工具箱™는CNN을계층별로손쉽게설계할수있는기능을제공합니다。이예제에서는cnn을만드는데다음계층이사용됩니다。

여기서정의하는신경망은[4]에서설명하는신경망과비슷하며,imageInputLayer로시작합니다。입력계층은cnn이처리할수있는데이터의유형과크기를정의합니다。32 x32 RGB이예제에서는영상인CIFAR-10영상을처리하는데CNN이사용됩니다。

为32x32x3 CIFAR-10图像创建图像输入层。[height,width,numChannels, ~] = size(trainingImages);imageSize =[高度宽度numChannels];inputLayer = imageInputLayer(imageSize)
inputLayer = ImageInputLayer with properties: Name: " InputSize:[32 32 3]超参数DataAugmentation: 'none'归一化:'zerocenter' NormalizationDimension: 'auto' Mean: []

다음으로,신경망의중간계층을정의합니다。중간계층은컨벌루션계층,ReLU(修正线性单元)계층,풀링계층의반복되는블록으로구성됩니다。이들3개의계층은컨벌루션신경망의핵심구성소를형성합니다。컨벌루션계층은신경망훈련중에업데이트되는필터가중치세트를정의합니다。ReLU层계층은신경망이영상픽셀을영상의의미론적콘텐츠에매핑하는비선형함수를근사할수있도록신경망에비선형성을추가합니다。풀링계층은데이터가신경망을통과하는과정에서데이터를다운샘플링합니다。계층이많은신경망에서는신경망의너무초반에데이터다운샘플링이이루어지지않도록풀링계층을조금만사용해야합니다。

%卷积层参数filterSize = [5 5];numFilters = 32;中间层= [第一个卷积层有32个5x5x3滤波器组。一个添加2像素的%对称填充以确保图像边界%包含在处理中。这是必须避免的%边境的信息被过早地冲走了%网络。convolution2dLayer (filterSize numFilters,“填充”, 2)注意,第三维度的过滤器可以省略,因为它%根据网络的连通性自动推导。在%这种情况是因为这一层紧随图像层,第三层%维度必须为3,以匹配输入中的通道数量%的形象。接下来添加ReLU层:reluLayer ()跟随它的最大池化层,具有3x3空间池化区域%和2像素的步幅。这将对数据维进行抽样% 32x32到15x15。maxPooling2dLayer (3“步”, 2)重复3个核心层,完成网络的中间部分。convolution2dLayer (filterSize numFilters,“填充”,2) reluLayer() maxPooling2dLayer(3,“步”,2)卷积2dlayer (filterSize,2 * numFilters,“填充”,2) reluLayer() maxPooling2dLayer(3,“步”2)]
midelayers = 9x1带有图层的图层数组: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]

이들3개의기본계층을반복함으로써보다깊은층의신경망을만들수있습니다。그러나데이터가너무이르게다운샘플링되지않도록풀링계층의개수는줄여야합니다。신경망의초반에다운샘플링이이루어지면학습에유용한상정보가사라지게됩니다。

Cnn의마지막계층은보통완전연결계층과소프트맥스손실계층으로구성됩니다。

finalLayers = [添加一个64个输出神经元的全连接层。的输出大小该层将是一个长度为64的数组。fullyConnectedLayer (64)添加一个ReLU非线性。reluLayer添加最后一个全连接层。此时,网络必须%产生10个信号,可用于测量输入图像是否%属于这样或那样的类别。该测量是使用%后续损失层数。fullyConnectedLayer (numImageCategories)添加softmax损失层和分类层。最后的图层使用%的输出全连通层来计算分类图像类的%概率分布。培训期间%进程时,所有的网络权重都被调优以使损失最小化%分类分布。softmaxLayer分类层
finalLayers = 5x1分层阵列:1 "全连接64全连接Layer 2 " ReLU ReLU 3 "全连接10全连接Layer 4 " Softmax Softmax 5

입력계층,중간계층,마지막계층을결합합니다。

layers = [inputLayer middleLayers finalLayers]
图层数组= 15x11”的形象输入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”马克斯Pooling 3x3 max Pooling with stride[2 2]和padding[0 0 0 0 0] 11 "全连接64全连接层12 " ReLU ReLU 13 "全连接10全连接层14 " Softmax Softmax 15 " Classification Output crossentropyex

0.0001표준편차가인정규분포된난수를사용하여첫번째컨벌루션계층가중치를초기화합니다。이렇게하면훈련의수렴을개선하는데도움이됩니다。

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

Cifar-10데이터를사용하여CNN훈련시키기

신경망아키텍처를정의했으므로이제CIFAR-10훈련데이터를사용하여신경망을훈련시킬수있습니다。먼저trainingOptions(深度学习工具箱)함수를사용하여신경망훈련알고리즘을설정합니다。신경망훈련알고리즘은초기학습률을0.001로하여个(随机梯度下降势头:모멘텀을사용한확률적경사하강법)을사용합니다。초기학습률은훈련중매8회의时代마다감소합니다(时代1회는전체훈련데이터세트를완전히한번통과하는것으로정의됩니다)。훈련알고리즘은40회의Epoch동실행됩니다。

훈련알고리즘에서사용되는미니배치크기는128개상입니다。훈련을위해GPU를사용하는경우에는GPU에부과되는메모리제약으로인해이크기를줄여야할수있습니다。

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

trainNetwork(深度学习工具箱)함수를사용하여신경망을훈련시킵니다。이는완료하는데20~30분정도소되는계산집약적절차입니다。이예제를실행하는동안시간을절약하기위해디스크에서사전훈련된신경망을불러옵니다。신경망을직접훈련시키려면아래에@ @시된doTraining변수를真实로설정하십시오。

훈련을수행할때는cuda지원nvidia™gpu를사용하는것이권장됩니다。

从磁盘加载经过训练的网络,以节省运行%的例子。将此标志设置为true以训练网络。doTraining = false;如果doTraining训练一个网络。cifar10Net = trainNetwork(trainingImages, trainingLabels, layers, opts);其他的为示例加载预训练的检测器。负载(“rcnnStopSigns.mat”“cifar10Net”结束

Cifar-10신경망훈련검하기

신경망을훈련시킨후에는신경망을검하여훈련이성공적지확해야합니다。먼저첫번째컨벌루션계층의필터가중치를간단하게시각화하면훈련이갖고있는즉각적인문제를파악하는데도움이됩니다。

提取第一个卷积层权值w = cifar10Net.Layers(2).Weights;%将权重重新缩放到范围[0,1],以便更好地可视化W = rescale(W);图蒙太奇(w)

첫번째계층가중치는잘정의된구조를가질것입니다。가중치가여전히무작위적으로보인다면신경망에추가훈련이필요하다는징후일수있습니다。여기서는위에서보듯이첫번째계층필터가CIFAR-10훈련데이터로부터경계와같은특징을학습했습니다。

훈련결과를완전히검증하려면CIFAR-10테스트데이터를사용하여신경망의분류정확도를측정하십시오。낮은정확도점수는추가훈련또는추가훈련데이터가필함을나타냅니다。이예제의목표는테스트세트에대해반드시100%의정확도를달성하겠다는것이라기보다는객체검출기를훈련할수있을정도로충분히신경망을훈련시키는것입니다。

在测试集中运行网络。YTest = category (cifar10Net, testImages);计算准确率。accuracy = sum(YTest == testLabels)/numel(testLabels)
准确度= 0.7456

훈련을추가로진행하면정확도가높아질수있겠으나이는R-CNN객체검출기훈련이라는목적을위해서는필요하지않습니다。

훈련데이터불러오기

이제신경망이CIFAR-10분류작업에대해잘작동하므로정지표지판검출을위해신경망을미세조정하는데전이학습방법을사용할수있습니다。

먼저정지@ @지판의실측데이터를불러옵니다。

加载真实数据数据=负载(“stopSignsAndCars.mat”“stopSignsAndCars”);stopSignsAndCars = data.stopSignsAndCars;%更新映像文件的路径以匹配本地文件系统Visiondata = fullfile(toolboxdir(“愿景”),“visiondata”);stopSignsAndCars。imageFilename = fullfile(visiondata, stopSignsAndCars.imageFilename);显示地面真实值数据摘要总结(stopSignsAndCars)
变量:imageFilename: 41×1 cell字符向量数组stopSign: 41×1 cell carRear: 41×1 cell carFront: 41×1 cell

훈련데이터는영상파일이름과정지표지판,차량앞면및차량뒷면의ROI레이블을포함하는테이블내에포함되어있습니다。각ROI레이블은상내의관심사물을둘러싸는경계상자입니다。정지표지판검출기훈련에는정지표지판ROI레이블만필요합니다。차량앞면과차량뒷면의ROI레이블은제거해야합니다。

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

이데이터세트에는단41개의훈련상만있습니다。41개의영상만사용하여CNN객체검출기를처음부터훈련시키기란쉽지않으며,이를통해신뢰할수있는정지표지판검출기를생성할수없습니다。이정지표지판검출기는규모가더큰데이터셋(CIFAR-10에는50000개의훈련영상이있음)에대해사전훈련된신경망을미세조정하여훈련되므로훨씬작은데이터셋을사용하는것이가능한것입니다。

R-cnn정지@ @지판검출기훈련시키기

마지막으로,trainRCNNObjectDetector를사용하여r-cnn객체검출기를훈련시킵니다。이함수에대한입력값은레이블이지정된정지표지판영상,사전훈련된CIFAR-10신경망및훈련옵션을포함하는실측테이블입니다。훈련함수는영상을10개의범주로분류한원래CIFAR-10신경망을,영상을정지표지판클래스와일반배경클래스라는2개의클래스로분류할수있는신경망으로자동으로수정합니다。

훈련중에,입력신경망가중치는실측데이터에서추출된영상패치를사용하여미세조정됩니다。‘PositiveOverlapRange파라미터와‘NegativeOverlapRange파라미터는훈련에어느영상패치를사용할지제어합니다。양성훈련샘플은0.5에서1.0만큼실측상자와중첩되는샘플입니다。이값은경계상자借据(intersection-over-union)메트릭을사용해측정됩니다。음성훈련샘플은0에서0.3만큼중첩되는샘플입니다。이들파라미터에대한최적의값은훈련된검출기를검증세트에대해테스트하여선택해야합니다。

R-cnn훈련의경우,훈련시간을줄이기위해matlab워커병렬풀을사용하는것을강력히권장합니다trainRCNNObjectDetector병렬기본설정을바탕으로병렬풀을자동으로만들어서사용합니다。훈련전에병렬풀을사용하도록설정되어있는지확하십시오。

이예제를실행하는동안시간을절약하기위해디스크에서사전훈련된신경망을불러옵니다。신경망을직접훈련시키려면아래에@ @시된doTraining변수를真实로설정하십시오。

훈련을수행할때는cuda지원nvidia™gpu를사용하는것이권장됩니다。

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

R-cnn정지@ @지판검출기테스트하기

이제상에서정지지판을검출하는데r-cnn객체검출기를사용할수있습니다。테스트상에서사용해봅니다。

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

R-cnn객체의检测메서드는각검출건에대한사물경계상자,검출점수및클래스레이블을반환합니다。레이블은여러개의사물(예:정지표지판,양보표지판,속도제한표지판등)을검출할때유용합니다。검출신뢰도를나타내는점수는0 1과사이의값으로,점수가낮은검출건을무시하는데사용할수있습니다。

%显示检测结果[score, idx] = max(score);Bbox = bboxes(idx,:);注释= sprintf('%s:(可信度= %f)', label(idx), score);outputImage = insertObjectAnnotation(testImage,“矩形”, bbox,注释);图imshow (outputImage)

디버그 팁

R-CNN검출기내에서사용된신경망은전체테스트영상을처리하는데도사용될수있습니다。신경망입력크기보다큰전체영상을직접처리함으로써분류점수2차의원히트맵을생성할수있습니다。이는신경망에서혼동을유발하는영상내의항목을식별하는데도움이되는유용한디버그툴이며,훈련개선이이루어질수있도록식견을제공할수도있습니다。

训练的网络存储在R-CNN检测器中rcnn。网络
ans = SeriesNetwork with properties: Layers: [15×1 nnet.cnn.layer.Layer]

신경망의14번째계층marketing소프트맥스계층에서激活(深度学习工具箱)를추출합니다。이것은신경망이상을살펴보는과정에서생성된분류점수입니다。

featureMap =激活(rcnn。网络,testImage, 14);softmax激活存储在3-D数组中。大小(featureMap)
ans =1×343 78 2

featureMap의3번째차원은사물클래스에해당합니다。

rcnn。一会
ans =2×1细胞{'stopSign'} {'Background'}

정지@ @지판특징맵은첫번째채널에저장되어있습니다。

stopSignMap = featureMap(:,:, 1);

활성화출력값의크기는신경망내다운샘플링연산때문에입력상보다작습니다。더좋은시각화를생성하려면stopSignMap의크기를입력상의크기로조정하십시오。이는활성화를영상픽셀로매핑하는매우대략적인근사이므로설명을돕는목적으로만사용해야합니다。

为可视化调整stopSignMap的大小[height, width, ~] = size(testImage);stopSignMap = imresize(stopSignMap, [height, width]);可视化叠加在测试图像上的特征图。。featureMapOnImage = imfuse(testImage, stopSignMap);图imshow (featureMapOnImage)

테스트상의정지지판은신경망활성화에가장큰피크와잘대응됩니다。이는R-CNN검출기내에서사용된CNN이정지표지판을식별하도록효과적으로학습했음을확인하는데도움이됩니다。만일다른피크가있었다면이는거짓양성을방지하기위해훈련에추가적인음성데이터가필요함을나타낼수있습니다。이경우trainingOptions의”MaxEpochs를늘려서다시훈련할수있습니다。

요약

이예제에서는CIFAR-10데이터로훈련된신경망을사용하여R-CNN정지표지판객체검출기를훈련시키는방법을다루었습니다。딥러닝을사용하여다른객체검출기를훈련시킬때도이와비슷한단계를밟을수있습니다。

참고 항목

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

관련 항목

참고 문헌

格什克,R.多纳休,T.达雷尔和J.马利克。“用于精确目标检测和语义分割的丰富特征层次。”2014年IEEE计算机视觉与模式识别会议论文集。俄亥俄州哥伦布市,2014年6月,第580-587页。

[2]邓俊,董伟文,索彻,李丽娟。李,k。李,l。飞飞。ImageNet:一个大规模的分层图像数据库。2009年IEEE计算机视觉与模式识别会议论文集。迈阿密,佛罗里达州,2009年6月,第248-255页。

[3]克里哲夫斯基,A.和G.辛顿。“从微小的图像中学习多层特征。”多伦多大学硕士论文。加拿大多伦多,2009年。

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