主要内容

本页采用了机器翻译。点击此处可查看英文原文。

yolov4ObjectDetector

使用 YOLO v4 目标检测器检测目标

自 R2022a 起

说明

yolov4ObjectDetector 对象创建了一个“只需看一次”第 4 版 (YOLO v4) 单阶段目标检测器,用于检测图像中的对象。使用此对象,您可以:

  • 利用在 COCO 数据集上训练的 YOLO v4 深度学习网络,创建一个预训练的 YOLO v4 目标检测器。

  • 使用任何预训练或未训练的 YOLO v4 深度学习网络,创建一个自定义的 YOLO v4 目标检测器。

创建对象

描述

预训练的 YOLO v4 目标检测器

detector = yolov4ObjectDetector(name) 通过使用在 COCO 数据集上训练的 YOLO v4 深度学习网络,创建了一个预训练的 YOLO v4 目标检测器。

示例

自定义 YOLO v4 目标检测器

detector = yolov4ObjectDetector(name,classes,aboxes) 会创建一个预训练的 YOLO v4 目标检测器,并将其配置为使用指定的目标类别集和锚框进行迁移学习。为了获得最佳效果,在进行检测之前,必须先使用新的训练图像对检测器进行训练。使用 trainYOLOv4ObjectDetector 函数对检测器进行训练。

detector = yolov4ObjectDetector(net,classes,aboxes) 利用深度学习网络 net 构建了一个目标检测器。

如果 net 是一个预训练的 YOLO v4 深度学习网络,则该函数将创建一个预训练的 YOLO v4 目标检测器。classesaboxes 是用于训练该网络的值。

如果 net 是一个未经训练的 YOLO v4 深度学习网络,则该函数将创建一个 YOLO v4 目标检测器,用于训练和推理。classesaboxes 分别指定了用于训练 YOLO v4 网络的目标类别和锚框。

在执行目标检测之前,请使用 trainYOLOv4ObjectDetector 函数对网络进行训练。

detector = yolov4ObjectDetector(baseNet,classes,aboxes,DetectionNetworkSource=layer) 通过向基础网络 baseNet 添加检测头,构建了一个 YOLO v4 目标检测器。

该函数向基础网络中指定的特征提取层 layer 添加检测头。要指定特征提取层的名称,请使用名称-值参量 DetectionNetworkSource=layer

如果 baseNet 是一个预训练网络,则该函数会创建一个 YOLO v4 目标检测器,并将其配置为使用指定的目标类别和锚框进行迁移学习。

如果 baseNet 是一个未经训练的深度学习网络,则该函数会创建一个 YOLO v4 目标检测器,并将其配置为进行目标检测。classesaboxes 分别指定了用于训练 YOLO v4 网络的目标类别和锚框。

在执行目标检测之前,必须先使用训练数据集对检测器进行训练。使用 trainYOLOv4ObjectDetector 函数对检测器进行训练。

示例

detector = yolov4ObjectDetector(___,Name=Value) 除了前几种语法中任意组合的输入参量外,还使用名称-值参量指定一个或多个选项。使用此语法来:

  • 修改 YOLO v4 目标检测网络中的检测源,并使用不同数量的目标类别、锚框或两者结合来训练该网络。使用 DetectionNetworkSource=layer 名称-值参量指定新的检测网络来源。

  • 设置目标检测器的 InputSizeModelName 属性。例如,InputSize=[224 224 3] 将用于训练的图像大小设置为 [224 224 3]

注意

若要使用基于 COCO 数据集预训练的 YOLO v4 目标检测网络,您必须安装 Computer Vision Toolbox™ YOLO v4 目标检测模型。您可以从附加功能资源管理器下载并安装 Computer Vision Toolbox YOLO v4 目标检测模型。有关安装附加功能的详细信息,请参阅获取和管理附加功能。要运行此函数,您需要安装 Deep Learning Toolbox™。

输入参量

全部展开

预训练的 YOLO v4 深度学习网络的名称,应指定为以下选项之一:

  • "csp-darknet53-coco" - 一个预训练的 YOLO v4 深度学习网络,以 CSP-DarkNet-53 作为基础网络,并在 COCO 数据集上进行训练。

  • "tiny-yolov4-coco" - 一个基于小型基础网络构建、并在 COCO 数据集上训练的预训练 YOLO v4 深度学习网络。

数据类型: char | string

用于训练检测器的目标类名称,指定为字符串向量、字符向量元胞数组或分类向量。该参量用于设置 yolov4ObjectDetector 对象的 ClassNames 属性。

数据类型: char | string | categorical

