YOLO v4 入门指南
“只需看一次” (YOLO v4) 目标检测网络是一个单阶段目标检测网络,由三个部分组成:骨干网络、颈部和头部。
骨干网络可以是基于 COCO 或 ImageNet 数据集预训练的卷积神经网络,例如 VGG16 或 CSPDarkNet53。YOLO v4 网络的核心部分充当特征提取网络,负责根据输入图像计算特征图。
颈部 (neck) 连接骨干 (backbone) 和头部 (head)。它由一个空间金字塔池化 (SPP) 模块和一个路径聚合网络 (PAN) 组成。颈部将骨干网络不同层的特征图进行拼接,并将其作为输入发送至头部。
该模块对聚合后的特征进行处理,并预测边界框、对象性得分和分类得分。YOLO v4 网络将 YOLO v3 等单阶段目标检测器用作检测头。

YOLO v4 网络采用 CSPDarkNet-53 作为骨干网络,用于从输入图像中进行特征提取。主干包含五个残差模块,这些残差模块输出的特征图在 YOLO v4 网络的“颈部”进行融合。
颈部中的 SPP 模块将低分辨率特征图的最大池化输出进行拼接,以提取最具代表性的特征。SPP 模块在最大池化操作中使用了 1×1、5×5、9×9 和 13×13 尺寸的卷积核。步长值设置为 1。将特征图进行拼接可以扩大骨干特征的感受野,并提高网络检测微小目标的准确率。通过 PAN 算法,将 SPP 模块生成的拼接特征图与高分辨率特征图进行融合。PAN 通过上采样和下采样操作,设置自下而上和自上而下的路径,以融合低级特征和高级特征。
PAN 模块会输出一组聚合特征图,用于进行预测。YOLO v4 网络拥有三个检测头。每个检测头都是一个 YOLO v3 网络,用于计算最终预测结果。YOLO v4 网络输出尺寸分别为 19×19、38×38 和 76×76 的特征图,用于预测边界框、分类得分和置信度得分。
Tiny YOLO v4 网络是 YOLO v4 网络的轻量级版本,其网络层数较少。微型 YOLO v4 网络采用特征金字塔网络作为颈部,并拥有两个 YOLO v3 检测头。该网络输出尺寸为 13×13 和 26×26 的特征图,用于计算预测结果。
使用 YOLO v4 预测对象
YOLO v4 使用锚框来检测图像中的目标类别。有关锚框的详细信息,请参阅Anchor Boxes for Object Detection。与 YOLO v3 类似,YOLO v4 会为每个锚框预测以下三个属性:
交并比 (IoU) - 预测每个锚框的对象性得分。
锚框偏移量 - 调整锚框的位置。
类别概率 - 预测分配给每个锚框的类别标签。
该图显示了特征图中每个位置的预定义锚框(以虚线表示),以及应用偏移量后的优化位置。已与某个类匹配的锚框会显示为彩色。

