TensorFlow2 深度学习实战(十四):YOLOv4目标检测算法解析
Posted AI 菌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TensorFlow2 深度学习实战(十四):YOLOv4目标检测算法解析相关的知识,希望对你有一定的参考价值。
前言:
本专栏将以理论与实战相结合的方式,对一些的经典的神经网络算法进行逐一解析,并使用深度学习框架 TensorFlow2 逐一实现这些经典的深度学习算法,来实现图像分类、目标检测、语义分割等任务。本专栏将持续更新,敬请期待!
专栏目录:TensorFlow2 深度学习实战
Github仓库,欢迎star:https://github.com/Keyird
文章目录
一、YOLOv4简介
去年(2020年)YOLO系列的作者Redmon在推特上发表声明,出于某些方面的考虑,从此退出CV界。听到此消息的我,为之震惊!本以为YOLOv3已经是YOLO系列的终局之战。没想到就在今年,Alexey Bochkovskiy等人与Redmon取得联系,正式将他们的研究命名为YOLOv4。
YOLOv4 在 YOLOv3 网络结构的基础进行了一定改进,引入了近几年CNN领域中最优秀的优化策略,从数据增强、骨干网络、网络训练、激活函数、损失函数等方面进行不同程度的优化,实现了检测速度和精度的最佳权衡。实验表明,在Tesla V100上,对MS COCO数据集的实时检测速度达到 65 FPS,精度达到 43.5%AP。
在性能方面,YOLOv4 的检测速度比 EfficientDet 快两倍,检测准确度却相当。与 YOLOv3 相比,精度AP 和速度 FPS 分别提高了 10% 和 12%,具体性能对比可见下表:
二、网络结构
YOLOv4 在 YOLOv3 的基础上进行了一些改进,结构上主要的改进分为以下几个方面:
- 引入了 CSPNet 结构,将原始的骨干网络 Darknet53 替换为 CSPDarknet53,减少了网络的参数;
- 引入了 SPPNet 结构,增大了特征层的感受野;
- 引入了 PANet 结构,在 FPN 的基础上,增加了特征融合;
除此之外,沿用了 YOLOv3 中的 FPN、Darknet、YOLO-Head等模块的思想。综上,YOLOv4 的整体结构可以简单描述为: YOLOv4 = CSPDarknet53主干网络 + SPP附加模块 + PANet路径聚合 + YOLOv3头部
(1)CSPNet
在了解 CSPDarknet53 之前,我们需要先对 CSPNet 认识一下。CSPNet 的全称是 Cross Stage Partial Network,在2019年由Chien-Yao Wang等人提出,用来解决以往网络结构需要大量推理计算的问题。CSPNet在ImageNet dataset和MS COCO数据集上有很好的测试效果,同时它易于实现,在ResNet、ResNeXt和DenseNet网络结构上都能通用。
作者认为网络需要大量推理计算的原因是,网络优化中存在着大量的重复梯度信息。CSPNet 的主要目的是能够实现更丰富的梯度组合,同时减少计算量。这个目标是通过将基本层的特征图分成两部分Part1和Part2,每一部分的通道数减半;然后通过一个跨阶段的层次结构合并它们来实现的。其结构如下图所示:
(2)CSPDarknet53
从命名上就很容易看出,CSPDarknet53 由两部分组成:Darknet53 和 CSPNet。Darknet53 是 YOLOv3 中所设计的一种骨干网络,其网络结构如下图所示:
从上图可知,Darknet53 主要由 5 个残差块组成,这5个残差块分别由 1,2,8,8,4 个 Conv(1x1)-Conv(3x3)-Residual 构成。CSPDarknet53 通过在每个残差块之间引入 CSPNet 结构,来改进网络。
(3)SPPNet
SPP最初的设计目的是用来使卷积神经网络不受固定输入尺寸的限制。在YOLOv4中,作者引入SPP,是因为它显著地增加了感受野,分离出了最重要的上下文特征,并且几乎不会降低的YOLOv4运行速度。如下图所示,就是SPP中经典的空间金字塔池化层。
在YOLOv4中,具体的做法就是:分别利用四个不同尺度的最大池化核对上层输出的feature map进行处理。最大池化层的池化核大小分别为13x13、9x9、5x5、1x1,其中1x1就相当于不处理。
(4)PANet
在YOLOv4中,作者使用 PANet代替 YOLOv3 中的 FPN 作为参数聚合的方法,针对不同的检测器级别从不同的主干层进行参数聚合。并且对原PANet方法进行了修改, 使用张量连接(concat)代替了原来的捷径连接(shortcut connection)。
PANet 整体上可以看做是在Mask R-CNN上做多处改进,充分利用了特征融合,比如引入Bottom-up path augmentation结构,充分利用网络浅特征进行分割;引入Adaptive feature pooling使得提取到的ROI特征更加丰富;引入Fully-conneFcted fusion,通过融合一个前背景二分类支路的输出得到更加精确的分割结果。
下图是PANet的示意图,主要包含FPN、Bottom-up path augmentation、Adaptive feature pooling、Fully-connected fusion四个部分。
- FPN发表于CVPR2017,主要是通过融合高低层特征提升目标检测的效果,尤其可以提高小尺寸目标的检测效果。
- Bottom-up Path Augmentation的引入主要是考虑网络浅层特征信息对于实例分割非常重要,因为浅层特征一般是边缘形状等特征。
- Adaptive Feature Pooling用来特征融合。也就是用每个ROI提取不同层的特征来做融合,这对于提升模型效果显然是有利无害。
- Fully-connected Fusion是针对原有的分割支路(FCN)引入一个前背景二分类的全连接支路,通过融合这两条支路的输出得到更加精确的分割结果。
在YOLOv4中,作者对原PAN(Path Aggregation Network)方法进行了修改, 使用张量连接(concat)代替了原来的addition操作。如下图所示:
(5)YOLO-Head
在YOLOv4中,继承了YOLOv3的Head进行多尺度预测,采用三个不同层级的特征图进行融合。从下图可以看出,在COCO数据集上训练时,YOLOv4的3个输出张量的shape分别是:(19,19,225)、(38,38,255)、(76,76,225)。这是因为COCO有80个类别,并且每一个网格对应3个Anchor boxes,而每个要预测的bounding box对应的5个值( t x 、 t y 、 t w 、 t h t_x、t_y、t_w、t_h tx、ty、tw、th 、 t o t_o to),所以有:3 x (80+5)=255 。
(6)整体结构
完整的 YOLOv4 网络结构图如下:
三、添加Tricks
(1)Mish
使用MIsh激活函数代替了原来的Leaky ReLU。在YOLOv3中,每个卷积层之后包含一个批量归一化层和一个Leaky ReLU。而在YOLOv4的主干网络CSPDarknet53中,使用Mish代替了原来的Leaky ReLU。Leaky ReLU和Mish激活函数的公式与图像如下:
(2)数据增强Mosaic
这是作者提出的一种新的数据增强方法,该方法借鉴了CutMix数据增强方式的思想。CutMix数据增强方式利用两张图片进行拼接,但是Mosaic使利用四张图片进行拼接。如下图所示:
Mosaic数据增强方法有一个优点:拥有丰富检测目标的背景,并且在BN计算的时候一次性会处理四张图片!
(3)修改过的SAM
作者在原SAM(Spatial Attention Module)方法上进行了修改,将SAM从空间注意修改为点注意。如下图所示,对于常规的SAM,最大值池化层和平均池化层分别作用于输入的feature map,得到两组shape相同的feature map,再将结果输入到一个卷积层,接着是一个 Sigmoid 函数来创建空间注意力。
将SAM(Spatial Attention Module)应用于输入特征,能够输出精细的特征图。
在YOLOv4中,对原来的SAM方法进行了修改。如下图所示,修改后的SAM直接使用一个卷积层作用于输入特征,得到输出特征,然后再使用一个Sigmoid 函数来创建注意力。作者认为,采用这种方式创建的是点注意力。
(4)CIOU
在 YOLOv3 中,目标损失函数的定位损失部分仍然采用的是平方和的损失计算方法,这种方法不能很好的反应预测框与真实框的重合程度。
针对以上问题,作者引入了CIOU损失函数,CIOU将目标与anchor之间的中心距离,重叠率、尺度以及惩罚项都考虑进去,使得目标框回归变得更加稳定,不会像IOU和GIOU一样出现训练过程中发散等问题。而惩罚因子把预测框长宽比拟合目标框的长宽比考虑进去。其计算公式如下:
其中,其中 a 为权重系数,根据定义可知损失函数会向重叠区域大的方向优化,v衡量了预测框与目标框长宽比的相似性。
如上图所示,与DIOU一样,c为两框外接矩形的对角线距离,d为两框中心位置的欧氏距离
p
(
b
p
r
e
d
,
b
g
t
)
p(b_{pred}, b_{gt})
p(bpred,bgt)。
(5)Label Smoothing
所谓 Label Smoothing 就是标签平滑,这是对训练集中标签进行的一种预处理手段。其作用是对分类准确度引入惩罚,防止过拟合。
标签平滑的思想很简单,具体公式如下:
new_onehot_labels = onehot_labels * (1 - label_smoothing_rate) + label_smoothing_rate / num_classes
一般取标签平滑率为0.01,对于二分类任务来说:
new_onehot_labels = onehot_labels * (1 - 0.01) + 0.01 / 2
更直观地,假设原始标签的onehot形式为 [0,1] ,经过标签平滑后,就变成 [0.005, 0.995]。
(6)CosineAnnealing
CosineAnnealing,即余弦退火,用于学习率衰减。严格意义上,CosineAnnealing并不能称之为余弦退火衰减,因为CosineAnnealing函数是一个先上升,后下降的周期函数,上升段使用线性上升,下降段模拟cos函数下降,如下图所示:
当我们使用梯度下降算法来优化目标函数的时候,当越来越接近Loss值的全局最小值时,学习率应该变得更小来使得模型尽可能接近这一点,而余弦退火(Cosine annealing)可以通过余弦函数来降低学习率。余弦函数中随着x的增加余弦值首先缓慢下降,然后加速下降,再次缓慢下降。这种下降模式能和学习率配合,以一种十分有效的计算方式来产生很好的效果。
四、性能比较
在COCO数据集上,分别采用608x608、512向12、406x406 的输入图片进行测试,得到不同的测试结果。
(1)输入图片尺寸为608x608,采用不同改进Tricks后的YOLOv4的实验对比如下:
(2)输入图片尺寸为512x512,采用不同改进Tricks后的YOLOv4的实验对比如下:
(3)输入图片尺寸为416x416,采用不同改进Tricks后的YOLOv4的实验对比如下:
五、总结
综合以上分析,总结出YOLOv4带给我们的优点有:
- YOLOv4 是一个高效而强大的模型,能在普通的GPU上训练和使用,比如 GTX 1080Ti 和 GTX 2080Ti 等。
- YOLOv4 提供了可供选择的两种模型:一种是精度高、速度普通的YOLOv4网络,可以满足对检测精度要求很高的场景;另一种是速度很快、精度稍降的YOLOv4-Tiny网路,可以满足对检测速度要求很高的场景。
- 论文中总结了各种Tricks(包括各种BoF和BoS),给我们启示,选择合适的Tricks可以提高自己检测器的性能。
参考文献:
- 深度学习阅读导航 | 15 YOLOv4:最佳速度与精确度的目标检测器
- pytorch必须掌握的的4种学习率衰减策略
- 学习率衰减之余弦退火(CosineAnnealing)
- https://my.oschina.net/u/4775682/blog/4701253
以上是关于TensorFlow2 深度学习实战(十四):YOLOv4目标检测算法解析的主要内容,如果未能解决你的问题,请参考以下文章
TensorFlow2深度学习实战(十三): 语义分割算法 SegNet 实战
TensorFlow2深度学习实战(十五):目标检测算法 YOLOv4 实战
TensorFlow2深度学习实战(十七):目标检测算法 Faster R-CNN 实战
TensorFlow2深度学习实战(十七):目标检测算法 Faster R-CNN 实战