Matlab 创建YOLO v2目标检测网络(仅仅是网络)

时间:2022-10-14 07:57:41

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