主要内容

快R-CNN例子

创建R-CNN对象检测网络

这个例子展示了如何将预先训练好的ResNet-50网络修改为R-CNN对象检测网络。可以使用本例中创建的网络进行培训trainRCNNObjectDetector

%加载预训练的ResNet-50。网= resnet50 ();%将网络转换为一个层图形对象来操作层。lgraph = layerGraph(净);

将网络转换为R-CNN网络的过程与图像分类的迁移学习流程相同。你将最后3个分类层替换为新的层,这些层可以支持你想要检测的对象类的数量,加上一个背景类。金宝app

在ResNet-50中,最后三层的名称分别为fc1000、fc1000_softmax和ClassificationLayer_fc1000。显示网络,并放大您将修改的网络部分。

图(lgraph) ylim([-5 16])

删除最后3层。layersToRemove = {“fc1000”“fc1000_softmax”“ClassificationLayer_fc1000”};lgraph = removeLayers(lgraph, layersToRemove);%删除图层后显示结果。图(lgraph) ylim([-5 16])

向网络添加新的分类层。这些层的设置是为了分类网络应该检测的对象的数量加上一个额外的背景类。在检测过程中,网络处理裁剪后的图像区域,并将其分类为属于某个目标类别或背景。

%指定网络应该分类的类数。numClassesPlusBackground = 2 + 1;定义新的分类层newLayers = [fullconnectedlayer (numClassesPlusBackground,“名字”“rcnnFC”) softmaxLayer (“名字”“rcnnSoftmax”) classificationLayer (“名字”“rcnnClassification”));添加新图层lgraph = addLayers(lgraph, newLayers);将新层连接到网络。lgraph = connectLayers (lgraph,“avg_pool”“rcnnFC”);%显示最后的R-CNN网络。这可以使用trainRCNNObjectDetector进行训练。图(lgraph) ylim([-5 16])

创建快速R-CNN对象检测网络

这个例子建立在创建R-CNN对象检测网络上面的例子。通过加入ROI池化层和边界盒回归层,将预先训练好的ResNet-50网络转换为Fast R-CNN目标检测网络。Fast R-CNN网络可以使用trainFastRCNNObjectDetector

创建R-CNN网络

首先创建一个R-CNN网络,形成快速R-CNN的基础。的创建R-CNN对象检测网络示例详细解释了这部分代码。

%加载预训练的ResNet-50。网= resnet50;lgraph = layerGraph(净);%从ResNet-50移除最后3层layersToRemove = {“fc1000”“fc1000_softmax”“ClassificationLayer_fc1000”};lgraph = removeLayers(lgraph, layersToRemove);%指定网络应该分类的类数。numClasses = 2;numClassesPlusBackground = numClasses + 1;定义新的分类层。newLayers = [fullconnectedlayer (numClassesPlusBackground,“名字”“rcnnFC”) softmaxLayer (“名字”“rcnnSoftmax”) classificationLayer (“名字”“rcnnClassification”));%添加新图层。lgraph = addLayers(lgraph, newLayers);将新层连接到网络。lgraph = connectLayers (lgraph,“avg_pool”“rcnnFC”);

添加边界框回归层

添加框回归层以学习一组框偏移,以应用于区域建议框。学习的偏移量变换区域提议框,使它们更接近原始的地面真值边界框。这种转换有助于提高Fast R-CNN的定位性能。

盒回归层由一个完全连接层和一个R-CNN盒回归层组成。全连接层被配置为为每个类输出一组4个盒偏移量。背景类被排除在外,因为背景包围框没有被优化。

%定义完全连接层的输出数量。numOutputs = 4 * numClasses;%创建框回归层。boxRegressionLayers = [fulllyconnectedlayer (numOutputs,“名字”“rcnnBoxFC”) rcnnBoxRegressionLayer (“名字”“rcnnBoxDeltas”));将层添加到网络中lgraph = addLayers(lgraph, boxRegressionLayers);

