Main Content

Faster R-CNN の例

R-CNN オブジェクト検出ネットワークの作成

この例では、事前学習済みの ResNet-50 ネットワークを R-CNN オブジェクト検出ネットワークに変更する方法を説明します。この例で作成するネットワークは、trainrcnnobjectDetectorを使用して学習させることができます。

% Load pretrained ResNet-50.net = resnet50();%将网络转换为图层图对象以操纵图层。lgraph = layerGraph(net);

ネットワークを R-CNN ネットワークに変換する手順は、イメージ分類の転移学習のワークフローと同じです。最後の 3 つの分類層を、検出するオブジェクト クラスの数と背景クラスをサポートできる新しい層で置き換えます。

resnet-50では最后ののののつのつの层は,,,,,,、fc1000_softmax,,

figure plot(lgraph) ylim([-5 16])

% Remove the last 3 layers.LayerStoreMove = {'fc1000''fc1000_softmax''ClassificationLayer_fc1000'}; lgraph = removeLayers(lgraph, layersToRemove);%删除层后显示结果。figure plot(lgraph) ylim([-5 16])

に新しいをしし。层はネットワークネットワークが必要必要ののあるあるオブジェクトオブジェクトオブジェクトのの数数分类分类しし,,追加追加の背景背景クラスクラスもももも分类分类分类分类设定设定ししししし领域をて,领域がオブジェクトオブジェクトクラスののつつ背景に属するものとして分类ます。。

