目前的检测模型通常由两部分组成:
近几年发展起来的目标检测网络还会在Backbone和Head中间插入一些层,用于收集不同阶段的特征图
综上所述,通常目标检测由几个部分组成:
2020年YOLO系列的作者Redmon在推特上发表声明,出于道德方面的考虑,从此退出CV界。听到此消息的我,为之震惊!本以为YOLOv3已经是YOLO系列的终局之战。没想到就在今年,Alexey Bochkovskiy等人与Redmon取得联系,正式将他们的研究命名为YOLOv4。
YOLOv4对深度学习中一些常用Tricks进行了大量的测试,最终选择了这些有用的Tricks:WRC、CSP、CmBN、SAT、 Mish activation、Mosaic data augmentation、CmBN、DropBlock regularization 和 CIoU loss。
YOLOv4在传统的YOLO基础上,加入了这些实用的技巧,实现了检测速度和精度的最佳权衡。实验表明,在Tesla V100上,对MS COCO数据集的实时检测速度达到65 FPS,精度达到43.5%AP。
YOLOv4的独到之处在于:
主要的改进思路如下所示:
最简单清晰的表示: YOLOv4 = CSPDarknet53(主干) + SPP附加模块(颈) + PANet路径聚合(颈) + YOLOv3(头部)
上图展示了YOLOv4目标检测算法的整体框图。对于一个目标检测算法而言,我们通常可以将其划分为4个通用的模块,具体包括:输入端、基准网络、Neck网络与Head输出端,对应于上图中的4个红色模块。
YOLOV4 基础组件:
完整的网络结构图如下:
YOLOv4的网络结构是由 CSPDarknet53、 SPP、 PANet、YOLOv3头部等组成,下面对各部分逐一讲解:
大家也可以点击Yolov4的netron网络结构图,
在YOLOv4中,将CSPDarknet53作为主干网络。在了解CSPDarknet53之前,需要先介绍下CSPNet。
CSPNet来源于这篇论文:《CSPNET: A NEW BACKBONE THAT CAN ENHANCE LEARNING CAPABILITY OF CNN》
CSPNet开源地址: https://github.com/WongKinYiu/CrossStagePartialNetworks
CSPNet全称是Cross Stage Partial Network,在2019年由Chien-Yao Wang等人提出,用来解决以往网络结构需要大量推理计算的问题。作者将问题归结于网络优化中的重复梯度信息。CSPNet在ImageNet dataset和MS COCO数据集上有很好的测试效果,同时它易于实现,在ResNet、ResNeXt和DenseNet网络结构上都能通用。
CSPNet
全称是Cross Stage Partial Networks
,也就是跨阶段局部网络。CSPNet
解决了其他大型卷积神经网络框架Backbone
中网络优化的梯度信息重复问题,将梯度的变化从头到尾地集成到特征图中,因此减少了模型的参数量和FLOPS
数值,既保证了推理速度和准确率,又减小了模型尺寸。如下图:
CSPNet
实际上是基于Densnet
的思想,复制基础层的特征映射图,通过dense block
发送副本到下一个阶段,从而将基础层的特征映射图分离出来。这样可以有效缓解梯度消失问题(通过非常深的网络很难去反推丢失信号) ,支持特征传播,鼓励网络重用特征,从而减少网络参数数量。CSPNet
思想可以和ResNet
、ResNeXt
和DenseNet
结合,目前主要有CSPResNext50
和CSPDarknet53
两种改造Backbone
网络。
考虑到几方面的平衡:输入网络分辨率/卷积层数量/参数数量/输出维度。一个模型的分类效果好不见得其检测效果就好,想要检测效果好需要以下几点:
这样最终的CSPDarknet53
结构就如下图:
CSPNet的主要目的是能够实现更丰富的梯度组合,同时减少计算量。这个目标是通过将基本层的特征图分成两部分,然后通过一个跨阶段的层次结构合并它们来实现的。
而在YOLOv4中,将原来的Darknet53结构换为了CSPDarknet53,其中包含了5个CSP模块。
每个CSP模块前面的卷积核的大小都是3*3,stride=2,因此可以起到下采样的作用。
因为Backbone有5个CSP模块,输入图像是608*608,所以特征图变化的规律是:608->304->152->76->38->19
经过5次CSP模块后得到19*19大小的特征图。
CSP模块可以先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并起来,这样不仅减少了计算量,而且可以保证模型的准确率。它的优点包括:(1)增强CNN网络的学习能力,轻量化模型的同时保持模型的精度;(2)降低整个模型的计算瓶颈;(3)降低算法的内存成本。有关CSP模块的更多细节请看该论文。
这在原来的基础上主要进行了两项改变:
将原来的Darknet53与CSPNet进行结合。在前面的YOLOv3中,我们已经了解了Darknet53的结构,它是由一系列残差结构组成。进行结合后,CSPnet的主要工作就是将原来的残差块的堆叠进行拆分,把它拆分成左右两部分:主干部分继续堆叠原来的残差块,支路部分则相当于一个残差边,经过少量处理直接连接到最后。具体结构如下:
Mish激活函数-该激活函数是在2019年提出的,该函数是在Leaky_relu算法的基础上改进而来的,具体的比较请看下图。当x>0时,Leaky_relu与Mish激活函数基本相同;当x<0时,Mish函数基本为0,而Leaky_relu函数为λx。YOLOv4的Backbone中均使用了Mish激活函数,而后面的Neck网络中则使用了leaky_relu激活函数。总而言之,Mish函数更加平滑一些,可以进一步提升模型的精度。更多的细节请看该论文。
Mish
是一个平滑的曲线,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化;在负值的时候并不是完全截断,允许比较小的负梯度流入。实验中,随着层深的增加,ReLU
激活函数精度迅速下降,而Mish
激活函数在训练稳定性、平均准确率(1%-2.8%
)、峰值准确率(1.2% - 3.6%
)等方面都有全面的提高。如下图:
Mish
论文: https://arxiv.org/pdf/1908.08681.pd
SPP来源于这篇论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
SPP最初的设计目的是用来使卷积神经网络不受固定输入尺寸的限制。在YOLOv4中,作者引入SPP,是因为它显著地增加了感受野,分离出了最重要的上下文特征,并且几乎不会降低的YOLOv4运行速度。如下图所示,就是SPP中经典的空间金字塔池化层。
在YOLOv4中,具体的做法就是:分别利用四个不同尺度的最大池化对上层输出的feature map进行处理。最大池化的池化核大小分别为13x13、9x9、5x5、1x1,其中1x1就相当于不处理。
SPP模块通过融合不同大小的最大池化层来获得鲁棒的特征表示,YOLOv4中的k={1*1,5*5,9*9,13*13}包含这4种形式。这里的最大池化层采用padding操作,移动步长为1,比如输入特征图的大小为13x13,使用的池化核大小为5x5,padding=2,因此池化后的特征图大小仍然是13×13。YOLOv4论文表明:(1)与单纯的使用k*k最大池化的方式相比,采用SPP模块的方式能够更有效的增加主干特征的接收范围,显著的分离了最重要的上下文特征。(2)在COCO目标检测任务中,当输入图片的大小为608*608时,只需要额外花费0.5%的计算代价就可以将AP50提升2.7%,因此YOLOv4算法中也采用了SPP模块。
作者在SPP模块中,使用k={1*1,5*5,9*9,13*13}的最大池化的方式,再将不同尺度的特征图进行Concat操作。
注意:这里最大池化采用padding操作,移动的步长为1,比如13×13的输入特征图,使用5×5大小的池化核池化,padding=2,因此池化后的特征图仍然是13×13大小。
论文链接:《Path Aggregation Network for Instance Segmentation》
这篇文章发表于CVPR2018,它提出的Path Aggregation Network (PANet)既是COCO2017实例分割比赛的冠军,也是目标检测比赛的第二名。PANet整体上可以看做是在Mask R-CNN上做多处改进,充分利用了特征融合,比如引入Bottom-up path augmentation结构,充分利用网络浅特征进行分割;引入Adaptive feature pooling使得提取到的ROI特征更加丰富;引入Fully-conneFcted fusion,通过融合一个前背景二分类支路的输出得到更加精确的分割结果。
用于目标检测的路径聚合网络 (PAN)。 自下而上的路径 (b) 得到增强,使低层空间信息更易于传播到顶部。在 FPN 中,局部空间信息沿红色箭头向上传播。 虽然图中未明确显示,但红色路径将穿过约 100 层以上。PAN 引入了一条捷径(绿色路径),仅需大约 10 层即可到达顶层。 这种捷径连接使细粒度的局部信息可用于顶层。
下图是PANet的示意图,主要包含FPN、Bottom-up path augmentation、Adaptive feature pooling、Fully-connected fusion四个部分。
在YOLOv4中,作者使用PANet代替YOLOv3中的FPN作为参数聚合的方法,针对不同的检测器级别从不同的主干层进行参数聚合。并且对原PANet方法进行了修改, 使用张量连接(concat)代替了原来的捷径连接(shortcut connection)。
FPN+PAN-所谓的FPN,即特征金字塔网络,通过在特征图上面构建金字塔,可以更好的解决目标检测中尺度问题。PAN则是借鉴了图像分割领域PANet算法中的创新点,它是一种自底向上的结构,它在FPN的基础上增加了两个PAN结构,如下图中的2和3所示。(1)整个网络的输入图像大小为608*608;然后经过CSP块之后生成一个76*76大小的特征映射,经过下采样操作之后生成38*38的特征映射,经过下采样操作之后生成19*19的特征映射;(2)接着将其传入FPN结构中,依次对19*19、38*38、76*76执行融合操作,即先对比较小的特征映射层执行上采样操作,将其调整成相同大小,然后将两个同等大小的特征映射叠加起来。通过FPN操作可以将19*19大小的特征映射调整为76*76大小,这样不仅提升了特征映射的大小,可以更好的解决检测中尺度 问题,而且增加了网络的深度,提升了网络的鲁棒性。(3)接着将其传入PAN结构中,PANet网络的PAN结构是将两个相同大小的特征映射执行按位加操作,YOLOv4中使用Concat操作来代替它。经过两个PAN结构,我们将76*76大小的特征映射重新调整为19*19大小,这样可以在一定程度上提升该算法的目标定位能力。FPN层自顶向下可以捕获强语义特征,而PAF则通过自底向上传达强定位特征,通过组合这两个模块,可以很好的完成目标定位的功能。
对比Yolov3\Yolov说明
Yolov3结构:
我们先来看下Yolov3中Neck的FPN结构
可以看到经过几次下采样,三个紫色箭头指向的地方,输出分别是76*76、38*38、19*19。
以及最后的Prediction中用于预测的三个特征图①19*19*255、②38*38*255、③76*76*255。[注:255表示80类别(1+4+80)×3=255]
我们将Neck部分用立体图画出来,更直观的看下两部分之间是如何通过FPN结构融合的。
如图所示,FPN是自顶向下的,将高层的特征信息通过上采样的方式进行传递融合,得到进行预测的特征图。
Yolov4结构:
而Yolov4中Neck这部分除了使用FPN外,还在此基础上使用了PAN结构:
前面CSPDarknet53中讲到,每个CSP模块前面的卷积核都是3*3大小,步长为2,相当于下采样操作。
因此可以看到三个紫色箭头处的特征图是76*76、38*38、19*19。
以及最后Prediction中用于预测的三个特征图:①76*76*255,②38*38*255,③19*19*255。
我们也看下Neck部分的立体图像,看下两部分是如何通过FPN+PAN结构进行融合的。
和Yolov3的FPN层不同,Yolov4在FPN层的后面还添加了一个自底向上的特征金字塔。
其中包含两个PAN结构。
这样结合操作,FPN层自顶向下传达强语义特征,而特征金字塔则自底向上传达强定位特征,两两联手,从不同的主干层对不同的检测层进行参数聚合,这样的操作确实很皮。
FPN+PAN借鉴的是18年CVPR的PANet,当时主要应用于图像分割领域,但Alexey将其拆分应用到Yolov4中,进一步提高特征提取的能力。
不过这里需要注意几点:
注意一:
Yolov3的FPN层输出的三个大小不一的特征图①②③直接进行预测
但Yolov4的FPN层,只使用最后的一个76*76特征图①,而经过两次PAN结构,输出预测的特征图②和③。
这里的不同也体现在cfg文件中,这一点有很多同学之前不太明白,
比如Yolov3.cfg最后的三个Yolo层,
第一个Yolo层是最小的特征图19*19,mask=6,7,8,对应最大的anchor box。
第二个Yolo层是中等的特征图38*38,mask=3,4,5,对应中等的anchor box。
第三个Yolo层是最大的特征图76*76,mask=0,1,2,对应最小的anchor box。
而Yolov4.cfg则恰恰相反
第一个Yolo层是最大的特征图76*76,mask=0,1,2,对应最小的anchor box。
第二个Yolo层是中等的特征图38*38,mask=3,4,5,对应中等的anchor box。
第三个Yolo层是最小的特征图19*19,mask=6,7,8,对应最大的anchor box。
注意点二:
原本的PANet网络的PAN结构中,两个特征图结合是采用shortcut操作,而Yolov4中则采用concat(route)操作,特征图融合后的尺寸发生了变化。
这里也可以对应Yolov4的netron网络图查看,很有意思。
在YOLOv4中,继承了YOLOv3的Head进行多尺度预测,提高了对不同size目标的检测性能。YOLOv3的完整结构在上文已经详细介绍,下面我们截取了YOLOv3的Head进行分析:
YOLOv4学习了YOLOv3的方式,采用三个不同层级的特征图进行融合,并且继承了YOLOv3的Head。从上图可以看出,在COCO数据集上训练时,YOLOv4的3个输出张量的shape分别是:(19,19,225)、(38,38,255)、(76,76,225)。这是因为COCO有80个类别,并且每一个网格对应3个Anchor boxes,而每个要预测的bounding box对应的5个值(,),所以有:3 x (80+5)=255 。
作者将所有的Tricks可以分为两类:
下面分别对这两类技巧进行介绍。
以数据增强方法为例,虽然增加了训练时间,但不增加推理时间,并且能让模型泛化性能和鲁棒性更好。像这种不增加推理成本,还能提升模型性能的方法,作者称之为"免费包",非常形象。下面总结了一些常用的数据增强方法:
常见的正则化方法有:
平衡正负样本的方法有:
除此之外,还有回归 损失方面的改进:
增大感受野技巧:
注意力机制:
Squeeze-and-Excitation (SE) :虽然SE模块可以在ImageNet图像分类任务中以仅增加2%的计算量为代价提高ResNet50的功率1%top-1精度,但在GPU上,它通常会增加约10%的推理时间,因此更适合在移动设备中使用。
Spatial Attention Module (SAM):0.1%的额外计算,并且它可以提高ResNet50 SE 0.5%在ImageNet图像分类任务中的top-1精度。最重要的是,它根本不影响GPU上的推理速度。
特征融合集成:
MiWRC
是Multi-input weighted residual connections
的简称, 在BiFPN
中,提出了用MiWRC
来执行标尺度级重加权,添加不同尺度的特征映射。我们已经讨论了FPN
和PAN
作为例子。下面的图(d
)显示了另一种被称为BiFPN
的neck
设计,根据BiFPN
的论文,该设计具有更好的准确性和效率权衡。
上图中 (a
)FPN
引入自顶向下的路径,将多尺度特征从3
级融合到7
级(P3-P7
);(b
)PANET
在FPN
之上增加一个额外的自下而上的路径;(c
)NAS-FPN
使用神经网络搜索找到一个不规则的特征拓扑网络,然后重复应用同一块拓扑结构;(d
)是这里的BiFPN
,具有更好的准确性和效率权衡。将该neck
放到整个整个网络的连接中如下图:
上图采用EfficientNet
作为骨干网络,BiFPN
作为特征网络,共享class/box
预测网络。 基于不同的资源约束,BiFPN
层和类/盒网层都被重复多次。
更好的激活函数:
后处理非极大值抑制算法:
想具体了解作者通过大量实验,选择了哪些Tricks?可戳我上一篇文章:YOLOv4 怎么学,看完这一篇就够了!
Dropblock是一种解决模型过拟合的正则化方法,它的作用与Dropout基本相同。Dropout的主要思路是随机的使网络中的一些神经元失活,从而形成一个新的网络。如下图所示,中间图表示经过Dropout操作之后的结果,它使得图像中的一些位置随机失活,随机删除减少神经元的数量,使网络变得更简单。
Dropblock的作者认为:由于卷积层通常是三层结构,即卷积+激活+池化层,池化层本身就是对相邻单元起作用,因而卷积层对于这种随机丢弃并不敏感。除此之外,即使是随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息。因此,在全连接层上效果很好的Dropout在卷积层上效果并不好。最右边表示经过Dropblock操作之后的结果,我们可以发现该操作直接对整个局部区域进行失活(连续的几个位置)。
Dropblock是在Cutout数据增强方式的基础上改进而来的,Cutout的主要思路是将输入图像的部分区域清零,而Dropblock的创新点则是将Cutout应用到每一个特征图上面。而且并不是用固定的归零比率,而是在训练时以一个小的比率开始,随着训练过程线性的增加这个比率。与Cutout相比,Dropblck主要具有以下的优点:(1)实验效果表明Dropblock的效果优于Cutout;(2)Cutout只能应用到输入层,而Dropblock则是将Cutout应用到网络中的每一个特征图上面;(3)Dropblock可以定制各种组合,在训练的不同阶段可以灵活的修改删减的概率,不管是从空间层面还是从时间层面来讲,Dropblock更优一些。
CIOU_loss-目标检测任务的损失函数一般由分类损失函数和回归损失函数两部分构成,回归损失函数的发展过程主要包括:最原始的Smooth L1 Loss函数、2016年提出的IoU Loss、2019年提出的GIoU Loss、2020年提出的DIoU Loss和最新的CIoU Loss函数。
1、IoU Loss-所谓的IoU Loss,即预测框与GT框之间的交集/预测框与GT框之间的并集。
IoU
算法是使用最广泛的算法,大部分的检测算法都是使用的这个算法。
这种损失会存在一些问题,具体的问题如下图所示,(1)如状态1所示,当预测框和GT框不相交时,即IOU=0,此时无法反映两个框之间的距离,此时该 损失函数不可导,即IOU_Loss无法优化两个框不相交的情况。(2)如状态2与状态3所示,当两个预测框大小相同时,那么这两个IOU也相同,IOU_Loss无法区分两者相交这种情况。
2、GIOU_Loss-Generalized IoU 为了解决以上的问题,GIOU损失应运而生。GIOU_Loss中增加了相交尺度的衡量方式,缓解了单纯IOU_Loss时存在的一些问题。
考虑到,当检测框和真实框没有出现重叠的时候IoU
的loss
都是一样的,因此GIoU
就加入了C
检测框(C
检测框是包含了检测框和真实框的最小矩形框),这样就可以解决检测框和真实框没有重叠的问题。但是当检测框和真实框之间出现包含的现象的时候GIoU
就和IoU loss
是同样的效果了。
但是这种方法并不能完全解决这种问题,仍然存在着其它的问题。具体的问题如下所示,状态1、2、3都是预测框在GT框内部且预测框大小一致的情况,这时预测框和GT框的差集都是相同的,因此这三种状态的GIOU值也都是相同的,这时GIOU退化成了IOU,无法区分相对位置关系。
3、DIOU_Loss-Distance IoU
DIoU
计算的不是框之间的交并,而是计算的每个检测框之间的欧氏距离,这样就可以解决GIoU
包含出现的问题。
好的目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比。
针对IOU和GIOU存在的问题,作者从两个方面进行考虑
一:如何最小化预测框和目标框之间的归一化距离?
二:如何在预测框和目标框重叠时,回归的更准确?
针对IOU和GIOU损失所存在的问题,DIOU为了解决如何最小化预测框和GT框之间的归一化距离这个问题,DIOU_Loss考虑了预测框与GT框的重叠面积和中心点距离,当GT框包裹预测框的时候,直接度量2个框的距离,因此DIOU_Loss的收敛速度更快一些。
是指predict box
和GT box
中心点的距离的平方,而c2是指刚好能包含predict box
和GT box
的最小box
的对角线长度平方。
如下图所示,当GT框包裹预测框时,此时预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同的。为了解决这个问题,CIOU_Loss应运而生。
4、CIOU_Loss-Complete IoU在DIOU_Loss的基础上增加了一个影响因子,将预测框和GT框的长宽比也考虑了进来。具体的计算方法如下式所示,即CIOU_Loss将GT框的重叠面积、中心点距离和长宽比全都考虑进来了。
CIOU
只是在DIOU
基础上增加了一项αv
其中v是衡量长宽比一致性的参数,我们也可以定义为:
再来综合的看下各个Loss函数的不同点:
IOU_Loss:主要考虑检测框和目标框重叠面积。
GIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。
DIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。
CIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。
Yolov4中采用了CIOU_Loss的回归方式,使得预测框回归的速度和精度更高一些
Nms主要用于预测框的筛选,常用的目标检测算法中,一般采用普通的nms的方式,
Yolov4则借鉴上面D/CIOU loss的论文:https://arxiv.org/pdf/1911.08287.pdf
将其中计算IOU的部分替换成DIOU的方式:
DIOU_NMS-如下图所示,对于重叠的摩托车检测任务而言,传统的NMS操作会遗漏掉一些中间的摩托车;由于DIOU_NMS考虑到边界框中心点的位置信息,因而得到了更准确的检测结果,适合处理密集场景下的目标检测问题。
在上图重叠的摩托车检测中,中间的摩托车因为考虑边界框中心点的位置信息,也可以回归出来。
因此在重叠目标的检测中,DIOU_nms的效果优于传统的nms。
注意:有读者会有疑问,这里为什么不用CIOU_nms,而用DIOU_nms?
答:因为前面讲到的CIOU_loss,是在DIOU_loss的基础上,添加的影响因子,包含groundtruth标注框的信息,在训练时用于回归。
但在测试过程中,并没有groundtruth的信息,不用考虑影响因子,因此直接用DIOU_nms即可
为了改进对象检测训练过程,CNN通常使用以下方法:
对于激活函数,PReLU和SELU难以训练,ReLU6是专门为量化网络设计,因此我们从候选列表中删除了这些激活函数。
对于正则化方法,DropBlock的作者已经和其他方法进行了比较,并且优于其他方法,因此我们直接选择DropBlock作为我们的正则化方法。
对于Normalization,我们专注于仅使用一个GPU的训练策略,因此不考虑syncBN。
除了下面已经提到的各种Tricks,为了使目标检测器更容易在单GPU上训练,作者也提出了5种改进方法:
Self-Adversarial Trainin
SAT
为一种新型数据增强方式。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对其自身进行一种对抗式的攻击,改变原始图像,制造图像上没有目标的假象。在第二阶段,训练神经网络对修改后的图像进行正常的目标检测.
Self-Adversarial Training
是在一定程度上抵抗对抗攻击的数据增强技术。CNN
计算出Loss
, 然后通过反向传播改变图片信息,形成图片上没有目标的假象,然后对修改后的图像进行正常的目标检测。需要注意的是在SAT的反向传播的过程中,是不需要改变网络权值的。 使用对抗生成可以改善学习的决策边界中的薄弱环节,提高模型的鲁棒性。因此这种数据增强方式被越来越多的对象检测框架运用。
BN
就是仅仅利用当前迭代时刻信息进行norm
,而CBN
在计算当前时刻统计量时候会考虑前k
个时刻统计量,从而实现扩大batch size
操作。同时作者指出CBN
操作不会引入比较大的内存开销,训练速度不会影响很多,但是训练时候会慢一些,比GN
还慢。
CmBN
是CBN
的改进版本,其把大batch
内部的4
个mini batch
当做一个整体,对外隔离。CBN
在第t
时刻,也会考虑前3
个时刻的统计量进行汇合,而CmBN
操作不会,不再滑动cross
,其仅仅在mini batch
内部进行汇合操作,保持BN
一个batch
更新一次可训练参数。
CmBN的全称是Cross mini-Batch Normalization,定义为跨小批量标准化(CmBN)。CmBN 是 CBN 的改进版本,它用来收集一个batch内多个mini-batch内的统计数据。BN、CBN和CmBN之间的区别具体如下图所示:
BN
:无论每个batch
被分割为多少个mini batch
,其算法就是在每个mini batch
前向传播后统计当前的BN数据(即每个神经元的期望和方差)并进行Nomalization
,BN
数据与其他mini batch
的数据无关。CBN
:每次iteration
中的BN
数据是其之前n
次数据和当前数据的和(对非当前batch
统计的数据进行了补偿再参与计算),用该累加值对当前的batch
进行Nomalization
。好处在于每个batch
可以设置较小的size
。CmBN
:只在每个Batch
内部使用CBN
的方法,个人理解如果每个Batch
被分割为一个mini batch
,则其效果与BN
一致;若分割为多个mini batch
,则与CBN
类似,只是把mini batch
当作batch
进行计算,其区别在于权重更新时间点不同,同一个batch
内权重参数一样,因此计算不需要进行补偿。
注意力机制在DL
设计中被广泛采用。在SAM
中,最大值池化和平均池化分别用于输入feature map
,创建两组feature map
。结果被输入到一个卷积层,接着是一个Sigmoid
函数来创建空间注意力。
在YOLOv4
中,使用修改后的SAM
而不应用最大值池化和平均池化。
作者在原SAM(Spatial Attention Module)方法上进行了修改,将SAM从空间注意修改为点注意。如下图所示,对于常规的SAM,最大值池化层和平均池化层分别作用于输入的feature map,得到两组shape相同的feature map,再将结果输入到一个卷积层,接着是一个 Sigmoid 函数来创建空间注意力。
将SAM(Spatial Attention Module)应用于输入特征,能够输出精细的特征图。
在YOLOv4中,对原来的SAM方法进行了修改。如下图所示,修改后的SAM直接使用一个卷积层作用于输入特征,得到输出特征,然后再使用一个Sigmoid 函数来创建注意力。作者认为,采用这种方式创建的是点注意力。
(5)修改过的PAN
作者对原PAN(Path Aggregation Network)方法进行了修改, 使用张量连接(concat)代替了原来的快捷连接(shortcut connection)。如下图所示:
注:想具体了解原PANet网络结构,可参考上文中的PANet介绍部分。
如下图所示,在COCO目标检测数据集上,对当前各种先进的目标检测器进行了测试。可以发现,YOLOv4的检测速度比EfficientDet快两倍,性能相当。同时,将YOLOv3的AP和FPS分别提高10%和12%,吊打YOLOv3!
综合以上分析,总结出YOLOv4带给我们的优点有:
代码地址:https://github.com/Tianxiaomo/pytorch-Yolov4
作者的训练和测试推理代码都已经完成
Yolov4作者Alexey的代码,俄罗斯的大神,应该是个独立研究员,更新算法的频繁程度令人佩服。
在Yolov3作者Joseph Redmon宣布停止更新Yolo算法之后,Alexey凭借对于Yolov3算法的不断探索研究,赢得了Yolov3作者的认可,发布了Yolov4。
代码地址:https://github.com/AlexeyAB/darknet
目前测试有效的有tensorflow版本:weights->pb->trt
代码地址:https://github.com/hunglc007/tensorflow-Yolov4-tflite
代码地址:https://github.com/wang-xinyu/tensorrtx/tree/master/Yolov4
作者自定义了mish激活函数的plugin层,Tensorrt加速后速度还是挺快的。
因为Yolov5的核心基础知识点也很多,可以查看大白的另一篇文章。
江大白:深入浅出Yolo系列之Yolov5核心基础知识完整讲解2004 赞同 · 379 评论文章正在上传…重新上传取消
大白使用人头数据集,对于Yolov5进行训练,并记录成超级详细的训练教程。
江大白:深入浅出Yolov5之自有数据集训练超详细教程27 赞同 · 0 评论文章正在上传…重新上传取消
旷视科技发布的Yolox有很多干货,可以查看大白的另一篇Yolox文章。
江大白:深入浅出Yolo系列之Yolox核心基础完整讲解565 赞同 · 166 评论文章正在上传…重新上传取消
对于Yolox,大白也使用人头数据集,对于Yolox进行训练,并记录成超级详细的训练教程。
江大白:深入浅出Yolox之自有数据集训练超详细教程141 赞同 · 50 评论文章正在上传…重新上传取消
人工智能行业,除了算法,数据是非常重要的金矿。
比如在目标检测项目中,需要检测人体,那我们就需要人体数据集。当需要检测车辆,就需要车辆数据集。
为了便于大家查找相关数据集,大白将梳理的所有的数据集进行汇总,便于大家对应查看。
(1)260+各类公开数据集
可以根据不同的需求,筛选出自己需要的数据集,在官网中进行下载。
数据集链接:点击查看
(2)数十个可下载数据集
大白将一些收集的数据集,以及购买的部分数据集,都放在百度网盘中,可以进行下载。
下载链接:点击查看
(3)花费过万购买的数据集
在从事AI行业的这三年中,大白零零散散,花费了一万多,购买了各类项目中所需要的数据集。
而且为了便于大家了解不同的数据集,算法功能、类别标签等详细信息,大白还制作了数据集管理文档,甚至在每行最后贴上了数据集图片,可以直接点击打开,查看是否自己需要的数据。
数据集管理文档清单链接:点击查看
数据集下载方式:点击查看
深入浅出Yolo系列之Yolov3&Yolov4&Yolov5&Yolox核心基础知识完整讲解 - 知乎
YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理)_不积跬步,无以至千里!-CSDN博客_yolov1到yolov4
YOLOv4算法详解_WZZ18191171661的博客-CSDN博客_yolov4算法
YOLOv4 介绍及其模型优化方法 - 知乎
目标检测算法YOLOv4详解 - 云+社区 - 腾讯云