主要内容

创建YOLO v2对象检测网络

这个例子展示了如何修改预先训练好的MobileNet v2网络来创建YOLO v2对象检测网络。

将预先训练的网络转换为YOLO v2网络的过程类似于图像分类的迁移学习过程:

  1. 加载预训练的网络。

  2. 从预训练的网络中选择一层用于特征提取。

  3. 移除特征提取层之后的所有层。

  4. 添加新的层来支持对象检测任务。

负荷预训练网络

使用加载预先训练好的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.卷积层的输出对每个锚框预测如下:

  1. 对象类概率。

  2. x和y位置偏移。

  3. 宽度和高度偏移。

指定锚框和类的数量,并计算卷积层的过滤器数量。

numClasses = 5;anchorBoxes = [16 16 32 16];numAnchors = size(锚盒,1);numPredictionsPerAnchor = 5;numFiltersInLastConvLayer = nummanchors *(numClasses+numPredictionsPerAnchor);

添加convolution2dLayeryolov2TransformLayer,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)

Baidu
map