主要内容

更快的R-CNN示例

创建R-CNN对象检测网络

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

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

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

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

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

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

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

%指定网络应该分类的类数。numClassesPlusBackground = 2 + 1;定义新的分类层newLayers=[fullyConnectedLayer(numClassSplusBackground,“姓名”,“rcnnFC”) softmaxLayer (“姓名”,“rcnnSoftmax”)分类层(“姓名”,“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。net=resnet50;lgraph=layerGraph(net);%从ResNet-50中删除最后3层。层存储移动={“fc1000”“fc1000_softmax”“ClassificationLayer_fc1000”};lgraph=移除层(lgraph,层移除);%指定网络应该分类的类数。numClasses = 2;numClassesPlusBackground = numClasses + 1;%定义新的分类层。newLayers=[fullyConnectedLayer(numClassSplusBackground,“姓名”,“rcnnFC”) softmaxLayer (“姓名”,“rcnnSoftmax”)分类层(“姓名”,“rcnnClassification”));%添加新层。lgraph = addLayers(lgraph, newLayers);%将新图层连接到网络。lgraph = connectLayers (lgraph,“avg_pool”,“rcnnFC”);

添加边界框回归层

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

长方体回归层由完全连接层和R-CNN长方体回归层组成。完全连接层配置为为为每个类输出一组4个长方体偏移量。背景类被排除,因为背景边界框未被细化。

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

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

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

添加最大ROI池层

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

特征提取层=“activation_40_relu”;图形图(lgraph)ylim([30 42])

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

断开附加到所选特征提取层的层。lgraph=断开连接层(lgraph,featureExtractionLayer,“res5a_branch2a”);lgraph=断开连接层(lgraph,featureExtractionLayer,“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/in”);%将ROI max pool的输出连接到上面断开连接的层。lgraph = connectLayers (lgraph,“roiPool”,“res5a_branch2a”);lgraph=连接层(lgraph,“roiPool”,“res5a_branch1”);%显示添加并连接ROI最大池层后的结果。图形绘图(lgraph)ylim([30 42])

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

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

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

创建更快的R-CNN目标检测网络

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

创建快速R-CNN网络

首先创建Fast R-CNN,这是Fast R-CNN的基础创建快速R-CNN目标检测网络示例详细解释了这段代码。

%加载预训练的ResNet-50。net=resnet50;lgraph=layerGraph(net);删除最后3层。层存储移动={“fc1000”“fc1000_softmax”“ClassificationLayer_fc1000”};lgraph=移除层(lgraph,层移除);%指定网络应该分类的类数。numClasses = 2;numClassesPlusBackground = numClasses + 1;%定义新的分类层。newLayers=[fullyConnectedLayer(numClassSplusBackground,“姓名”,“rcnnFC”) softmaxLayer (“姓名”,“rcnnSoftmax”)分类层(“姓名”,“rcnnClassification”));添加新的对象分类层。lgraph = addLayers(lgraph, newLayers);%将新图层连接到网络。lgraph = connectLayers (lgraph,“avg_pool”,“rcnnFC”);%定义完全连接层的输出数量。numOutputs = 4 * numClasses;%创建框回归层。boxRegressionLayers = [fulllyconnectedlayer (numOutputs,“姓名”,“rcnnBoxFC”)回归层(“姓名”,“RCNNBOX三角洲”));将层添加到网络中。lgraph=添加层(lgraph,boxRegressionLayers);将回归层连接到名为“avg_pool”的层。lgraph = connectLayers (lgraph,“avg_pool”,“rcnnBoxFC”);%选择特征提取图层。特征提取层=“activation_40_relu”;断开附加到所选特征提取层的层。lgraph=断开连接层(lgraph,featureExtractionLayer,“res5a_branch2a”);lgraph=断开连接层(lgraph,featureExtractionLayer,“res5a_branch1”);%添加ROI最大池层。outputSize = [14 14];roiPool = roiMaxPooling2dLayer (outputSize,“姓名”,“roiPool”);lgraph = addLayers(lgraph, roiPool);%将特征提取层连接到ROI最大池层。lgraph=连接层(lgraph,featureExtractionLayer,“roiPool/in”);%将ROI max pool的输出连接到上面断开连接的层。lgraph = connectLayers (lgraph,“roiPool”,“res5a_branch2a”);lgraph=连接层(lgraph,“roiPool”,“res5a_branch1”);

添加区域建议网络(RPN)

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

了解更多关于用于目标检测的锚盒.

定义定位框并创建一个区域提议者.

定义锚盒。主播盒=[16 32 16 32];%创建区域建议层。proposalLayer=区域proposalLayer(锚箱、,“姓名”,“区域提案”);lgraph = addLayers(lgraph, proposalLayer);

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

%锚箱数量。numAnchors=尺寸(锚箱,1);%从特征提取层出来的特征贴图数。numFilters=1024;rpnLayers=[convolution2dLayer(3,numFilters,“填充”[1],“姓名”,“rpnConv3x3”)雷卢耶(“姓名”,“rpnRelu”)];lgraph=addLayers(lgraph,rpnLayers);%连接RPN到特征提取层。lgraph=连接层(lgraph,featureExtractionLayer,“rpnConv3x3”);

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

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

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

%添加RPN回归层。rpnRegLayers=[Recolution2Dlayer(1,numAnchors*4,“姓名”,“RPNconv1x1BoxDelta”)回归层(“姓名”,“RpnboxDelta”);];lgraph = addLayers(lgraph, rpnRegLayers);%将回归层连接到RPN网络。lgraph = connectLayers (lgraph,“rpnRelu”,“RPNconv1x1BoxDelta”);

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

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

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