how to create a grayscale-image-input SSD_MobileNetV2 object detection network

5 visualizaciones (últimos 30 días)
Hi, I am trying to modify a pretrained MobileNet v2 network to create a SSD object detection network. But the training data of network need to be grayscale images, not RGB images anymore. The code is written reference to Create SSD Object Detection Network .
net = mobilenetv2();
lgraph = layerGraph(net);
%update network input size
imageInputSize = [300 300 1];
imgLayer = imageInputLayer(imageInputSize,"Name","input_1");
lgraph = replaceLayer(lgraph,"input_1",imgLayer);
%Select Feature Extraction Layers
featureExtractionLayer = "block_12_add";
%Remove Layers After Feature Extraction Layer
modified = load("mobilenetv2Block12Add.mat");
lgraph = modified.mobilenetv2Block12Add;
%Attach AnchorBoxLayer
numClasses = 1;
anchorBoxes = [204 184;152 134;141 191];
anchorBox = anchorBoxLayer(anchorBoxes,"Name","anchors");
lgraph = addLayers(lgraph,anchorBox);
lgraph = connectLayers(lgraph,"block_12_add","anchors");
%Create SSD Classifcation Branch
numAnchors = size(anchorBoxes,1);
numClassesPlusBackground = numClasses + 1;
numClsFilters = numAnchors * numClassesPlusBackground;
filterSize = 3;
conv = convolution2dLayer(filterSize,numClsFilters,...
"Name","convClassification",...
"Padding","same");
lgraph = addLayers(lgraph,conv);
lgraph = connectLayers(lgraph,"anchors","convClassification");
%Create SSD Regression Branch
numRegFilters = 4 * numAnchors;
conv = convolution2dLayer(filterSize,numRegFilters,...
"Name","convRegression",...
"Padding","same");
lgraph = addLayers(lgraph,conv);
lgraph = connectLayers(lgraph,"anchors","convRegression");
%Merge Classification Features
numFeatureExtractionLayers = numel(featureExtractionLayer);
mergeClassification = ssdMergeLayer(numClassesPlusBackground,numFeatureExtractionLayers,...
"Name","mergeClassification");
lgraph = addLayers(lgraph,mergeClassification);
lgraph = connectLayers(lgraph,"convClassification","mergeClassification/in1");
%Merge Regression Features
numCoordinates = 4;
mergeRegression = ssdMergeLayer(numCoordinates,numFeatureExtractionLayers,...
"Name","mergeRegression");
lgraph = addLayers(lgraph,mergeRegression);
lgraph = connectLayers(lgraph,"convRegression","mergeRegression/in1");
%Complete SSD Detection Network
clsLayers = [
softmaxLayer("Name","softmax")
focalLossLayer("Name","focalLoss")
];
lgraph = addLayers(lgraph,clsLayers);
lgraph = connectLayers(lgraph,"mergeClassification","softmax");
reg = rcnnBoxRegressionLayer("Name","boxRegression");
lgraph = addLayers(lgraph,reg);
lgraph = connectLayers(lgraph,"mergeRegression","boxRegression");
analyzeNetwork(lgraph)
But the result of command "analyzeNetwork(lgraph)" show that it finally creates a network with 300*300*3 three channel iuput,.It still create a network with RGB image input. How can I fix the issue? Thanks.

Respuestas (1)

Nomit Jangid
Nomit Jangid el 30 de Nov. de 2020
Hi ceng,
You're changing layerGraph input in the 14th line as well. You can solve this issue by using your replaceLayer function after the 14th layer. Although, you might also have to change convolution layers as they are expecting three channels.
Hope this helps.

Categorías

Más información sobre Image Data Workflows en Help Center y File Exchange.

Productos


Versión

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by