此示例演示如何使用名为“更快r-cnn(具有卷积神经网络的区域)”的深度学习技术来训练对象探测器。

概述

此示例演示如何训练用于检测车辆的更快r-cnn对象探测器。更快的r-nnn [1]是r-cnn [2]和快速r-nnn [3]对象检测技术的引伸。所有这三种技术都使用卷积神经网络(cnn)。它们之间的区别在于它们如何选择要处理的区域以及如何对这些区域进行分类.r-cnn和快速r-概算在运行美国有线电视新闻网之前使用区域建议算法作为预处理步骤。提议算法通常是技术例如edgox [4]或选择性搜索[5],是独立的美国有线电视新闻网。在快速r-cnn的情况下,与运行cnn相比,使用这些技术成为处理瓶颈。更快的r-cnn通过使用美国有线电视新闻网实施区域提案机制来解决这一问题,从而使区域提案成为美国有线电视新闻网培训和预测步骤的一部分。

在该中心中, 使用trainFasterRCNNObjectDetector , 自机视觉系统工具箱 tm .该方案:

  • 为我服务。

  • 网络 (cnn)。

  • 把他放在

  • h. p。

  • 爱的人

* 请将设备与设备、设备和设备

已经成功,有3.0 或高价值使用需要并行计算工具箱™。

为我服务

本示例使用包含295张图像的小型车辆数据集。每个图像包含一个或两个标记的车辆实例。一个小的数据集对于探索更快的r-cnn训练过程很有用,但实际上,需要更多的标记图像来训练一个强大的探测器

%加载车辆数据集 
data = load('fasterRCNNVehicleTrainingData.mat');
vehicleDataset = data.vehicleTrainingData;

训练数据存储在表中。第一列包含图像文件的路径。其余列包含车辆的roi标签。

%显示数据集的前几行。
vehicleDataset(1:4,:)
ans = 4×2表
          imageFilename车辆   
    __________________________ ____________

    'vehicles / image_00001.jpg'[1x4 double]
    'vehicles / image_00002.jpg'[1x4 double]
    'vehicles / image_00003.jpg'[1x4 double]
    'vehicles / image_00004.jpg'[1x4 double]

显示数据集中的一个图像,以了解它所包含的图像类型。

%将完整路径添加到本地车辆数据文件夹。
dataDir = fullfile(toolboxdir('vision'),'visiondata');
vehicleDataset.imageFilename = fullfile(dataDir,vehicleDataset.imageFilename);

%阅读其中一张图片。
我= imread(vehicleDataset.imageFilename {10});

%插入ROI标签。
I = insertShape(I,'Rectangle',vehicleDataset.vehicle {10});

%调整大小并显示图像。
我= imresize(I,3);
数字
imshow(I)

利用更快的r-cnn深度学习进行目标检测

将数据集拆分为训练检测器的训练集和评估检测器的测试集。选择60%的培训数据。使用其余的进行评估。

%将数据拆分为训练和测试集。
idx = floor(0.6 * height(vehicleDataset));
trainingData = vehicleDataset(1:idx,:);
testData = vehicleDataset(idx:end,:);

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

美国有线电视新闻网是更快的r-cnn物体探测器的基础。使用深度学习工具箱™功能逐层创建cnn。

imageInputLayer,它定义了输入层的类型和大小。对于分类任务,输入大小通常是训练图像的大小。对于检测任务,cnn需要分析图像的较小部分,因此输入大小必须与数据集中最小的对象相似。在此数据集中,所有对象都大于[16 16],因此请选择[32 32]的输入大小。此输入大小是cnn需要解析的处理时间和空间细节量之间的平衡。

%创建图像输入图层。
inputLayer = imageInputLayer([32 32 3]);

接下来,定义网络的中间层。中间层由convolution2dLayerreluLayer单元和maxPooling2dLayer的重复块组成。这些层构成了卷积神经网络的核心组成部分。

%定义卷积层参数。
filterSize = [3 3];
numFilters = 32;

%创建中间层。
middleLayers = [
                
    convolution2dLayer(filterSize,numFilters,'Padding',1)   
    reluLayer()
    convolution2dLayer(filterSize,numFilters,'Padding',1)  
    reluLayer() 
    maxPooling2dLayer(3,'Stride',2)    
    
    ]。

您可以通过重复这些基本图层来创建更深的网络。但是,为了避免过早地向下采样数据,请将池层的数量保持在较低的水平。在网络早期进行向下采样会丢弃对学习有用的图像信息。

有线电视美国新闻网的求最后一层通常由fullyConnectedLayer状语从句:softmaxLayer组成