%指定网络应分类的类数。numClassesplusbackground = 2 + 1;%定义新的分类层newlayers = [PlullConnectedLayer(NumClassesplusbackground,'姓名',,,,'rcnnfc') softmaxLayer('姓名',,,,'rcnnsoftmax') classificationLayer('姓名',,,,'rcnnClassification');%添加新层lgraph = addlayers(lgraph,newlayers);%将新层连接到网络。lgraph =连接器(lgraph,'avg_pool',,,,'rcnnfc');%显示最终的R-CNN网络。这可以使用TrainrcnnobjectDetector进行训练。figure plot(lgraph) ylim([-5 16])

Fast R-CNN オブジェクト検出ネットワークの作成

この例は、上記のR-CNN オブジェクト検出ネットワークの作成のにいます。。trainFastRCNNObjectDetectorを使用して学習させることができます。

R-CNN ネットワークの作成

まず、Fast R-CNN の基礎となる R-CNN ネットワークを作成します。R-CNN オブジェクト検出ネットワークの作成の例で、このコード セクションを詳細に説明しています。

% Load pretrained ResNet-50.net = resnet50; lgraph = layerGraph(net);%从Resnet-50中删除最后3层。LayerStoreMove = {'fc1000''fc1000_softmax''ClassificationLayer_fc1000'}; lgraph = removeLayers(lgraph, layersToRemove);%指定网络应分类的类数。numClasses = 2; numClassesPlusBackground = numClasses + 1;%定义新的分类层。newlayers = [PlullConnectedLayer(NumClassesplusbackground,'姓名',,,,'rcnnfc') softmaxLayer('姓名',,,,'rcnnsoftmax') classificationLayer('姓名',,,,'rcnnClassification');%添加新层。lgraph = addlayers(lgraph,newlayers);%将新层连接到网络。lgraph =连接器(lgraph,'avg_pool',,,,'rcnnfc');

境界ボックス回帰层追加

领域ボックス适用一连のオフセットを学习するためのをを追加追加ししますますます。。学习したたオフセットオフセットによってによって,,领域领域提案提案ボックスボックスがが元元元元のグラウンド境界ボックスボックスボックスボックス,快速r-cnnのの推定が向上し。。。

ボックスは结合层と続く続く続く続く続く続く続く続くボックスボックスボックスボックスささされれますますますます。。全结合层层はは,,各各各に対してに対して,,,,,,,つつつつつつボックスボックスオフセット背景クラス背景ボックスが调整れてない,除外ささます。

% Define the number of outputs of the fully connected layer.numOutputs = 4 * numClasses;% Create the box regression layers.boxRegressionLayers = [ fullyConnectedLayer(numOutputs,'姓名',,,,'rcnnBoxFC')rcnnboxRegressrementlayer('姓名',,,,'rcnnBoxDeltas');%将图层添加到网络lgraph = addlayers(lgraph,boxRegressionlayers);

ボックスは,分岐がされいるの同じ层に结合ささます。。。

%将回归层连接到名为“ AVG_POOL”的层。lgraph =连接器(lgraph,'avg_pool',,,,'rcnnBoxFC');%显示快速R-CNN的分类和回归分支。figure plot(lgraph) ylim([-5 16])

ROI の最大プーリング層の追加

次手顺特徴抽出层として使用するの层を选択选択ですです。。このこのこの层层层层ははプリーングプリーングプリーングプリーングさされれれたたた领域领域领域领域ののの分类のののためためためにに層の選択には、実証的評価が必要です。ResNet-50 の場合、一般的な特徴抽出層は、畳み込みの 4 番目のブロックの出力です。これは、activation40_relu という名前の層に対応します。

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

ROI 最大プーリング層を挿入するには、まず、特徴抽出層に結合されている層 res5a_branch2a および res5a_branch1 を切り離します。

%断开的层选择feature extraction layer.lgraph = disconnectlayers(lgraph,features extractionlayer,'res5a_branch2a');lgraph = disconnectlayers(lgraph,features extractionlayer,'res5a_branch1');% Add ROI max pooling layer.outputSize = [14 14]
outputSize =1×214 14
roiPool = roiMaxPooling2dLayer(outputSize,'姓名',,,,'Roipool');lgraph = addlayers(lgraph,roipool);%将特征提取层连接到ROI最大池池。lgraph =连接器(lgraph,'activation_40_relu',,,,'roiPool/in');%将ROI Max池的输出连接到上面的断开层。lgraph =连接器(lgraph,'Roipool',,,,'res5a_branch2a');lgraph =连接器(lgraph,'Roipool',,,,'res5a_branch1');% Show the result after adding and connecting the ROI max pooling layer.图(lgraph)ylim([30 42])

ROI入力层ををを最大最大最大プーリング层のの番目番目入力に结合ますます。。

% Add ROI input layer.roiinput = roiinputlayer('姓名',,,,'roiInput');lgraph = addlayers(lgraph,roiinput);% Connect ROI input layer to the 'roi' input of the ROI max pooling layer.lgraph =连接器(lgraph,'roiInput',,,,'Roipool/roi');%显示所得更快的添加并连接ROI输入层。图(lgraph)ylim([30 42])

これで,trainFastRCNNObjectDetectorを使用てをさせる准备整いました。

更快的R-CNNオブジェクト検出作成作成

この例は、上記のFast R-CNN オブジェクト検出ネットワークの作成のにいます。。プーリングプーリング层,境界ボックスボックス回帰层回帰层提案(rpn)ををを(RPN)ををををををを追加追加追加追加追加追加ししししししししししししてててててててててててててててててててててネットワークネットワークネットワークネットワークネットワーク,更快的R-CNNネットワークネットワーク,,trainfasterrcnnobjectdetectorを使用して学習させることができます。

快速R-CNNネットワーク作成作成

まず、Faster R-CNN の基礎となる Fast R-CNN ネットワークを作成します。Fast R-CNN オブジェクト検出ネットワークの作成の例で、このコード セクションを詳細に説明しています。

%加载预处理的Resnet-50。net = resnet50; lgraph = layerGraph(net);% Remove the last 3 layers.LayerStoreMove = {'fc1000''fc1000_softmax''ClassificationLayer_fc1000'}; lgraph = removeLayers(lgraph, layersToRemove);%指定网络应分类的类数。numClasses = 2; numClassesPlusBackground = numClasses + 1;%定义新的分类层。newlayers = [PlullConnectedLayer(NumClassesplusbackground,'姓名',,,,'rcnnfc') softmaxLayer('姓名',,,,'rcnnsoftmax') classificationLayer('姓名',,,,'rcnnClassification');% Add new object classification layers.lgraph = addlayers(lgraph,newlayers);%将新层连接到网络。lgraph =连接器(lgraph,'avg_pool',,,,'rcnnfc');% Define the number of outputs of the fully connected layer.numOutputs = 4 * numClasses;% Create the box regression layers.boxRegressionLayers = [ fullyConnectedLayer(numOutputs,'姓名',,,,'rcnnBoxFC')rcnnboxRegressrementlayer('姓名',,,,'rcnnBoxDeltas');%将图层添加到网络。lgraph = addlayers(lgraph,boxRegressionlayers);%将回归层连接到名为“ AVG_POOL”的层。lgraph =连接器(lgraph,'avg_pool',,,,'rcnnBoxFC');% Select a feature extraction layer.featureExtractionLayer ='activation_40_relu';%断开的层选择feature extraction layer.lgraph = disconnectlayers(lgraph,features extractionlayer,'res5a_branch2a');lgraph = disconnectlayers(lgraph,features extractionlayer,'res5a_branch1');% Add ROI max pooling layer.outputSize = [14 14]; roiPool = roiMaxPooling2dLayer(outputSize,'姓名',,,,'Roipool');lgraph = addlayers(lgraph,roipool);%将特征提取层连接到ROI最大池池。lgraph =连接器(lgraph,featureExtractionLayer,'roiPool/in');%将ROI Max池的输出连接到上面的断开层。lgraph =连接器(lgraph,'Roipool',,,,'res5a_branch2a');lgraph =连接器(lgraph,'Roipool',,,,'res5a_branch1');

领域提案(rpn)のの

Faster R-CNN では、領域提案ネットワーク (RPN) を使用して領域提案を生成します。RPN は、"オブジェクト" または "背景" のクラス、および "アンカー ボックス" とも呼ばれる一連の事前定義された境界ボックス テンプレートのボックス オフセットを予測して領域提案を生成します。アンカー ボックスは、そのサイズを指定することで指定されます。一般的に、アンカー ボックスのサイズは、学習データセットに含まれるオブジェクトのスケールと縦横比に関する予備知識に基づいて決定されます。

詳細については、アンカーボックスによるの検出を参照しください。

アンカーボックスをしてregionProposalLayerを作成します。

%定义锚点。锚点= [16 16 32 16 16 32];%创建区域建议层。proposalLayer = regionProposalLayer(anchorBoxes,'姓名',,,,“区域性”);lgraph = addlayers(lgraph,propoSallayer);

rpnの层追加し,でした抽出层に结合ます。。

% Number of anchor boxes.numanchors = size(Anchorboxes,1);从特征提取层出来的特征地图数量。numFilters = 1024;rpnlayers = [卷积2dlayer(3,numfilters,'padding',,,,[1 1],'姓名',,,,'rpnConv3x3')relulayer('姓名',,,,'rpnrelu');lgraph = addlayers(lgraph,rpnlayers);% Connect to RPN to feature extraction layer.lgraph =连接器(lgraph,featureExtractionLayer,'rpnConv3x3');

rpn分类层追加します分类层は,各ををををををを“オブジェクト”または“背景”としてしますますますますますますます

% Add RPN classification layers.rpnClsLayers = [ convolution2dLayer(1, numAnchors*2,'姓名',,,,'rpnConv1x1ClsScores') rpnSoftmaxLayer('姓名',,,,'rpnsoftmax')rpnClassificationLayer('姓名',,,,“ rpnClassification”);lgraph = addLayers(lgraph, rpnClsLayers);%将分类层连接到RPN网络。lgraph =连接器(lgraph,'rpnrelu',,,,'rpnConv1x1ClsScores');

RPN 回帰出力層を追加します。回帰層では、各アンカー ボックスに対して 4 つのボックス オフセットを予測します。

%添加RPN回归层。rpnreglayers = [卷积2Dlayer(1,Numanchors*4,'姓名',,,,'rpnconv1x1boxdeltas')rcnnboxRegressrementlayer('姓名',,,,'rpnboxdeltas');];lgraph = addlayers(lgraph,rpnReglayers);% Connect the regression layers to the RPN network.lgraph =连接器(lgraph,'rpnrelu',,,,'rpnconv1x1boxdeltas');

最後に、分類および回帰特徴マップを領域提案層入力に結合し、ROI プーリング層を領域提案層出力に結合します。

% Connect region proposal network.lgraph =连接器(lgraph,'rpnConv1x1ClsScores',,,,“区域性/分数”);lgraph =连接器(lgraph,'rpnconv1x1boxdeltas',,,,“区域性/boxdeltas”);%将区域建议层连接到投资回报率池。lgraph =连接器(lgraph,“区域性”,,,,'Roipool/roi');% Show the network after adding the RPN layers.图(lgraph)ylim([30 42])

これで,trainfasterrcnnobjectdetectorを使用てをさせる准备整いました。