版本要求: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 中国









