版本要求:matlab大于等于2019。
此示例演示如何修改预先训练的MobileNet v2网络,以创建YOLO v2对象检测网络。
将预训练的网络转换为YOLO v2网络的过程类似于图像分类的迁移学习过程:
1)加载预训练的网络。
2)从预训练的网络中选择一层用于特征提取。
3)去除特征提取层之后的所有层。
4)添加新层以支持对象检测任务。
1.加载预训练的网络
使用mobilenetv2加载预先训练过的mobilenetv2网络。这需要MobileNet v2 Network™的深度学习工具箱模型支持包。如果没有安装此支持包,则该功能提供下载链接。在加载网络之后,将网络转换为layerGraph对象,以便您可以操作这些层。
net = mobilenetv2();
lgraph = layerGraph(net);
更新网络输入大小
更新网络输入大小以满足训练数据需求。例如,假设训练数据是300 × 300 RGB的图像。设置输入大小。
imageInputSize = [300 300 3];
接下来,创建一个新的图像输入层,与原来的层同名。
imgLayer = imageInputLayer(imageInputSize,"Name","input_1")
可以查看,结构:
imgLayer =
ImageInputLayer with properties:
Name: 'input_1'
InputSize: [300 300 3]
SplitComplexInputs: 0
Hyperparameters
DataAugmentation: 'none'
Normalization: 'zerocenter'
NormalizationDimension: 'auto'
Mean: []
用新的图像输入层替换旧的图像输入层。
lgraph = replaceLayer(lgraph,"input_1",imgLayer);
使用analyzeNetwork函数显示和检查网络中的层。
analyzeNetwork(lgraph);
选择特征提取层
当输出特征宽度和高度比输入图像小8到16倍时,YOLO v2特征提取层是最有效的。这个下采样量是空间分辨率和输出特征质量之间的权衡。您可以使用analyzeNetwork函数或Deep Network Designer应用程序来确定网络中各层的输出大小。注意,选择一个最佳的特征提取层需要经验评估。
设置特征提取层为“block_12_add”。这一层的输出尺寸大约是输入图像尺寸300 × 300的16倍。
featureExtractionLayer = "block_12_add";
特征提取层后删除层
index = find(strcmp({lgraph.Layers(1:end).Name},featureExtractionLayer));
lgraph = removeLayers(lgraph,{lgraph.Layers(index+1:end).Name});
创建YOLO v2检测子网
检测子网络由串行连接的卷积层、ReLU层和批处理归一化层组成。这些层后面是yolov2TransformLayer和yolov2OutputLayer。
首先,创建两组串行连接的卷积层、ReLU层和批处理归一化层。设置卷积层过滤器大小为3 × 3,过滤器数量与特征提取层输出的通道数量相匹配。在卷积层中指定“相同”填充以保留输入大小。
filterSize = [3 3];
numFilters = 96;
detectionLayers = [
convolution2dLayer(filterSize,numFilters,"Name","yolov2Conv1","Padding", "same", "WeightsInitializer",@(sz)randn(sz)*0.01)
batchNormalizationLayer("Name","yolov2Batch1")
reluLayer("Name","yolov2Relu1")
convolution2dLayer(filterSize,numFilters,"Name","yolov2Conv2","Padding", "same", "WeightsInitializer",@(sz)randn(sz)*0.01)
batchNormalizationLayer("Name","yolov2Batch2")
reluLayer("Name","yolov2Relu2")
]
输出:
detectionLayers =
6x1 Layer array with layers:
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.x和y位置的偏移量。
2.宽度和高度的偏移。
3.指定锚框和类的数量,并为卷积层计算过滤器的数量。
numClasses = 5;
anchorBoxes = [
16 16
32 16
];
numAnchors = size(anchorBoxes,1);
numPredictionsPerAnchor = 5;
numFiltersInLastConvLayer = numAnchors*(numClasses+numPredictionsPerAnchor);
将convolution2dLayer、yolov2TransformLayer和yolov2OutputLayer添加到检测子网中。
detectionLayers = [
detectionLayers
convolution2dLayer(1,numFiltersInLastConvLayer,"Name","yolov2ClassConv",...
"WeightsInitializer", @(sz)randn(sz)*0.01)
yolov2TransformLayer(numAnchors,"Name","yolov2Transform")
yolov2OutputLayer(anchorBoxes,"Name","yolov2OutputLayer")
]
输出:
detectionLayers =
9x1 Layer array with layers:
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
7 'yolov2ClassConv' 2-D Convolution 20 1x1 convolutions with stride [1 1] and padding [0 0 0 0]
8 'yolov2Transform' YOLO v2 Transform Layer. YOLO v2 Transform Layer with 2 anchors.
9 'yolov2OutputLayer' YOLO v2 Output YOLO v2 Output with 2 anchors.
完成YOLO v2检测网络
将检测子网与特征提取网络连接。
lgraph = addLayers(lgraph,detectionLayers);
lgraph = connectLayers(lgraph,featureExtractionLayer,"yolov2Conv1");
使用analyzeNetwork函数检查网络。然后可以使用trainYOLOv2ObjectDetector函数来训练网络。
analyzeNetwork(lgraph)
参考:
Create YOLO v2 Object Detection Network - MATLAB & Simulink - MathWorks 中国