创建SSD对象检测网络
本示例演示如何修改预训练的MobileNet v2网络,以创建SSD对象检测网络。
将预训练的网络转换为SSD网络的过程类似于图像分类的迁移学习过程:
加载预训练的网络。
从预训练的网络中选择一个或多个层用于特征提取。
在特征提取层之后删除所有层
添加新层以支持对象检测任务。
负载Pretrained网络
使用加载预先训练的MobileNet v2网络mobilenetv2
.这需要MobileNet v2 Network™的深度学习工具箱模型支持包。如果没有安装此支持包,则该功能提供下载链接。加载网络后,将网络转换为layerGraph
对象,以便您可以操作这些层。
网= mobilenetv2 ();lgraph = layerGraph(净);
更新网络输入大小
更新网络输入大小以满足训练数据需求。例如,假设训练数据是300 × 300 RGB的图像。设置输入大小。
imageInputSize = [300 300 3];
接下来,创建一个新的图像输入层,与原来的层同名。
imgLayer = imageInputLayer (imageInputSize,“名称”,“input_1”);
用新的图像输入层替换旧的图像输入层。
lgraph = replaceLayer (lgraph,“input_1”, imgLayer);
选择特征提取层
SSD使用多个特征映射预测对象位置。通常,您选择具有不同输出大小的特征提取层,以利用多尺度特征的好处。您可以使用analyzeNetwork
函数或Deep Network Designer应用程序来确定网络中各层的输出大小。注意,选择最优集合特征提取层需要经验评估。
为了简单起见,这个例子演示了如何使用一个特征提取层。设置特征提取层为“block_12_add”
.
featureExtractionLayer =“block_12_add”;
特征提取层后删除层
接下来,去掉特征提取层之后的图层。您可以通过将网络导入到深度网络设计器应用程序中,手动删除层,并将修改后的网络导出到您的工作空间中来实现这一点。
对于本例,加载已添加到本例中的修改后的网络作为支持文件。
修改=负载(“mobilenetv2Block12Add.mat”);lgraph = modified.mobilenetv2Block12Add;
附加AnchorBoxLayer
指定锚框和对象类的数量,并使用anchorBoxLayer创建锚框层。
numClasses = 5;anchorBoxes = [16 16 32 16];anchorBox = anchorBoxLayer (anchorBoxes,“名称”,“锚”);
将锚盒层附加到特征提取层。
lgraph = addLayers (lgraph anchorBox);lgraph = connectLayers (lgraph,“block_12_add”,“锚”);
创建SSD分类分支
创建一个卷积层,其中卷积过滤器的数量等于numAnchors
倍numClasses + 1
.附加类表示后台类。
numAnchors =大小(anchorBoxes, 1);numClassesPlusBackground = numClasses + 1;numClsFilters = numAnchors * numClassesPlusBackgroundfilterSize = 3;conv = convolution2dLayer (filterSize numClsFilters,...“名称”,“convClassification”,...“填充”,“相同”);
添加并连接卷积层到锚框层。
lgraph = addLayers (lgraph conv);lgraph = connectLayers (lgraph,“锚”,“convClassification”);
创建SSD回归分支
创建一个卷积层,其中卷积过滤器的数量等于锚框数量的4倍。
numRegFilters = 4 * numAnchors;conv = convolution2dLayer (filterSize numRegFilters,...“名称”,“convRegression”,...“填充”,“相同”);
添加并连接卷积层到锚框层。
lgraph = addLayers (lgraph conv);lgraph = connectLayers (lgraph,“锚”,“convRegression”);
合并分类特征
创建一个ssdMergeLayer
初始化类的数量和特征提取层的数量。
numFeatureExtractionLayers =元素个数(featureExtractionLayer);mergeClassification = ssdMergeLayer (numClassesPlusBackground numFeatureExtractionLayers,...“名称”,“mergeClassification”);
添加并连接SSD合并层到convClassification
层。
lgraph = addLayers (lgraph mergeClassification);lgraph = connectLayers (lgraph,“convClassification”,“mergeClassification /三机一体”);
合并回归特性
创建一个ssdMergeLayer
初始化为用于细化锚盒位置的坐标偏移量的数量和特征提取层的数量。
numCoordinates = 4;mergeRegression = ssdMergeLayer (numCoordinates numFeatureExtractionLayers,...“名称”,“mergeRegression”);
添加并连接SSD合并层到convRegression
层。
lgraph = addLayers (lgraph mergeRegression);lgraph = connectLayers (lgraph,“convRegression”,“mergeRegression /三机一体”);
SSD检测网络完整
要完成分类分支,创建并附加一个softmax层和一个焦损耗层。
clsLayers = [softmaxLayer(“名称”,“softmax”) focalLossLayer (“名称”,“focalLoss”));lgraph = addLayers (lgraph clsLayers);lgraph = connectLayers (lgraph,“mergeClassification”,“softmax”);
要完成回归分支,创建并附加一个框式回归层。
reg = rcnnBoxRegressionLayer (“名称”,“boxRegression”);lgraph = addLayers (lgraph, reg);lgraph = connectLayers (lgraph,“mergeRegression”,“boxRegression”);
使用analyzeNetwork
检查网络。
analyzeNetwork (lgraph)
SSD设备网络完整,可以使用trainSSDObjectDetector
函数。