how to create a grayscale-image-input SSD_MobileNetV2 object detection network
5 ビュー (過去 30 日間)
古いコメントを表示
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.
0 件のコメント
回答 (1 件)
Nomit Jangid
2020 年 11 月 30 日
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.
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Image Data Workflows についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!