上个月yolo v4重磅推出 了,最近有时间把论文读了一遍,后面找时间再把代码细看下,yolo v4综合了已有的物体检测和CNN各种trick,把yolo的检测精度和速度提了上去,该论文将物体检测领域各种trick都总结比较了一番,对于学习目的来说,好好读读该篇论文肯定也受益匪浅。
yolo v4的作者不再是Joe Redmon,而是另一位曾经参与yolo维护的大神Alexey Bochkovskiy和两名台湾的大学生,下面一起来看看yolo v4的论文!
论文连接:https://arxiv.org/abs/2004.10934
源码连接:https://github.com/AlexeyAB/darknet
目前源码作者还在持续更新中~
论文的主要工作是设计了一种快速的物体检测器,同时优化并行计算,使任何人只用一个传统的GPU就可以训练和测试,就可以获得一个实时、高质量、令人信服的检测结果。论文的主要贡献有以下三点:
1、设计的模型可以只使用1080 Ti或208 Ti GPU就能训练出相当快和精确的物体检测器。(但训练时间作者没有提)
2、在训练期间,验证了目前最先进的物体检测Bag of Freebies、Bag of Specials的影响,其中Bag of Freebies是指不增加推断代价,只通过改变训练策略或训练代价就可以使物体检测器获得更好的精度的方法。Bag of Specials是指通过添加插件模块或后处理等,在只少量增加推断代价的情况下可以显著提高物体检测精度的方法。
3、修改了目前神经网络最好的方法,使他们更高效更适合单GPU训练,包括CBN、PAN、SAM等。
目前物体检测的总体模型结构如下:
物体检测结构通常包含两部分,backbone骨架和头部,骨架通常采用预训练好的CNN网络,头部用来预测类别和bounding box框的位置。在GPU平台上运行的检测器,骨架一般是VGG、ResNet、ResNetXt或DenseNet,对于CPU平台运行的检测器,骨架一般是SqueezeNet、MobileNet或ShuffleNet。
上面提到的一大堆网络性能SqueezeNet、MobileNet、ShuffleNet是在VGG、ResNet、ResNetXt、DenseNet之后出现的网络,而且SqueezeNet、MobileNet或ShuffleNet的性能不见得比VGG等网络差,通过下面笔者从网上找的几张图可以对他们之间的性能有个大概的了解。
接着说论文部分:物体检测器的头部,一般分为两种,one-state和two-stage,one-state是指用一个阶段就完成bounding box推荐和得到分类结果,two-stage是两个阶段,第一阶段产生区域推荐bounding box,第二阶段根据第一阶段的结果给出分类的类别和概率。
最有代表性的two-stage是R-CNN系列,包括fast R-CNN, faster R-CNN, R-FCN和Libra R-CNN。 也可以把two-stage的检测器做成anchor free物体检测器,例如RepPoints。
对于one-state模式,最有代表性的是YOLO、SSD、RetinaNet,近些年,one-state模式的anchor free物体检测器也已经被设计出来,包括CenterNet、CornerNet、FCOS等。
物体检测器发展至今,模型结构上,在骨架和头部中间经常会插入一些用于搜集不同feature maps状态的层,这些层被称为neck(脖子)。neck通常由一些bottom-up和top-down路径组成,包含neck的网络有FPN,PAN、BiFPN、and NAS-FPN等。
除了上面提到的模型,一些研究者关注于建立新的骨架(DetNet,
DetNAS),或者搭建整个物体检测的模型(SpineNet、HitDetector)。
总结下来,物体检测包括以下结构:
输入: image, Patches, Image Pyramid
骨架: VGG16, ResNet-50, SpineNet, EfficientNet-B0/B7, CSPResNeXt50
CSPDarknet53
• Neck:
添加模块: SPP, ASPP, RFB, SAM
路径集成模块: FPN, PAN,NAS-FPN, Fully-connected FPN, BiFPN, ASFF, SFAM
•头部::
密集预测(one-stage):
RPN, SSD, YOLO, RetinaNet(基于anchor 的)
CornerNet, CenterNet, MatrixNet,FCOS(anchor free的)
稀疏预测 (two-stage):
Faster R-CNN, R-FCN, Mask RCNN (基于anchor 的)
RepPoints(anchor free的)
总的来看,这部分作者把物体检测的现状都总结了一遍,对于想深入了解物体检测各种方法的童鞋,按照作者的介绍顺序来学习还是挺不错的。
下面分别介绍Bag of Freebies和Bag of Specials的策略。
这部分介绍目前不增加推断代价,只通过改变训练策略或训练代价就可以使物体检测器获得更好的精度的各种方法。
最常用的Bag of Freebies方法就是数据增强,数据增强的目的是增加输入图像的变化,使模型健壮性更好,例如光学畸变(亮度、对比度、色调、饱和度、图像噪音)和几何畸变(缩放、裁剪、翻转、旋转)是常见的两种数据增强方法。这些数据增强方法都是逐像素调整,原始像素信息在调整区域没有变,此外,一些研究人员重点研究物体遮挡的情况,例如,随机擦除或者裁剪掉图像的一部分,然后用另一个图像或者0填充该部分,还有研究者对输入图像做类似feature map的DropOut、DropConnect、DropBlock动作,也就是随机从输入图像中抠掉一些矩形然后填充0。还有一些研究者推荐将多个图像一起做数据增强,例如MixUp将两张图像相乘,然后按照一定比例叠加,然后根据比例调整标签,CutMix是将裁掉部分的图像用另一个图像覆盖,然后根据面积调整标签,除此之外,style transfer GAN 也被用于图像增强,此方法可有效降低CNN网络在纹理方面的过拟合。
与以上提出的各种方法不同,其他一些Bag of Freebies方法致力于解决数据集中的语义分布可能存在偏差的问题,其中一个问题是数据集中不同标签类别的图像比例不均的问题,这个问题通常通过硬性挖掘反向例子解决,但是这种方法不适用于one-stage物体检测器,因为one-stage是密集预测结构,因此有人提出了focal loss来解决物体检测数据类别不均衡问题(具体怎么解决的笔者也不清楚,后续找来论文瞧瞧~)。
另一个重要的问题是采用one-hot方式标志类别的方法无法表达不同类别间类别关系的程度。一种解决方法是采用软标签代替硬标签,为了获得更好的软标签,Islam等人引入知识蒸馏的概念设计标签细化网络。
最后一种Bag of Freebies方法是Bounding Box回归的目标函数,传统方法通常使用MSE来直接回归中心点坐标和box的高和宽,或者左上角和右下角的坐标,对于 anchor-based的方法,目标函数是估计响应的偏移,然而直接估计每个点的坐标值,相当于把这些点当成了独立的变量,实际上他们应该是一个整体才对,为了解决这个问题,一些研究者提出了用iou(重叠度)作为目标的loss,因为iou对缩放是保持不变的,这样解决了传统方法当目标物体缩放时坐标点loss无法精确按比例变化的问题。近年来,在iou基础上又有新的idea,GIoU损失除了包含覆盖面积,还包含了物体的形状和方向,同时发现了做小面积的BBOX可以同时覆盖预测的BBOX和ground truth BBOX,因此在计算IOU的时候,分母可以采用这个BBOX。还有一种DIoU,它额外添加了物体中心的距离到loss中。还有一种CioU,同时考虑覆盖面积、中心距离和纵横比。CioU在BBOX回归问题上可以获得更好的卷积速度和精度。
这部分介绍Bag of specials方法,也就是通过添加插件模块或后处理等,在只少量增加推断代价的情况下可以显著提高物体检测精度的方法。
通常来讲,Bag of specials插件模块用来加强模块的一些属性,例如增大感受野、引入注意力机制、增强feature整合能力等。后处理是筛选模型预测结果的一种方法。可以用来增大感受野的模块有SPP、ASPP、RFB,SPP来自SPM(空间金字塔匹配),SPM原始方法是分割feature map为一些相等的dxd模块,其中d可以是{1; 2; 3;…},这样来形成空间金字塔,然后提取bag-of-word属性。SPP集成SPM到CNN中,使用最大池化操作代替bag-of-word操作,因为SPP模块输出是一维的特征向量,因此无法直接应用到全卷积网络(FCN),因此在YOLOv3的设计中,Redmon和Farhadi改进SPP模块为核大小kxk的最大池化模块的级联,其中k为{1; 5; 9; 13},池化步幅为1,在此种设计下,一个相对大的kxk的最大池化模块有效的增加了骨架的感受野,YOLOv3-608在MS COCO物体检测上以增加0.5%计算量的代价,将AP50提高了2.7%。
ASPP于SPP的区别在于kxk核的大小,最大池化步幅1到3x3的核大小,膨胀比例为k,膨胀卷积操作中步幅为k。
RFB模块是使用一些kxk的膨胀卷积核,膨胀比例为k,步幅为1,以达到更全面的空间覆盖,RFB增加了7% 的推断代价,在MS COCO数据集上比SSD的AP50高出5.7%。
在物体检测中经常使用的注意力模块通常分为两种,一种是通道级别的注意力,另一种是点级别的注意力,代表性的模型分别是Squeeze-and-Excitation (SE)和Spatial Attention Module (SAM),尽管SE模块在ImageNet图像分类任务中可以通过2%的计算代价提高ResNet50的TOP-1准确率1%,但在GPU实现中,它通常会增加10%的推断时间!因此SE通常适用于移动设备中;但是对于SAM来说,只需要花0.1%的额外计算,就可以提高 ResNet50-SE TOP-1 0.5%的准确率,最好的是,它根本不影响GPU的推断速度。
关于feature整合,早期的方法是跨连接或hyper-column(超列)来整合低层级的物理feature到到高层级的语义feature,因为像FPN这种多scale预测方法现在比较受欢迎,这种类别的模型包括SFAM、ASFF、BiFPN等, SFAM的主要思想是使用SE模块在多级别级联feature maps执行通道级别的权重重分配。对于ASFF,它使用softmax进行点级别权重重分配,然后把不同级别的feature maps相加;在BiFPN中,多输入权重残差连接被用来 scale-wise级别权重重分配,然后把不同scale的权重相加。
这里说明下超列的概念,一个像素的超列定义为所有 cnn 单元对应该像素位置的激活输出值组成的向量,直观地看如图:
简单说明下FPN网络,FPN网络与普通网络自下向上生成feature map不同,它同时有个自上向下的过程,将上层的网络逐步上采样与相应自下向上的层级进行融合,然后每一个自上向下层的输出都作为feature map进行位置估计,然后将各个层的结果综合到一起作为最终的输出,如下图的d,FPN主要解决的是物体检测中的多尺度问题。
在深度学习的研究中,一些人重点研究如何获得更好的激活函数,一个好的激活函数可以使梯度传播更高效,同时不会产生太大的额外计算代价,在2010年,Nair和Hinton推荐使用RELU来解决梯度消失问题,后续据此出现一系列激活函数LReLU、PReLU、ReLU6、SELU、Swish、hard-Swish、Mish等,LReLU和PReLU的主要目的是解决输出为负值时,RELU的输出为0的问题,对于ReLU6和hard-Swish, 他们主要为量化网络设计(此处说明一下,量化网络是指有的设备采用半精度浮点float16作为推断网络的数据类型,此时,如果不对RELU的输出的大值加以限制(ReLU6限制最大输出为6),则float16 将无法精确的标识RELU的输出),SELU 用于神经网络的自归一化。需要注意的是 Swish和Mish是连续可微的激活函数。
在基于深度学习的物体检测中通常使用的后处理方法是NMS(非极大抑制),该方法可以用来过滤对同一目标预测不好的BBOX,只保留响应最高的BBOX为结果,NMS尝试改进的方法和优化目标函数的方法是一致的,NMS原始方法没有考虑内容信息,因此Girshick等人在R-CNN的目标函数中增加了类别置信度,然后根据置信度分数的顺序进行NMS。对于一种软NMS方法,它考虑了物体遮挡可能导致置信分下降的问题(相对于采用IOU的贪婪NMS),DIoU NMS开发者的思路是在软NMS的基础上,在BBox筛选过程中加入中心点距离信息。值得提醒的是,因为上面的后处理方法直接参照抓取的图像的feature map,使得在后面的anchor free不再需要后处理方法。
我们的根本目的是实现生产系统中神经网络的快速操作速度和优化并行计算,而不是低计算量的理论指标,我们提供了两个实时神经系统选择:
对于GPU我们使用层数少的网络(1~8组,每一组指由若干卷积层等组成的一个单元):CSPResNeXt50 / CSPDarknet53
对于VPU,我们使用分组卷积(将1个卷积分成多个部分由多个硬件同时运行以加快速度),但是我们不使用SE模块,尤其是EfficientNet-lite、MixNet、GhostNet、MobileNetV3这些包含SE的模块。
我们的目标是寻找输入网络分辨率、卷积层数、参数数量、层输出数量(应该是指channel数量)四者间的平衡。
(如何是最佳平衡论文后面没有说?作者有没有修改过卷积层数也不清楚)
例如我们的大量研究阐明CSPResNext50网络在ILSVRC2012物体分类中的成绩比CSPDarknet53好不少,然而,相反的,CSPDarknet53在MS COCO的物体检测中效果比CSPResNext50好。
我们的下一个目标是选择额外的blocks用于增大感受野和最好的参数集成方法(从骨架的不同层集成信息以供检测器的某一层提取):例如FPN、PAN、ASFF、BiFPN。
FPN前面提过了,PAN和ASFF都是基于FPN提出的特征融合方式,因为FPN是直接将不同层的特征融合,而不同层特征不同,直接融合会丢失有价值的层信息。
下面说一下ASFF,ASFF是2019年的论文提出,如上图是ASFF提出的特征融合方式,其特点是不同层的最终输出不是由所有层的feature map直接相加而来,而是针对某一层的输出,其他层都有都有相应的层权重,以上图ASFF-3为例,它由level1、level2、level3共同得到,如果是在FPN中,则ASFF-3=level1+level2+level3,在ASFF中,ASFF-3=a1level1+a2level2+a3*level3,其中a1、a2、a3是针对ASFF-3训练出的level1、level2、level3层的权重。
BiFPN是EfficentDET论文中提出的一种加权双向金字塔网络,其相对于ASFF增加了一条自底向上的边和一条横向跨连的边(ASFF和BiFPN都是2019年提出的),
适合分类器的模型不一定适合检测器,适合于检测器的不一定适合于分类器,检测器通常需要以下特性:
更高分辨率的输入图像-为了能检测到大量的小物体
更多的层-更大的感受野以覆盖更大的输入图像
更多的参数-为了增大在单张图像中检测多种大小不同物体的能力
假设性的说哦我们可以认为一个有更大感受野和更大参数数量的模型应该被作为骨架,表1显示了CSPResNeXt50, CSPDarknet53,和 EfficientNet B3的信息,CSPResNeXt50包含16个卷积层(33卷积核、425425的感受野、20.6M的参数),CSPDarknet53包含29个卷积层(33卷积核,725725感受野、27.6M参数)。理论猜想加上我们大量的实验分析,CSPDarknet53神经网络在二者中是更合适的检测器骨架。
此处,简单提下感受野,通俗的讲,感受野就是输出特征图上一个点对应输入图像区域大小。
接着说论文部分,感受野的大小影响总结有以下三点:
1、达到了物体的大小-可以看到整体物体;
2、达到了输入图像的大小-可以看到物体周围的信息;
3、超过输入图像的大小-增加了输入图像上的点与最终输出激活间的连接数量;
我们在CSPDarknet53的后面增加了SPP模块,因为它显著的提高了感受野,分离出大多数显著的背景信息,而且几乎没有影响网络的速度。我们使用PANet作为参数集成的方法(替换掉YOLO V3的FPN)
最终,我们选择CSPDarknet53作为骨架,SPP为添加模块,PANet为路径集成的NECK,和YOLO V3的头部,作为YOLO V4的框架。
未来,我们打算大量的扩展用于检测器的BoF内容,因为这理论上可以说明一些问题增加检测器的精度,然后再以实验的方式检验每个特性的影响。
我们不使用跨GPU(多GPU)同步批归一化方法(CGBN、SyncBN)和其他昂贵的设备,这使得任何人都可以在传统的GPU(例如GPU 1081 Ti、RTX 2080 Ti)上复现我们的成果。
为了改善物体检测的训练,CNN网络通常使用下面这些:
激活函数:ReLU, leaky-ReLU, parametric-ReLU,ReLU6, SELU, Swish, Mish
BBOX回归损失:MSE, IoU, GIoU,CIoU, DIoU
数据增强:CutOut, MixUp, CutMix
正则化方法:DropOut, DropPath,Spatial DropOut, DropBlock
网络激活的归一化(通过均值和方差):批处理归一化(BN),跨GPU批处理归一化(CGBN、SyncBN),滤波器响应归一化(FRN),交叉迭代归一化(CBN)
跨连:残差连接、带权重的残差连接、多输入带权重的残差连接、交叉部分连接(CSP)
对于训练的激活函数,由于PReLU和SELU更难训练,ReLU6是特别为量化网络设计(半精度浮点),因此把他们从激活函数的候选列表移除。
对于正则化(原文reqularization应该是打错了),设计出DropBlock的人已经详细的与其他方法比较了,结果是DropBlock的正则化方法好很多,因此毫不犹豫的选择了DropBlock作为正则化方法。
对于归一化方法的选择,因为我们注重只使用一个GPU的策略,因此,跨GPU批处理归一化不被考虑。
此处是作者的新贡献了,之前的都是整合分析已有的方法
为了使设计的检测器更适合单GPU,做了额外的设计和改进:
1、采用了一个新的数据增强方法:马赛克(Mosaic)和自对抗训练(SAT)
2、应用遗传算法时,我们选择了最优的超参数
3、修改了一些现存的方法使我们的设计对训练和检测更有效率,修改的SAM、修改的PAN、交叉迷你批归一化(CmBN)。
马赛克代表了一种新的数据增强方法,它混合4个训练图像,而现存的CutMix方法只混合了两张输入图像(吐槽:后面并没有说4张比2张好在哪,有没有什么缺点,要是这样笔者是不是也可以发明一个混合8张图的新方法?。。。),马赛克使检测的物体和正常的不一样,除此之外,批归一化使用4张不同的图计算每一层激活函数,这显著的降低了大尺度的mini batch需求**(也就是说因为输入是4张图拼接的,那么网络中间层的feature也当成是4个拼接的)。*
自对抗训练(SAT)也代表了一个新的数据增强方法,它工作在两个阶段-前向和后向,在第一个阶段神经网络改变原始图像而不是网络的权重,神经网络执行这样的自对抗-改变原始图像来产生欺骗检测网络的的图像,使网络认为没有期待的物体,在第二阶段,神经网络被训练来检测被修改的图片(相当于前面加了个GNN??)
CmBN代表CBN的修改版本,如图4,CmBN与CBN的差别是它只搜集同一batch内的数据,而CBN是循环的还搜集相邻batch的数据.
这里对图4说明下,有的人可能看不太明白(笔者刚开始没看明白~)图4是假设一个batch包含4个mini batch,也就是t_3、t_2,t_1四部分。从图中可以看出的BN、CBN、CmBN的差别是,CBN的归一化和Bias、Scale是使用当前时刻和之前3个mini batch的数据一起计算,如果mini batch是batch的第一个,则会取上一个batch的数据,而BN的归一化和BiAS、Scale只使用当前时刻的mini batch,CmBN是使用当前时刻和一个batch内的前面mini batch数据一起计算。
此处笔者也有一个疑问没有解决,图4中的更新W的时间没明白,按理说,不都是应该每个mini batch更新一次W吗,但图4中BN和CmBN都只在最后一个mini batch更新权重。
下面接着说论文部分:
我们修改了SAM的空间注意力机制(将尺寸为CHW的feature map分成HW个值,每个值由C个通道的C个值得到)改为点注意力机制(将尺寸为CHW的feature map映射为CHW个值),然后替代PAN的直连为级联,如图5、6所示。
在这部分我们详尽说明YOLO V4的细节。
骨架:CSPDarknet53
Neck:SPP、PAN
头部:YOLO V3
YOLO V4使用:
骨架中包含的BoF:CutMix、马赛克数据增强,DropBlock正则化,类标签平滑
骨架中包含的BoS:Mish激活函数,CSP,多输入权重残差连接(MiWRC)
检测器中包含的BoF:CioU损失,CmBN,DropBlock正则化,马赛克数据增强,自对抗,消除grid敏感度,对于一个ground truth使用多个anchor,cosine退火算法,优化超参数,训练随机输入图像尺寸。
检测器中包含的BoS:Mish激活函数,SPP模块,SAM模块,PAN路径集成模块,DioU-NMS
我们测试了不同的训练改善方法对ImageNet ILSVRC2012 val数据集的分类精度影响,然后用MS COCO(test-dev 2017)数据集测试了对检测器精度的影响。
在ImageNet图像分类实验中,默认的超参数如下:训练step一共8000000步,batch和mini batch的尺寸分别是128和32(此处的batch和mini batch的关系和图4对应,一个batch包含4个mini batch)
学习率衰减策略是:初始学习率0.1,热身为1000个step,momentum和权重衰减被别为0.9和0.005,我们所有的BoS实验使用同样的默认超参数,在BoF实验中,我们额外添加了50%的训练step。
在BoF实验中,我们验证了MixUP、CutUP、Mosaic马赛克、Bluring模糊数据增强方法,还有标签平滑正则化方法。
在BoS实验中,我们比较了LRelu、Swish、Mish三个激活函数的影响,所有的实验都是使用1080 Ti或2080 Ti的GPU实现。
在MS COCO物体检测实验中,默认的超参数如下:训练step一共500500步,初始学习率0.01,在400000步和450000步的时候学习率分别乘以0.1,momentum和权重衰减分别是0.9和0.0005.所有结构使用一个GPU执行多scale训练,batch大小为64,mini batch大小为8或4取决于结构和GPU内存。除了用于探索超参数实验的遗传算法,其他实验都是使用默认值。遗传算法使用YOLO V3-SPP来训练GioU,采用5k(此处理解有可能不对?)大小的样本跑300个epochs。我们采取了遗传算法探索到的实验参数:学习率0.00261,momentum 0.949,IoU阈值0.213,损失归一化值0.07.
我们验证了很多的BoF,包括grid敏感消除,马赛克数据增强,IoU阈值,遗传算法,类标签平滑,CmBN,自对抗训练,cosine退火算法,动态mini batch大小,DropBlock,优化的anchors,不同种类的IoU损失。
我们也验证了各种BoS实验,包括Mish,SPP,SAM,RFB,BiFPN,GaussianYOLO。
所有的实验我们只使用一个GPU训练,因此需要很多GPU的例如sync BN没有被使用。
上面说的这些实验下面有没有介绍一起来看看,还有一个问题,作者一直说使用单GPU训练,但是没有提使用单GPU训练的时间,一般训练时很耗时间的,尤其时单GPU情况下。
首先研究了不同特性在分类上的影响,特别是类标签平滑,不同的数据增强方法,双边模糊,MixUp,CutMix,Mosaic,如下图7,还研究了不同激活函数的影响,例如Leaky-ReLU、Swish、Mish
在实验中,如表2,分类的准确度通过以下方法被提高:CutMix,Mosaic数据增强,类标签平滑,Mish。
结果是BoF分类训练的骨架包括:CutMix,Mosaic数据增强,类标签平滑,此外使用Mish激活函数作为补充选项,如表2、3所示。
更进一步的研究关注BoF对检测器训练精度的影响,如表4,我们通过研究不同的特性显著的扩展了BoF的列表,找到不影响FPS但能提高准确率的以下特性:
S:消除grid敏感度-用于YOLO V3评价物体坐标的方程 bx = σ(tx)+
cx; by = σ(ty)+ cy, 其中cx和xy一直是整数,因此,要想bx接近等于cx或cx+1,需要tx的绝对值很大,我们通过给sigmoid乘以一个大于1.0的系数解决了这个影响,因此消除了框对应在grid时无法检测到物体的情况,
(这块儿说的啥意思?我们知道,sigmoid函数σ在输入越高时,输出值越趋近于饱和值1,但要想等于1则需要输入值很高,如下图sigmoid曲线可知,因此,当物体的坐标bx恰好等于cx或cx+1是时候,需要σ(tx)等于1或0,而此时需要tx的绝对值很大才行,因此YOLO V3的坐标回归函数有个问题就是当bx或by的真实坐标恰好落在grid处时,σ(tx)+cx无法准确逼近bx,按照作者的说法无法识别,笔者觉得或许时框不到这个尺寸,也就是无法准确框起,并不是识别不到)
M:马赛克增强,采用4张图片的马赛克代替单张图片
IT:IoU阈值,每一个ground truth使用多个anchors,使IoU(truth,anchor)>IoU_threshold
GA:遗传算法-使用遗传算法在训练期间的10%时间内选择出最优的超参数,
LS:类标签平滑-使用类标签平滑sigmoid激活函数
CBN:CmBN-使用CmBN所及一个batch内的数据,替代只在mini batch内搜集数据
CA:余弦退火算法,在sinusoid训练过程中改变学习率
DM:动态mini batch大小-训练时使用随机的输入形状,因此当输入图像变小时自动增加mini batch尺寸
OA:优化的anchors-使用优化的anchors训练512*512输入图像
GIoU, CIoU, DIoU, MSE -使用不同的bounded box回归损失函数
进一步的研究关注BoSnia对检测器训练精度的影响,包括PAN,RFB,SAM,Gaussian YOLO (G), ASFF,如表5所示,在我们的实验中,当使用SPP、PAN、SAM时检测器获得了最好的性能。
进一步我们研究了不同的骨架结构对检测器精度的影响,表6所示,我们注意到分类精度最好的模型不总是使检测器达到最好的精确。
首先,尽管CSPResNeXt-50加上其他属性的训练分类精度高于CSPDarknet53模型,CSPDarknet53模型在物体检测中显示出更高的精度。
其次,使用BoF和Mish的CSPResNeXt-50增加了分类训练的精度,但是这些预训练权重的进一步应用于物体检测器却降低了精度。然后,使用BoF和Mish的CSPDarknet53的分类训练精度有提高,同时预训练权重应用于物体检测也提高了精度。结论使CSPDarknet53比CSPResNeXt-50更适合于检测器。
我们观察到,CSPDarknet53模型因为各种改进显示了更强的提高检测器精度的能力。
最后,我们分析了minibatch大小不同训练出的模型的差别,表7所示,通过增加BoF,BoSnia训练策略,mini batch大小对检测器的性能没有影响,这个结果显示了,引入BoF和Bos后,没必要使用很多昂贵的GPU训练,换句话说,任何人只使用一个传统的GPU就可以训练一个出色的检测器。
图8是与目前最先进的物体检测器的比较结果,YOLO V4位于pareto最优曲线上,和其他快和精度高的检测器相比,YOLO V4在速度和精度上是更好的。因为GPU结构不一样,使用GPU验证推断时间的方法不一样,在Maxwell、Pascal、Volta架构的GPU上使用YOLO V4模型,然后与其他目前最好的模型比较。
表8列出了使用Maxwell GPU的帧率比较结果,GPU型号可以是GTX Titan X (Maxwell)或Tesla M40 GPU。
表9列出了使用Pascal GPU的帧率比较结果,GPU型号可以是Titan X (Pascal),Titan Xp, GTX 1080 Ti, 或Tesla P100 GPU。
表10列出了使用VoltaGPU的帧率比较结果,GPU型号可以是Titan Volta 或Tesla V100 GPU。
各种型号的GPU都对比了,作者还是很严谨的
我们提供了一个目前性能最好的检测器(更快的FPS,更准确MS COCO AP50…95和AP50),该检测器可以使用带有8-16GB GPU显存的单GPU训练,这个特性使该模块可以广泛应用,
原始的基于anchor的one-state检测器已经证明了它的强大能力,我们验证了很多特性,然后从他们中选取用于提高分类器和检测器的精度,这些特性可以作为后续学习和研究的最佳实践特性。
好了,就这些了,下面抓紧时间看YOLO V4的代码,然后再和大家分享。