主要内容

快R-CNN例子

创建R-CNN对象检测网络

这个例子展示了如何修改pretrained ResNet-50网络到一个R-CNN对象检测网络。在这个示例中创建的网络可以被训练使用trainRCNNObjectDetector

%负载pretrained 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 = [fullyConnectedLayer 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对象检测网络上面的例子。它转换pretrained ResNet-50网络为快速R-CNN对象检测网络通过添加一个ROI池层和一个边界框回归层。快速R-CNN网络可以被训练使用trainFastRCNNObjectDetector

创建R-CNN网络

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

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

添加边界框回归层

添加一个盒回归层学习一套盒补偿适用于该地区的建议。学习补偿变换该地区建议盒子,这样他们更接近原始地面真理边界框。这种转变有助于改善R-CNN快速的定位性能。

盒子回归层是由一个完全连接层后跟一个R-CNN框回归层。完全连接层配置为输出的一组4盒偏移量为每个类。后台类排除因为背景边框不完善。

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

盒子回归层通常是连接到同一层分类分支连接。

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

增加ROI马克斯池层

下一步是选择使用哪个层网络中作为特征提取层。这一层将被连接到ROI马克斯池层将池特性分类集中地区。选择一个特征提取层需要实证评估。ResNet-50,典型的特征提取层是几块的输出曲线玲珑,这对应于层activation40_relu命名。

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

为了插入ROI马克斯池层,首先断开层附着在特征提取层:res5a_branch2a res5a_branch1。

%层断开连接到所选特征提取层。lgraph = disconnectLayers (lgraph featureExtractionLayer,“res5a_branch2a”);lgraph = disconnectLayers (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 /”);% ROI马克斯池的输出连接到断开连接层。lgraph = connectLayers (lgraph,“roiPool”,“res5a_branch2a”);lgraph = connectLayers (lgraph,“roiPool”,“res5a_branch1”);%显示结果后添加和ROI马克斯池层连接。图绘制(lgraph) ylim ([30 42])

最后,ROI的输入层连接到第二个输入的ROI马克斯池层。

%增加ROI输入层。roiInput = roiInputLayer (“名字”,“roiInput”);lgraph = addLayers (lgraph roiInput);%连接ROI输入层的“投资回报率”输入ROI马克斯池层。lgraph = connectLayers (lgraph,“roiInput”,“roiPool / roi”);%显示生成的更快的增加和连接ROI的输入层。图绘制(lgraph) ylim ([30 42])

网络已经准备好被训练使用trainFastRCNNObjectDetector

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

这个例子构建的创建快速R-CNN对象检测网络上面的例子。它转换pretrained ResNet-50网络为更快R-CNN对象检测网络通过添加一个ROI池层、一层边界框的回归,一个地区建议网络(RPN)。越快R-CNN网络可以被训练使用trainFasterRCNNObjectDetector

创建快速R-CNN网络

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

%加载pretrained ResNet-50。网= resnet50;lgraph = layerGraph(净);%删除过去的3层。layersToRemove = {“fc1000”“fc1000_softmax”“ClassificationLayer_fc1000”};lgraph = removeLayers (lgraph layersToRemove);%指定网络类的数量应该分类。numClasses = 2;numClassesPlusBackground = numClasses + 1;%定义新的分类层。newLayers = [fullyConnectedLayer numClassesPlusBackground,“名字”,“rcnnFC”)softmaxLayer (“名字”,“rcnnSoftmax”)classificationLayer (“名字”,“rcnnClassification”));%添加新对象分类层。lgraph = addLayers (lgraph newLayers);%将新层连接到网络。lgraph = connectLayers (lgraph,“avg_pool”,“rcnnFC”);%定义输出完全连接层的数量。numOutputs = 4 * numClasses;%创建盒子回归层。boxRegressionLayers = [fullyConnectedLayer numOutputs,“名字”,“rcnnBoxFC”)rcnnBoxRegressionLayer (“名字”,“rcnnBoxDeltas”));%层添加到网络。lgraph = addLayers (lgraph boxRegressionLayers);%连接回归层图层命名为“avg_pool”。lgraph = connectLayers (lgraph,“avg_pool”,“rcnnBoxFC”);%选择一个特征提取层。featureExtractionLayer =“activation_40_relu”;%层断开连接到所选特征提取层。lgraph = disconnectLayers (lgraph featureExtractionLayer,“res5a_branch2a”);lgraph = disconnectLayers (lgraph featureExtractionLayer,“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)生成区域建议。一个生产地区建议项预测类,“对象”或“背景”,和盒子补偿一组预定义的边界框模板称为“锚盒子”。锚箱通过提供指定它们的大小,通常是基于先验知识确定对象的规模和比例的训练数据集。

了解更多关于锚箱对象检测

定义锚箱和创建一个regionProposalLayer

%定义锚箱。anchorBoxes = [16 16 32 32];%该地区创建方案层。proposalLayer = regionProposalLayer (anchorBoxes,“名字”,“regionProposal”);lgraph = addLayers (lgraph proposalLayer);

添加卷积层并将其连接到特征提取层选择项。

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

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

%添加项分类层。rpnClsLayers = [convolution2dLayer (1, numAnchors * 2,“名字”,“rpnConv1x1ClsScores”)rpnSoftmaxLayer (“名字”,“rpnSoftmax”)rpnClassificationLayer (“名字”,“rpnClassification”));lgraph = addLayers (lgraph rpnClsLayers);%连接的分类层次的RPN网络。lgraph = connectLayers (lgraph,“rpnRelu”,“rpnConv1x1ClsScores”);

添加项回归输出层。回归预测层4箱偏移量为每个锚箱。

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

最后,连接的分类和回归功能层的输入映射到该地区的提议,向该地区和ROI池层建议层输出。

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

网络已经准备好被训练使用trainFasterRCNNObjectDetector