盒回归层通常连接到分类分支所连接的同一层。

将回归层连接到名为“avg_pool”的层。lgraph = connectLayers (lgraph,“avg_pool”“rcnnBoxFC”);%显示Fast R-CNN的分类和回归分支。图(lgraph) ylim([-5 16])

添加最大ROI池层

下一步是选择使用网络中的哪一层作为特征提取层。该层将连接到ROI最大池化层,该层将池化特征以对池化区域进行分类。选择特征提取层需要经验评价。对于ResNet-50,典型的特征提取层是卷积的第4块的输出,对应于activation40_relu层。

featureExtractionLayer =“activation_40_relu”;图(lgraph) ylim([30 42])

为了插入ROI最大池化层,首先断开连接到特征提取层res5a_branch2a和res5a_branch1的层。

断开附加到所选特征提取层的层。lgraph = disconnectLayers(lgraph, featureextracactionlayer,“res5a_branch2a”);lgraph = disconnectLayers(lgraph, featureextracactionlayer,“res5a_branch1”);添加最大ROI池层。outputSize = [14 14]
outputSize =1×214日14
roiPool = roiMaxPooling2dLayer (outputSize,“名字”“roiPool”);lgraph = addLayers(lgraph, roiPool);%将特征提取层连接到ROI最大池化层。lgraph = connectLayers (lgraph,“activation_40_relu”“roiPool /”);%将最大ROI池的输出从上面连接到断开的层。lgraph = connectLayers (lgraph,“roiPool”“res5a_branch2a”);lgraph = connectLayers (lgraph,“roiPool”“res5a_branch1”);%显示添加并连接ROI最大池层后的结果。图(lgraph) ylim([30 42])

最后,将ROI输入层连接到ROI最大池化层的第2个输入。

添加ROI输入层。roiInput = roiInputLayer (“名字”“roiInput”);lgraph = addLayers(lgraph, roiInput);将ROI输入层连接到ROI最大池化层的“ROI”输入。lgraph = connectLayers (lgraph,“roiInput”“roiPool / roi”);%显示快速添加和连接ROI输入层的结果。图(lgraph) ylim([30 42])

网络已准备好接受训练使用trainFastRCNNObjectDetector

创建更快的R-CNN对象检测网络

这个例子建立在创建快速R-CNN对象检测网络上面的例子。它通过添加ROI池化层、边界盒回归层和区域建议网络(RPN),将预先训练好的ResNet-50网络转换为Faster R-CNN对象检测网络。更快的R-CNN网络可以使用trainFasterRCNNObjectDetector

创建快速R-CNN网络

首先创建Fast R-CNN,它形成了Faster R-CNN的基础。的创建快速R-CNN对象检测网络示例详细解释了这部分代码。

%加载预训练的ResNet-50。网= resnet50;lgraph = layerGraph(净);删除最后3层。layersToRemove = {“fc1000”“fc1000_softmax”“ClassificationLayer_fc1000”};lgraph = removeLayers(lgraph, layersToRemove);%指定网络应该分类的类数。numClasses = 2;numClassesPlusBackground = numClasses + 1;定义新的分类层。newLayers = [fullconnectedlayer (numClassesPlusBackground,“名字”“rcnnFC”) softmaxLayer (“名字”“rcnnSoftmax”) classificationLayer (“名字”“rcnnClassification”));添加新的对象分类层。lgraph = addLayers(lgraph, newLayers);将新层连接到网络。lgraph = connectLayers (lgraph,“avg_pool”“rcnnFC”);%定义完全连接层的输出数量。numOutputs = 4 * numClasses;%创建框回归层。boxRegressionLayers = [fulllyconnectedlayer (numOutputs,“名字”“rcnnBoxFC”) rcnnBoxRegressionLayer (“名字”“rcnnBoxDeltas”));将层添加到网络中。lgraph = addLayers(lgraph, boxRegressionLayers);将回归层连接到名为“avg_pool”的层。lgraph = connectLayers (lgraph,“avg_pool”“rcnnBoxFC”);%选择一个特征提取层。featureExtractionLayer =“activation_40_relu”断开附加到所选特征提取层的层。lgraph = disconnectLayers(lgraph, featureextracactionlayer,“res5a_branch2a”);lgraph = disconnectLayers(lgraph, featureextracactionlayer,“res5a_branch1”);添加最大ROI池层。outputSize = [14 14];roiPool = roiMaxPooling2dLayer (outputSize,“名字”“roiPool”);lgraph = addLayers(lgraph, roiPool);%将特征提取层连接到ROI最大池化层。lgraph = connectLayers(lgraph, featureExtractionLayer,“roiPool /”);%将最大ROI池的输出从上面连接到断开的层。lgraph = connectLayers (lgraph,“roiPool”“res5a_branch2a”);lgraph = connectLayers (lgraph,“roiPool”“res5a_branch1”);