在训练网络时,必须指定预定义的锚框(也称为先验框)以及类。
创建 YOLO v4 目标检测网络
若要通过编程方式创建一个 YOLO v4 深度学习网络,请使用 yolov4ObjectDetector 对象。您可以创建一个 yolov4ObjectDetector 对象,利用预训练的 YOLO v4 深度学习网络 csp-darknet53-coco 和 tiny-yolov4-coco 来检测图像中的对象。这些网络是在 COCO 数据集上训练的。csp-darknet53-coco 是一个具有三个检测头的 YOLO v4 网络,而 tiny-yolov4-coco 是一个具有两个检测头的精简版 YOLO v4 网络。要下载这些 YOLO v4 预训练网络,您必须安装 Computer Vision Toolbox™ YOLO v4 目标检测模型支持包。
使用 YOLO v4 网络训练和目标检测
要在标注数据集上训练 YOLO v4 目标检测网络,请使用 trainYOLOv4ObjectDetector 函数。您必须指定用于训练网络的数据集的类名和预定义的锚框。
该训练函数将训练好的神经网络作为 yolov4ObjectDetector 对象返回。然后,您可以使用 detect 函数,结合已训练好的 YOLO v4 目标检测器,检测测试图像中的未知对象。要了解如何创建 YOLO v4 目标检测器并进行目标检测训练,请参阅基于 YOLO v4 深度学习的目标检测示例。
指定锚框
用于训练的锚框的形状、大小和数量会影响 YOLO v4 目标检测网络的效率和准确率。锚框必须与训练数据中目标的尺寸和宽高比高度吻合。训练数据必须同时包含真实图像和标签。训练图像的尺寸必须与网络的输入尺寸相同,且边界框标签必须与训练图像的尺寸相对应。
在 YOLO v4 网络中,必须为每个检测头分配相同数量的锚框。分配给每个检测头的锚框的大小必须与该检测头输出的特征图的大小相匹配。对于具有较低分辨率特征图的检测头,必须分配较大的锚框;对于具有较高分辨率特征图的检测头,则应分配较小的锚框。
例如,以下步骤将向您展示如何指定锚框,以训练一个包含三个检测头的 YOLO v4 网络,这三个检测头的特征图尺寸分别为 19×19、38×38 和 76×76。
假设您为每个检测头指定了四个锚框。那么,用于训练该网络的锚框总数必须是十二个。您可以使用
estimateAnchorBoxes函数,为指定的训练数据自动估算锚框。numAnchors = 12; [anchors] = estimateAnchorBoxes(trainingData,numAnchors);
计算每个锚框的面积,并按从大到小的顺序对它们进行排序。
area = anchors(:,1).*anchors(:,2); [~,idx] = sort(area,"descend"); sortedAnchors = anchors(idx,:)YOLO v4 网络中有三个检测头,因此请分别创建三组锚框,每组包含四个锚框。
anchorBoxes = {sortedAnchors(1:4,:) sortedAnchors(5:8,:) sortedAnchors(9:12,:)};使用
yolov4ObjectDetector函数创建一个 YOLO v4 目标检测网络。指定类和已排序的锚框。该函数将第一组锚框分配给第一个检测头,将第二组锚框分配给第二个检测头,依此类推。前四个锚框面积较大,必须分配给第一个检测头,该检测头输出分辨率较低的 19×19 特征图。接下来的四个锚框必须分配给第二个检测头,该检测头输出的特征图尺寸为 38×38。最后四个锚框被分配给第三个检测头,该检测头输出分辨率最高的 76×76 特征图。detector = yolov4ObjectDetector("csp-darknet53-coco","car",anchorBoxes);
使用
trainYOLOv4ObjectDetector函数对检测器进行训练。detector = trainYOLOv4ObjectDetector(trainingData,detector,trainingOptions);
迁移学习
要进行迁移学习,请将一个预训练的卷积神经网络 (CNN) 用作 YOLO v4 深度学习网络的基础网络。通过指定锚框和新的目标类别,配置 YOLO v4 深度学习网络,以便在其上进行新数据集的训练。使用 yolov4ObjectDetector 对象,可以基于任何预训练网络(例如 ResNet-50)创建自定义的 YOLO v4 目标检测网络。然后,使用 trainYOLOv4ObjectDetector 函数对网络进行训练。
有关如何创建自定义 YOLO v4 目标检测器的信息,请参阅创建自定义 YOLO v4 目标检测器。
为深度学习标注训练数据
您可以使用图像标注器、视频标注器或真实值标注器 (Automated Driving Toolbox)以交互方式对像素进行标注,并导出标注数据用于训练。您还可以使用这些 App,为目标检测标注与坐标轴对齐或经过旋转的矩形感兴趣区域 (ROI),为图像分类标注场景标签,以及为语义分割标注像素。若要根据任何标注员导出的真实值对象创建训练数据,可以使用 objectDetectorTrainingData 或 pixelLabelTrainingData 函数。有关详细信息,请参阅Training Data for Object Detection and Semantic Segmentation。
参考
[1] Bochkovskiy, Alexey, Chien-Yao Wang, and Hong-Yuan Mark Liao. “YOLOv4: Optimal Speed and Accuracy of Object Detection.” ArXiv:2004.10934 [Cs, Eess], April 22, 2020. https://arxiv.org/abs/2004.10934.
[2] Redmon, Joseph, Santosh Divvala, Ross Girshick, and Ali Farhadi. "You only look once: Unified, real-time object detection." In 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 779–788. Las Vegas, NV: USA: IEEE, 2016. https://doi.org/10.1109/CVPR.2016.91.
[3] Simon, Martin, Stefan Milz, Karl Amende, and Horst-Michael Gross. "Complex-yolo: Real-time 3d object detection on point clouds." arXiv preprint arXiv:1803.06199 (2018).
另请参阅
App
对象
函数
主题
- 基于 YOLO v4 深度学习的目标检测
- Anchor Boxes for Object Detection
- Choose an Object Detector
- 使用深度学习入门目标检测
- YOLOX 目标检测入门指南
- 在 MATLAB 中进行深度学习 (Deep Learning Toolbox)
- 预训练的深度神经网络 (Deep Learning Toolbox)