用于训练检测器的锚框,指定为一个 N×1 列向量元胞数组或一个 1×N 行向量元胞数组。N 是 YOLO v4 深度学习网络中的输出层数量。每个元胞包含一个 M×2 矩阵,其中 M 表示该层中的锚框数量。每个元胞可以包含不同数量的锚框。M×2 矩阵中的每一行都表示锚框的大小,形式为 [height width]。

元胞数组中的第一个元素指定与第一个输出层关联的锚框,第二个元素指定与第二个输出层关联的锚框,以此类推。为了获得准确的检测结果,请为第一个输出层指定较大的锚框,为最后一个输出层指定较小的锚框。也就是说,锚框的尺寸必须按照 YOLO v4 深度学习网络中各层的出现顺序,随着输出层的推进而逐渐减小。

该参量用于设置 yolov4ObjectDetector 对象的 AnchorBoxes 属性。

数据类型: cell

YOLO v4 深度学习网络,指定为一个 dlnetwork (Deep Learning Toolbox) 对象。输入网络可以是未经训练的,也可以是预训练网络。输入网络必须包含一个图像输入层。

用于构建 YOLO v4 深度学习网络的基础网络,指定为一个 dlnetwork (Deep Learning Toolbox) 对象。该网络可以是未训练的深度学习网络,也可以是预训练网络。输入网络必须包含一个图像输入层。

基础网络中特征提取层的名称,指定为字符向量元胞数组或字符串数组。该函数通过在基础网络的特征提取层输出后添加检测头层,来构建一个 YOLO v4 网络。

在预训练的 YOLO v4 基础网络中,必须将检测头层连接到特征提取层,在这些层中,输入图像的特征图会通过 4、8、16 和 32 的下采样因子改变其空间维度。

  • 使用 analyzeNetwork (Deep Learning Toolbox) 函数显示预训练的 YOLO v4 网络架构,以获取特征图的空间维度信息。

  • 请参考此表了解默认特征提取层,并选择预训练的 YOLO v4 网络所支持的其他特征提取层。根据检测准确率、训练速度以及待检测目标的尺寸,通过经验评估选择特征提取层。

    • 为了提高检测精度,应选择同时包含较高和较低下采样因子的特征提取层。下采样因子较低的图层可捕捉微小目标,而下采样因子较高的图层则能确保对特征进行彻底的精细化处理。

    • 为了提高训练和推理速度,请选择下采样因子较低的特征提取层。

    • 指定的检测网络源数量必须与输入中指定的锚框数量相等。

    骨干检测头数量默认特征提取层替代特征提取层的示例备注
    降采样因子降采样因子
    tiny-yolov4-coco2

    leaky_28

    leaky_25

    32

    16

    leaky_17

    leaky_9

    8

    4

    从位于 leaky_28 层之前的特征提取层中,选择任意两个具有不同下采样因子的层,作为检测网络的输入源。

    例如,将新的检测网络源指定为 layer = {'leaky_17','leaky_9'}

    csp-darknet53-coco3

    mish_106

    mish_87

    mish_56

    32

    16

    8

    mish_88

    mish_102

    32

    从位于 mish_106 层之前的特征提取层中,选择任意三个具有不同下采样因子的层,作为检测网络的输入源。

    例如,将新的检测网络源指定为 layer = {'mish_57','mish_26','mish_13'}

    mish_68

    mish_57

    16

    mish_37

    mish_26

    8

    mish_25

    mish_18

    mish_13

    4

数据类型: char | string | cell

属性

全部展开

用于目标检测的 YOLO v4 深度学习网络,以 dlnetwork (Deep Learning Toolbox) 对象的形式存储。

要检测的目标类名称,以分类向量的形式存储。您可以使用输入参量 classes 来设置此属性。

此 属性 为只读。

一组锚框,以 N×1 元胞数组的形式存储。N 是 YOLO v4 深度学习网络中定义这些锚框的输出层数量。该元胞中的每个元素都是一个 M×2 矩阵。M 表示锚框的数量。每个元胞可以包含不同数量的锚框。M×2 矩阵中的每一行都以 [高度 宽度] 的形式表示锚框的大小。元胞数组中的第一个元素指定了第一个输出层的锚框,第二个元素指定了第二个输出层的锚框,以此类推。

您可以使用输入参量 aboxes 来设置此属性。

此 属性 为只读。

用于训练的图像尺寸,以 [height width] 或 [height width channels] 形式的向量存储。要设置此属性,请在创建对象时进行指定。训练图像的大小必须是 32 的倍数。

例如,detector = yolov4ObjectDetector(net,classes,aboxes,InputSize=[224 224 3])

目标检测器的名称,以字符向量或字符串标量形式存储。要设置此属性,请在创建对象时进行指定。

例如,yolov4ObjectDetector(net,classes,aboxes,ModelName="customDetector") 将目标检测器的名称设置为 "customDetector"

此 属性 为只读。