添加区域建议网络(RPN)

更快的R-CNN使用区域建议网络(RPN)来生成区域建议。RPN通过预测类、“对象”或“背景”,以及一组被称为“锚盒”的预定义边界盒模板的盒偏移量来产生区域建议。锚盒是通过提供其大小来指定的,通常是根据训练数据集中对象的规模和宽高比的先验知识来确定的。

了解更多关于用于对象检测的锚盒

定义锚框并创建regionProposalLayer

定义锚盒。anchorBoxes = [16 16 32 16 16 32];%创建区域提议层。proposalLayer = regionProposalLayer (anchorBoxes,“名字”“regionProposal”);lgraph = addLayers(lgraph, proposalLayer);

为RPN添加卷积层,并将其连接到上面所选的特征提取层。

%锚箱数量。numAnchors =大小(anchorBoxes, 1);%从特征提取层出来的特征图数量。numFilters = 1024;rpnLayers =[卷积2dlayer (3, numFilters,“填充”[1],“名字”“rpnConv3x3”) reluLayer (“名字”“rpnRelu”));lgraph = addLayers(lgraph, rpnLayers);%连接RPN到特征提取层。lgraph = connectLayers(lgraph, featureExtractionLayer,“rpnConv3x3”);

添加RPN分类输出层。分类层将每个锚分为“对象”或“背景”。

%添加RPN分类层。rpnClsLayers =[卷积2dlayer (1, numAnchors*2,“名字”“rpnConv1x1ClsScores”) rpnSoftmaxLayer (“名字”“rpnSoftmax”) rpnClassificationLayer (“名字”“rpnClassification”));lgraph = addLayers(lgraph, rpnClsLayers);%将分类层接入RPN网络。lgraph = connectLayers (lgraph,“rpnRelu”“rpnConv1x1ClsScores”);

添加RPN回归输出层。回归层为每个锚盒预测了4个盒偏移量。

%添加RPN回归层。rpnRegLayers =[卷积2dlayer (1, numAnchors*4,“名字”“rpnConv1x1BoxDeltas”) rcnnBoxRegressionLayer (“名字”“rpnBoxDeltas”);];lgraph = addLayers(lgraph, rpnRegLayers);%连接回归层到RPN网络。lgraph = connectLayers (lgraph,“rpnRelu”“rpnConv1x1BoxDeltas”);

最后,将分类和回归特征映射连接到区域建议层输入,将ROI池化层连接到区域建议层输出。

%连接区域建议网络。lgraph = connectLayers (lgraph,“rpnConv1x1ClsScores”“regionProposal /分数”);lgraph = connectLayers (lgraph,“rpnConv1x1BoxDeltas”“regionProposal / boxDeltas”);连接区域提议层到roi池。lgraph = connectLayers (lgraph,“regionProposal”“roiPool / roi”);%显示添加RPN层后的网络。图(lgraph) ylim([30 42])

网络已准备好接受训练使用trainFasterRCNNObjectDetector