finalLayers = [
    
    %添加具有64个输出神经元的完全连接的层。
    此图层的输出大小%将是一个长度为64的数组。
    fullyConnectedLayer(64)

    %添加ReLU非线性。
    reluLayer()

    %添加最后一个完全连接的图层。此时,网络必须
    %生成可用于测量输入图像
    %
    是否属于对象类或背景之一的输出。使用随后的损耗层进行该测量%。
    fullyConnectedLayer(宽度(vehicleDataset))

    %添加softmax损耗图层和分类图层。 
    softmaxLayer()
    classificationLayer()
]。

合并输入,中间和最终图层。

layers = [
    inputLayer
    middleLayers
    finalLayers
    ]
layers = 
  带有图层的11x1图层数组:

     1''图像输入带有'zerocenter'标准化的32x32x3图像
     2''卷积32 3x3卷积,步幅[1 1]和填充[1 1 1 1]
     3''ReLU ReLU
     4''卷积32 3x3卷积,步幅[1 1]和填充[1 1 1 1]
     5''ReLU ReLU
     6''Max Pooling 3x3 max pooling with stride [2 2]和padding [0 0 0 0]
     7''完全连接64完全连接层
     8''ReLU ReLU
     9''完全连接2完全连接层
    10''Softmax softmax
    11''分类输出crossentropyex

配置培训选项

trainFasterRCNNObjectDetector步骤训练探测器。前两个步骤培训了该地区的建议和检测网络,用于更快的r-cnn。最后两个步骤将前两个步骤中的网络组合在一起,以便创建一个用于检测的网络[1]。每个训练步骤可以有不同的收敛速度,因此为每个步骤指定独立的训练选项是有益的。若要指定网络培训选项,请使用 trainingOptions 

步骤1的选项%optionsStage1 
= trainingOptions('sgdm'... 
    'MaxEpochs',10,... 
    'MiniBatchSize',1,...... 
    'InitialLearnRate',1e-3,...... 
    'CheckpointPath', TEMPDIR);

步骤2的选项%optionsStage2 
= trainingOptions('sgdm'... 
    'MaxEpochs',10,... 
    'MiniBatchSize',1,...... 
    'InitialLearnRate',1e-3,...... 
    'CheckpointPath', TEMPDIR);

步骤3的选项%optionsStage3 
= trainingOptions('sgdm'... 
    'MaxEpochs',10,... 
    'MiniBatchSize',1,...... 
    'InitialLearnRate',1e-3,...... 
    'CheckpointPath', TEMPDIR);

%选项步骤4. optionsStage4 
= trainingOptions('sgdm'... 
    'MaxEpochs',10,... 
    'MiniBatchSize',1,...... 
    'InitialLearnRate',1e-3,...... 
    'CheckpointPath', TEMPDIR);

options = [
    optionsStage1
    optionsStage2
    optionsStage3
    optionsStage4
    ]。

在这里,前两个步骤的学习速率设置为高于最后两个步骤。由于最后两个步骤是微调步骤,因此网络权重的修改速度可能比前两个步骤慢。对于更快的r-cnn训练,迷你批处理大小必须为1,每次迭代都会从一个训练图像处理多个图像区域。

此外,'CheckpointPath'设置为所有培训选项的临时位置。通过此名称值对,可以在训练过程中节省部分训练的检测器。如果培训中断(例如由于停电或系统故障),您可以从保存的检查点恢复培训。

火车更快r-cnn

现在已经定义了cnn和训练选项,您可以使用trainFasterRCNNObjectDetector训练探测器

在训练过程中,从训练图像中处理多个图像区域。每个图像的图像区域数由'NumRegionsToSample'“控制。'PositiveOverlapRange''NegativeOverlapRange'名称 - 值对控制用于训练的图像区域。正训练样本是指那些与地面真相框重叠0.6到1.0的样本,用联合度量的边界框交点来衡量。负训练样本是那些重叠0到0.3的样本。应通过在验证集中测试训练的检测器来选择这些参数的最佳值。

对于更快的r-cnn培训,强烈建议使用一个并行的matlab工作人员池,以减少培训时间trainFasterRCNNObjectDetector您的并行首选项设置,自动创建并使用并行池。确保在培训之前启用了并行池的使用。

高度推荐具有cvida™以上计算能力的nvidia™依照gpu进行培训。

为了运动此示例时节省时间,将从磁盘加载预培训的网络。要自己训练网络,请将此处显示的doTrainingAndEval变量设置为真。

%运行
%示例时,从磁盘加载经过训练的网络以节省时间将此标志设置为true以训练网络。
doTrainingAndEval = false;

