代码地址:pytorch-YOLOv4
我在入门学习计算机视觉的时候,看一些经典的论文原文比较吃力。于是通过看各种参考文献及查阅各路资料,入门的角度写了一些博客,希望能够和大家一起进步。
在上三篇文章中介绍过YOLOv1,YOLOv2及YOLOv3,地址如下:
笔者在阅读《Scaled-YOLOv4: Scaling Cross Stage Partial Network》原文后,根据自身理解及查阅资料,以入门角度尽可能想要还原论文细节,水平有限,欢迎交流。
YOLO属于one-stage(单阶段检验),其检测速度远超当时作为主流目标检测算法的R-CNN系列(two-stage),但也牺牲了部分准确率。作者將region proposal创造性地,巧妙地转化为回归分析问题,也就是将挑选region proposal的问题也丢到model內,让model也帮忙预测bounding box。
YOLOv2对YOLOv1的提升很大,作者称其为Better(准确度提升),Faster(速度提升),Stronger(识别种类提升)。YOLOv3的提升则比较小。
作者Joseph Redmon最近宣布,由于军事和伦理问题,他将停止进行计算机视觉研究……
于是Alexey Bochkovskiy接过大棒,开始了YOLOv4的研究,而当时YOLOv4也被认为是目标检测中具有最佳速度和准确性的模型。
ResNet、DenseNet、VGG等模型被用作特征提取器。它们在图像分类数据集(如 ImageNet)上进行了预训练,然后在检测数据集上进行了微调。事实证明,随着网络变得更深(更多层)产生具有更高语义的不同级别特征的这些网络对于目标检测网络的后期部分很有用。
为了提高准确性,我们可以设计一个更深的网络来扩展感受野并增加模型的复杂性。为了减轻训练难度,可以应用跳跃连接。
一个Dense Block包含多个卷积层,每个层 H i Hi Hi由batch normalization(批归一化)、ReLU 和卷积组成。 H i Hi Hi不是仅使用最后一层的输出,而是将所有先前层的输出以及原始层的输出作为其输入。即 x 0 、 x 1 、 … x ₀ 、x ₁ 、… x0、x1、…和 x i − 1 x_{i-1} xi−1。下面的每个 H i Hi Hi输出四个特征图。因此,在每一层,特征图的数量增加了四倍,也就是网络的增长率。
然后可以通过在由卷积和池化组成的过渡层之间组合多个 Dense Block 来形成 DenseNet。
上面是详细的建筑设计。
这些是在主干和头部之间的额外层。它们用于提取主干不同阶段的不同特征图。颈部常见的例子如FPN、PANet、Bi-FPN等。在应用中例如,YOLOv3 使用 FPN 从主干中提取不同尺度的特征。
对提取不同尺度的特征感兴趣,可以参考《YOLO超详细入门 03 v3 图文详解(含代码+原文)》
而YOLOv4中并没有使用多尺度特征金字塔,而是使用PANet(路径聚合网络)的修改版本,目的同样是为了信息融合以获得更高的准确性。
另一个技术是空间注意模块 (SAM),注意力机制已广泛用于深度学习,尤其是递归神经网络。它指的是专注于输入的特定部分。如果想了解注意力机制,可以参考《Attention? Attention!》。
最后,这里还使用了 R-CNN 网络和许多其他算法中使用的空间金字塔池化 (SPP Net) 。如果想了解SPPnet,可以参考《Faster RCNN超详细入门 01-准备篇-背景 RCNN,SPPnet,Fast RCNN,RoI Pooling》。
SPP 在检测不同尺度的对象时采用了稍微不同的策略。它将最后一个池化层(在最后一个卷积层之后)替换为空间金字塔池化层。特征图在空间上被划分为 m × m m × m m×m 个bin,其中m分别等于 1、2 和 4。然后将最大池应用于每个通道的每个 bin。这形成了一个固定长度的表示,可以用 FC 层进一步分析。
许多基于 CNN 的模型包含 FC 层,因此只接受特定尺寸的输入图像。相比之下,SPP 接受不同大小的图像。
在 YOLO 中,修改了 SPP 以保留输出空间维度。最大池应用于大小为 1×1、5×5、9×9、13×13 的滑动内核。空间维度被保留。然后将来自不同内核大小的特征映射连接在一起作为输出。
SPP Net集合到YOLO中过程如下:
在早期的 DL 中,模型设计相对简单。每一层都从前一层获取输入。早期层提取局部纹理和图案信息,以构建后期层所需的语义信息。然而,随着我们向右移动,微调预测所需的本地化信息可能会丢失。
在以后的 模型中,层之间的互连变得越来越复杂。在 DenseNet 中,它将各个层之间的关系发挥到了极致,把特征进行了多次融合。每一层都与之前的所有层相连。
在 FPN 中,信息是从自下而上和自上而下流中的相邻层组合的。层之间的信息流成为模型设计中的另一个关键决策。
上图是用于对象检测的路径聚合网络 (PAN)。自下而上的路径 (b) 被增强以使低层信息更容易传播到顶部。在 FPN 中,局部空间信息在红色箭头中向上传播。虽然图中没有清楚地展示,但红色路径经过了大约 100 多个层。PAN 引入了一条捷径(绿色路径),只需大约 10 层即可到达顶部 N₅ 层。这种短路概念使顶层可以使用细粒度的本地化信息。
然而,在 YOLOv4 中,不是将相邻层添加在一起,而是将特征图连接在一起。
在 FPN 中,对象在不同的尺度级别上分别独立地检测。这可能会产生重复的预测,并且不会利用来自其他特征图的信息。PAN 首先使用 element-wise max 操作将所有层的信息融合在一起。
注意力在深度学习设计中被广泛采用。在 SAM 中,Max pooling和average pooling分别应用于输入特征图以创建两组特征图。结果被输入一个卷积层,然后是一个 sigmoid 函数来创建空间注意力。
该空间注意掩码应用于输入特征以输出细化的特征图。
在 YOLOv4 中,使用修改后的 SAM 而不应用Max pooling和average pooling,FPN 概念逐渐被实施/替换为修改后的 SPP、PAN 和 PAN。