YOLOv4
YOLOv4 在网络结构上没有大突破,不过使用学多小 tricks,可以做面试经典,在YOLOv4 可以看成 YOLOv3 加强版,所以YOLOv4 与 YOLOv3 的预测大致一样
- 13 x 13 用于检测大目标
- 26 x 26 用于检测中目标
- 52 x 52 用于检测小目标
在 head 部分决定我们网络是用于检测还是分类
YOLOv4 的优化点
在现在的目标检测的结构,现在按这些位置来说明一下 YOLOv4 改动
- backbone: Darknet53 更改为 CSPDarknet53
- neck
- head 在特征提取网络,使用了 SPP 和 PANet 结构来加强特征提取
<img src="./images/yolov3_structure.jpg">
<img src="./images/yolov4_net_architecture.jpeg">
<img src="./images/yolov4_structure.png">
- 输入
- 压缩宽度和高度到通道维度
- 在后面几层已经具有一定语义信息,
- 进行
CSPDarknet53(CSP)
CSPDarknet53 是 Darknet53 的改进版本,经过主干神经网我们会得到 3 个有效特征层输出 、 和 的特征层, CSP
- resblock 构成
- Mish 激活函数: ReLU 激活函数一直依赖是我们做卷积神经网络的首选。不过随着 Mish 出现,这种情况可能会发生改变。那么 Mish 凭什么能够代替老大的位置呢?
<img src="./images/yolov4_mish_activation.jpeg" width="75%">
看函数形状会发现这个函数不是单调的,ReLU 和 Mish 的对比,Mish 的梯度更平滑。而且实验证明 Mish 和各种优化器结合的效果都比较好。
更具体说一下,以上无边界(即正值可以达到任何高度),避免了由于封顶而导致的饱和,例如 ReLU6。理论上对负值的轻微允许允许更好的梯度流,而不是像ReLU 中那样的硬 0 边界。
最后,可能也是最重要的,目前的想法是,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化。
尽管如此,我测试了许多激活函数,他们也满足了其中的许多想法,但大多数都无法执行。这里的主要区别可能是 Mish 函数在曲线上几乎所有点上的平滑度。
这种通过 Mish 激活曲线平滑性来推送信息的能力如下图所示,在简单测试中,越来越多的层被添加到一个测试神经网络中,而没有一个统一的函数。随着层深的增加,ReLU 精度迅速下降(),其次是 Swish。相比之下,Mish 能更好地保持准确性,这可能是因为它能更好地传播信息:
<img src="./images/yolov4_mish_activation_02.jpeg">
- 使用 CSPDarkNet 的结构(CSP + Darknet)
<img src="./images/yolov4_resblock.png"> - Part1 是对残差结构堆叠
- Part2 部分是一个大残差边
<img src="./images/yolov4_csp_002.png">
<img src="./images/yolov4_002.jpeg"/>
融合特征提取
SPP 结构
- 首先进行 卷积进行 3 次卷积
- 然后进行 SPP 模块,只需要不同池化核进行池化后再进行堆叠就可以了
- 最后再进行 3 次卷积
PANet
<img src="./images/yolov4_neck_head.png">
SE 和 SAM
- SENet (Squeeze-and-Excitation (SE), 增加 2% 计算量(但推理时有10%的速度),可以提升1%的ImageNet top-1精度。
- Spatial Attention Module (SAM),增加0.1%计算量,提升0.5%的top-1准确率
数据增强
这里
- 数据增强(扩充)
- 亮度、饱和度、噪声
- 几何变形
- 模拟对象遮挡
- random erase
- Cutout
- hide-and-seek grid mask 随机或均匀选取图片中的几何区域将其全部替换为 0
- feture map
- Dropout
- DropConnet
- DropBlock
<img src="./images/yolov4_dropblock.png">
- 图像融合
- MixUp
- CutMix 作者在 CutMix 基础提出 Mosica 增强
<img src="./images/yolov4_mosaic.png">
<img src="./images/yolov4_mosaic_002.jpeg">
- 解决类别不平衡
- hard negative example mining
- online hard example mining
- focal loss
- label smoothing
转换到
- bbox
<img src="./images/yolov4_CIoU.jpeg">IoU loss
IoU 的问题是因为如果两个框不相交,IoU 就是 0 所以 1 存在梯度消失问题GIoU loas
<img src="./images/yolov4_GIoU.jpg">-
DIoU loss
<img src="./images/yolov4_DIoU.jpg">- 两个中心点位置约束,c 表示两个框的对角线连接长度就是 c 两个中心点距离平方
-
CIoU loss
v 是用来度量长宽比相似性的, 是用来度量权重函数
IoU 是比值的概念,对目标物体的 scale 是不敏感的,然而常用的 BBox 的回归损失优化和 IoU 优化不是完全等价的,通常 IoU 无法直接优化没有重叠的部分。
于是有人提出直接使用 IoU 作为回归优化 loss, CIoU 是其中非常优秀的一种想法。
CIoU 将目标与 anchor 之间的距离、重叠率、尺度以及正则项都考虑进去,使得BBox变得更加稳定,不会像 IoU 和 GIoU 一样出现训练过程中发散等问题。而
-
DIoU-NMS
- 传统的 NMS 通过重叠去掉冗余框,但是对于遮挡效果不好。所以在 DIoU-NMS 不仅考虑检测区域的重叠,而且还考虑了检测区域间的中心点的距离
现在做目标检测就是对应目标,对三个部分进行选择填空,
部位 | |
---|---|
backbone | CSPDarknet53 |
neck | SPP,FPN,PAN |
head | 与 yolov3 一致,提供 3 个检测头 |
YOLOv4
- Bag of Freebie(Bof) for backbone
- CutMix
- Mosaic data augmentation
- DropBlock regularization
- Class label smoothing
- Bag of Special(Bos)
- Mish activation
- Cross-stage partial connections(CSP)
- Multi-input weighted residual connection(MiWRC)
- Bag of Freebies(BoF) for Detector
- CIoU-loss
- CmBN
- DropBlock regularization
- Mosaic data augmentation
- Self-Adversarial Training
- Eliminate grid sensitivity
- Using multiple anchors for a single ground truth
- Cosine annealing scheduler
- Optimal hyper-parameters
- Random training shapes
- Bag of Specials(Bos) for detector
- Mish activation
- SPP-block
- SAM-block
- PAN path-aggregation block
- DIoU-NMS
历史版本
版本 | 说明 | |
---|---|---|
1 | yolov1 | 直接回归出位置 |
2 | yolov2 | 全流程多尺度法,还是一个检测头 |
3 | yolov3 | 多尺度检测头,resblock darknet53 |
- 模型设计,前向计算
- 定义目标函数
- 反向传播