if doTrainingAndEval
     %设置随机种子以确保示例训练可重复性。
    RNG(0);
    
    %训练更快的R-CNN探测器。选择BoxPyramidScale为1.2以允许
    %以获得更精细的多尺度对象检测分辨率。
    detector = trainFasterRCNNObjectDetector(trainingData,layers,options,... 
        'NegativeOverlapRange',[0 0.3],... 
        'PositiveOverlapRange',[0.6 1],... 
        'NumRegionsToSample',[256 128 256 128],.. 。
        'BoxPyramidScale',1.2);
else 
    %负载预训练检测器的例子。
    detector = data.detector;
结束

若要快速验证训练,请在测试图像上运行检测器。

%读取测试图像。
I = imread(testData.imageFilename {1});

%运行检测器。
[bboxes,scores] = detect(detector,I);

%注释图像中的检测。
I = insertObjectAnnotation(I,'rectangle',bboxes,scores);
数字
imshow(I)

利用更快的r-cnn深度学习进行目标检测

尽管测试一张图像显示出很有希望的结果,但并非所有测试图像都能产生检测结果。请在整个测试集中评估检测器,请按照下一节中概述的评估程序进行操作。

使用测试集评估检测器

计算机视觉系统工具箱™提供对象检测器评估功能,以测量常见的指标,如evaluateDetectionPrecision平均精度)和对数平均漏诊率()。在这里,使用平均精度度量。平均精度提供了一个数字,其中包含了检测器进行正确分类的能力(精度)和检测器查找所有相关对象的能力(召回)。evaluateDetectionMissRate

检测器评估的第一步是通过在测试装置上运行检测器来收集检测结果。为了避免较长的评估时间,将从磁盘加载结果。将上一节doTrainingAndEval标志设置为真,以便在本地执行评估。

if doTrainingAndEval
     %在测试集中的每个图像上运行检测器并收集结果。
    resultsStruct = struct([]);
    for i = 1:height(testData)
        
        %阅读图像。
        I = imread(testData.imageFilename {i});
        
        %运行检测器。
        [bbox,分数,标签] =检测(检测器,I);
        
        %收集结果。
        resultsStruct(i).Boxes = bboxes;
        resultsStruct(i).Scores =得分;
        resultsStruct(i)。标签=标签;
    结束
    
    %将结果转换为表格。
    results = struct2table(resultsStruct);
else 
    %从磁盘加载结果。
    results = data.results;
结束

%从测试数据中提取预期的边界框位置。
expectedResults = testData(:,2:end);

%使用“平均精度”度量标准评估对象检测器。
[ap,recall,precision] = evaluateDetectionPrecision(results,expectedResults);

精确召回(pr)曲线突出了探测器在不同召回水平下的精度。理想情况下,所有召回级别的精度为1. 在网络中使用其他图层有助于提高平均精度,但可能需要额外的培训数据和更长的培训时间。

%绘图精度/召回曲线
数字
图(召回,精度)
xlabel('召回'
ylabel('精确'
网格 
的标题(sprintf的('平均精密=%.2f',AP))

利用更快的r-cnn深度学习进行目标检测

总结

这个例子展示了如何使用深度学习来训练车辆检测器您可以按照类似的步骤为交通标志,行人或其他物体训练探测器。

引用

[1]任,s。,k。他,r。gershick和j。太阳。“更快的řCN:d ----使用区域建议网络实现实时目标检测”。模式分析与机器智能的IEEE交易第39卷,第6期,2017年6月,1137至1149年页。

[2] girshick,r。,j。donahue,t。达雷尔和j。malik。“用于精确对象检测和语义分割的丰富特征层次结构。2014年ieee计算机视觉和模式识别会议论文集俄亥俄州哥伦布市,2014年6月,580-587页。

[3] girshick,r。“快速r-nnn”。2015年ieee计算机视觉国际会议论文集智利圣地亚哥,2015年12月,第1440-1448页。

[4] zitnick,cl,p。美元。“边缘框:边缘从定位对象建议欧洲计算机视觉会议瑞士苏黎世,2014年9月,第3391-405页。

[5] uijlings,jrr,kea van de sande,t。gevers和awm meulders。“选择性搜索对象识别。国际计算机视觉杂志第104卷,第2期,2013年9月,154-171页。

 

关注公众号: 只关于编程 (ID:allcoding) ,每天推送MATLAB学习最常见的问题,每天进步一点点,业精于勤荒于嬉

利用更快的r-cnn深度学习进行目标检测

 打开微信扫一扫哦!