目标检测器的边界框格式,以 "axis-aligned""rotated" 格式存储。当 PredictedBoxType"axis-aligned" 时,目标检测器将仅对轴对齐的边界框进行训练和推理。如果将其设置为 "rotated",目标检测器将仅对旋转后的边界框进行训练和推理。在创建对象时设置此属性。

对象函数

detectDetect objects using YOLO v4 object detector

示例

全部折叠

指定一个预训练的 YOLO v4 深度学习网络的名称。

name = "tiny-yolov4-coco";

使用预训练的 YOLO v4 网络创建 YOLO v4 目标检测器。

detector = yolov4ObjectDetector(name);

显示并检查 YOLO v4 目标检测器的属性。

disp(detector)  
  yolov4ObjectDetector with properties:

        Network: [1×1 dlnetwork]
    AnchorBoxes: {2×1 cell}
     ClassNames: {80×1 cell}
      InputSize: [416 416 3]
      ModelName: 'tiny-yolov4-coco'

使用 analyzeNetwork 来显示 YOLO v4 的网络架构,并获取有关网络层的信息。

analyzeNetwork(detector.Network)

使用预训练的 YOLO v4 目标检测器,在未知图像中检测目标。

img = imread("highway.png");
[bboxes,scores,labels] = detect(detector,img);

显示检测结果。

detectedImg = insertObjectAnnotation(img,"Rectangle",bboxes,labels);
figure
imshow(detectedImg)

本示例演示了如何基于预训练的 ResNet-50 卷积神经网络构建 YOLO v4 目标检测网络。

加载一个预训练网络,将其用作基础网络。本示例使用 ResNet-50 预训练网络作为基础网络。有关其他可用预训练网络的信息,请参阅预训练的深度神经网络 (Deep Learning Toolbox)

basenet = imagePretrainedNetwork("resnet50");

使用 analyzeNetwork 来显示基础网络的架构。

analyzeNetwork(basenet)

基础网络的第一层是图像输入层。检查基础网络中图像输入层的属性。

basenet.Layers(1)
ans = 
  ImageInputLayer with properties:

                      Name: 'input_1'
                 InputSize: [224 224 3]
        SplitComplexInputs: 0

   Hyperparameters
          DataAugmentation: 'none'
             Normalization: 'zerocenter'
    NormalizationDimension: 'auto'
                      Mean: [224×224×3 single]

要创建一个 YOLO v4 深度学习网络,必须将基础网络中 ImageInputLayerNormalization 属性设置为 none。定义一个图像输入层,将其 Normalization 属性设置为 "none",其他属性值与基础网络保持一致。

imageSize = basenet.Layers(1).InputSize;
layerName = basenet.Layers(1).Name;
newInputLayer = imageInputLayer(imageSize,Normalization="none",Name=layerName);

将基础网络中的图像输入层替换为新的输入层。

dlnet = replaceLayer(basenet,layerName,newInputLayer);

指定基础网络中用作检测头的特征提取层的名称。

featureExtractionLayers = ["activation_22_relu","activation_40_relu"];

指定用于训练以 ResNet-50 为基础网络构建的 YOLO v4 深度学习网络的类名和锚框。

classes = ["car","person"];
anchorBoxes = {[122,177;223,84;80,94];...
               [111,38;33,47;37,18]};

使用指定的基础网络和检测头,创建一个 YOLO v4 目标检测器。

detector = yolov4ObjectDetector(dlnet,classes,anchorBoxes, ...
    DetectionNetworkSource=featureExtractionLayers);

显示并检查 YOLO v4 目标检测器的属性。

disp(detector) 
  yolov4ObjectDetector with properties:

             Network: [1×1 dlnetwork]
         AnchorBoxes: {2×1 cell}
          ClassNames: {2×1 cell}
           InputSize: [224 224 3]
    PredictedBoxType: 'axis-aligned'
           ModelName: ''

使用 analyzeNetwork 来显示 YOLO v4 的网络架构,并获取有关网络层的信息。

analyzeNetwork(detector.Network)

本示例演示了如何使用预训练的 YOLO v4 目标检测器来检测行人。

加载预训练的 YOLO v4 检测器,该检测器可检测 80 种常见物体类别。

detector = yolov4ObjectDetector();

读取待处理的图像。

I = imread("visionteam.jpg");

运行目标检测器。

[bboxes, scores, labels] = detect(detector, I, Threshold=0.4);

选择“人”类别的检测结果。

personBoxes = bboxes(labels=="person", :);

显示结果。

detectedImg = insertObjectAnnotation(I, "Rectangle", personBoxes, "person");
figure
imshow(detectedImg)

Figure contains an axes object. The hidden axes object contains an object of type image.

扩展功能

全部展开

版本历史记录

在 R2022a 中推出

全部展开