创建YOLO v2对象检测网络
这个例子展示了如何修改预先训练好的MobileNet v2网络来创建YOLO v2对象检测网络。
将预先训练的网络转换为YOLO v2网络的过程类似于图像分类的迁移学习过程:
加载预训练的网络。
从预训练的网络中选择一层用于特征提取。
移除特征提取层之后的所有层。
添加新的层来支持对象检测任务。
负荷预训练网络
使用加载预先训练好的MobileNet v2网络mobilenetv2
.这需要MobileNet v2 Network™深度学习工具箱模型支持包。如果没有安装此支持包,则该函数将提供下载链接。加载网络后,将网络转换为layerGraph
对象,以便您可以操作图层。
Net = mobilenetv2();lgraph = layerGraph(net);
更新网络输入大小
更新网络输入大小以满足训练数据的要求。例如,假设训练数据是300 * 300的RGB图像。设置输入大小。
imageInputSize = [300 300 3];
接下来,创建一个与原始图层同名的新图像输入层。
imgLayer = imageInputLayer(imageInputSize,“名称”,“input_1”)
imgLayer = ImageInputLayer with properties: Name: 'input_1' InputSize: [300 300 3] SplitComplexInputs: 0超参数DataAugmentation: 'none'归一化:'zerocenter' NormalizationDimension: 'auto'意思:[]
用新的图像输入层替换旧的图像输入层。
lgraph =替换层(lgraph,“input_1”, imgLayer);
控件显示和检查网络中的层analyzeNetwork
函数。
analyzeNetwork (lgraph);
选择特征提取层
当输出特征宽度和高度比输入图像小8到16倍时,YOLO v2特征提取层是最有效的。这个下采样量是空间分辨率和输出特征质量之间的权衡。您可以使用analyzeNetwork
函数或深度网络设计器应用程序来确定网络中层的输出大小。请注意,选择最优特征提取层需要经验评估。
将特征提取层设置为“block_12_add”。
这个图层的输出尺寸大约是输入图像尺寸300x300的1 / 16。
featureExtractionLayer =“block_12_add”;
在特征提取层后移除层
接下来,删除特征提取层之后的所有层removeLayers
函数。
index = find(strcmp({lgraph.Layers(1:end).Name}, featureextracactionlayer));lgraph = removeLayers(lgraph,{lgraph. layers (index+1:end).Name});
创建YOLO v2检测子网
检测子网由一组串行连接的卷积层、ReLU层和批归一化层组成。这些层后面是ayolov2TransformLayer
和一个yolov2OutputLayer
.
首先,创建两组串行连接的卷积层、ReLU层和批处理规范化层。设置卷积层滤波器大小为3 × 3,滤波器数量与特征提取层输出的通道数量相匹配。指定“相同”
在卷积层中填充以保持输入大小。
filterSize = [3 3];numFilters = 96;detectionLayers = [convolution2dLayer(filterSize,numFilters,“名称”,“yolov2Conv1”,“填充”,“相同”,“WeightsInitializer”@(深圳)randn(深圳)* 0.01)batchNormalizationLayer (“名称”,“yolov2Batch1”) reluLayer (“名称”,“yolov2Relu1”) convolution2dLayer (filterSize numFilters,“名称”,“yolov2Conv2”,“填充”,“相同”,“WeightsInitializer”@(深圳)randn(深圳)* 0.01)batchNormalizationLayer (“名称”,“yolov2Batch2”) reluLayer (“名称”,“yolov2Relu2”)]
detectionLayers = 6x1层数组:1' yolov2Conv1' 2- d Convolution 96 3x3 convolutions with stride [1 1] and padding 'same' 2' yolov2Batch1' Batch Normalization Batch Normalization 3 'yolov2Relu1' ReLU ReLU 4 'yolov2Conv2' 2- d Convolution 96 3x3 convolutions with stride [1 1] and padding 'same' 5 'yolov2Batch2' Batch Normalization Batch Normalization 6 'yolov2Relu2' ReLU ReLU
接下来,创建检测子网络的最后一部分,其中有一个卷积层,后面跟着一个yolov2TransformLayer
和一个yolov2OutputLayer
.卷积层的输出对每个锚框预测如下:
对象类概率。
x和y位置偏移。
宽度和高度偏移。
指定锚框和类的数量,并计算卷积层的过滤器数量。
numClasses = 5;anchorBoxes = [16 16 32 16];numAnchors = size(锚盒,1);numPredictionsPerAnchor = 5;numFiltersInLastConvLayer = nummanchors *(numClasses+numPredictionsPerAnchor);
添加convolution2dLayer
,yolov2TransformLayer
,yolov2OutputLayer
到检测子网。
detectionLayers = [detectionLayers convolution2dLayer(1,numFiltersInLastConvLayer,“名称”,“yolov2ClassConv”,...“WeightsInitializer”, @(sz)randn(sz)*0.01) yolov2TransformLayer(numAnchors,“名称”,“yolov2Transform”) yolov2OutputLayer (anchorBoxes“名称”,“yolov2OutputLayer”)]
detectionLayers = 9x1带有图层的图层数组:1' yolov2Conv1'二维Convolution 96 3x3 convolutions with stride [1 1] and padding 'same' 2' yolov2Batch1' Batch Normalization批量归一化3 'yolov2Relu1' ReLU ReLU 4 'yolov2Conv2'二维Convolution 96 3x3 convolutions with stride [1 1] and padding 'same' 5 'yolov2Batch2' Batch Normalization批量归一化6 'yolov2Relu2' ReLU ReLU 7 'yolov2ClassConv'二维Convolution 20 1x1 convolutions with stride [1 1] and padding [0 0 0 0 0] 8 'yolov2Transform' YOLO v2Transform Layer。YOLO v2转换层2锚。9 'yolov2OutputLayer' YOLO v2输出YOLO v2输出2个锚。
完成YOLO v2检测网络
将检测子网附加到特征提取网络。
lgraph = addLayers(lgraph,detectionLayers);lgraph = connectLayers(lgraph, featureextracactionlayer,“yolov2Conv1”);
使用analyzeNetwork
检查网络状态。方法来训练网络trainYOLOv2ObjectDetector
函数。
analyzeNetwork (lgraph)