YOLOv4详细解释

        因为YOLOv4涉及到的东西有点多,所以单独拿出来说。本文结合YOLOv4的原论文翻译来进行讲解,其中涉及到技术本文也会给出一定的解释。


目标检测模型

        现代探测器通常由两部分组成,一个是在ImageNet上预先训练的主干,另一个是用于预测物体的类和边界框的头部。

(1)主干backbone: 特征提取网络,其作用是提取图片当中的特征信息。

常用的主干网络有:

  • 提取能力强:VGG、ResNet(ResNet18,50,100)、ResNeXt、DenseNet、SqueezeNet、Darknet(Darknet19,53)、DetNet、DetNASSpineNet、EfficientNet(EfficientNet-B0/B7)、CSPResNeXt50、CSPDarknet53等。
  • 轻量:MobileNet、GhostNet、VoVNet、ShuffleNet、ThunderNet等。

(2)颈部neck:在主干和头部之间插入一系列混合和组合图像特征的网络层,把Backbone提取的特征进行融合并将图像特征传递到预测层。

常用的Neck主要有:

  • Additional blocks():SPP、ASPP、RFB、SAMP
  • ath-aggregation blocks(路径聚合):FPN、PAN、NAS-FPN、Fully-connected FPN、BiFPN、ASFF、SFAM、NAS-FPN

(3)头部head: 中文翻译为头部。在目标检测网络中一般叫做检测头。对图像特征进行预测,生成边界框(定位)和并预测类别。

常用的Head主要有:

  • Dense Prediction (one-stage):RPN、SSD、YOLO、RetinaNet(anchor based)、CornerNet、CenterNet、MatrixNet、FCOS(anchor free)
  • Sparse Prediction (two-stage):Faster R-CNN、R-FCN、Mask RCNN (anchor based)、RepPoints(anchor free)

        总结 

        一个目标检测网络的组成可以由一个公式来描述Detector = Backbone + Neck + Head


YOLOv4网络结构

        YOLOv4 = CSPDarknet53(主干) + SPP附加模块(颈) + PANet路径聚合(颈) + YOLOv3(头部),如下图。

        本文将根据网络结构的顺序来对YOLOv4里的改进来进行讲解。 


        input(输入)

        数据增强 

为什么要数据增强?

        数据增强的目的是为了增加输入图像的可变性,从而使所设计的目标检测模型对在不同环境下获得的图像具有更高的稳定性。

具体做法

        调整图像的亮度、对比度、色调、饱和度和噪声,添加了随机缩放、裁剪、翻转和旋转

        补充:数据增强

        cutout

        通过下面两个图可以看出,对于没有裁剪的图片,模型特别依赖狗的头来做预测,当我们想准确地识别一只头藏在灌木丛后面的狗,这就有问题了。图像的裁剪(随机,且被裁剪部分补0)迫使模型学会基于大量健壮的特征去解物体的样子,而不只是学习物体的单个部分。

        Mixup

        随机选择两张图像,按比例混合生成新的图像,分类的结果按比例分配。通过将特征信息在样本空间中进行混合,从而产生具有更多样性和泛化能力的训练样本。

         CutMix

         基于cutout和mixup的思想,cutmix的操作是:对两个图片做操作,随机生成一个裁剪框Box,裁剪掉A图的相应位置,然后用B图片相应位置的ROI(感兴趣区域)放到A图中被裁剪的区域形成新的样本。

        通过下图对比,在不同的训练集上,CutMix展现出来的效果都是很好的。

        


        ①数据增强-马赛克(Mosaic)

        Mosaic是YOLOv4中引入的第一个新的数据增强技术。是基于CutMix进行的改进,不同与CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放、随机裁剪、随机排布的方式进行拼接。

这样做有什么好处?

(1)丰富数据集: 随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标(小于32×32个像素点),让网络的鲁棒性更好。

(2)batch不需要很大: Mosaic增强训练时,可以直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果。

        关于小目标检查的补充:

        通过缩放图片,使其在新生成的图片变成小目标(人物像素变小),使模型可以学习到更多关于小目标的特征,在预测的时候对于一张图片的小目标预测也会有很大的帮助。


        ②类标签平滑(Label Smoothing) 

        假设我们的分类只有两个,一个是猫一个不是猫,分别用1和0表示。Label Smoothing的工作原理是对原来的[0 1]这种标注做一个改动,假设我们给定Label Smoothing的平滑参数为0.1 :

        这实际上是一种正则化策略,减少了真实样本标签的类别在计算损失函数时的权重,最终起到抑制过拟合的效果。 

为什么需要类标签平滑?

        传统编码标签的网络学习过程中,鼓励模型预测为目标类别的概率趋近1,非目标类别的概率趋近0,即最终预测的logits向量(logits向量经过softmax后输出的就是预测的所有类别的概率分布)中目标类别 zi 的值会趋于无穷大,使得模型向预测正确与错误标签的logit差值无限增大的方向学习,而过大的logit差值会使模型缺乏适应性,对它的预测过于自信。在训练数据不足以覆盖所有情况下,这就会导致网络过拟合,泛化能力差。


        ③自对抗训练(SAT) 

         自对抗训练(Self-Adversarial Training,简称SAT)是一种新型的数据增强技术,旨在通过神经网络自身进行的对抗式攻击来提高模型的鲁棒性(稳定性)和泛化能力。其主要分为两个阶段:

        第一阶段神经网络会对其原始图像进行修改(通过对抗训练产生对抗样本),制造出图像上没有目标的假象。(即原来图像的目标是熊猫,现在是图像上找不到熊猫)

        第二阶段训练神经网络对修改后的图像进行正常的目标检测。

什么是对抗样本?

        在原图像中增加扰动噪声生成会使机器学习的算法产生误判的样本。如下图,原来判断为熊猫,在添加噪声后使算法误判为长臂猿。

什么是对抗训练?

        在训练时将对抗样本加入训练集一起训练,即为对抗训练,进行对抗训练能扩充训练集的可能性,使得数据集逼近我们想要的数据分布,训练后的模型鲁棒性和泛化性能可以得到大大增强。


        ④交叉小批归一化(CmBN)    

  • batch:指代与 BN 层的统计量,也就是图片样本数。
  • mini-batch:由于整个 batch 独立计算时,受到资源限制可能不现实,于是需要将 batch 拆分成数个 mini-batch,每个 mini-batch 单独计算后汇总得到整个 batch 的统计量。从而归一化特征。
存在的问题

BN

        BN层的提出是为了解决这个梯度传播的问题,通过对每一层每一批次的输入数据进行归一化处理,使得它们的均值接近0,方差接近1,这样做的好处是可以使得每一层的输入数据都具有相似的分布特性,从而使得网络的参数更新更加稳定。

为什么BN能够解决梯度消失和梯度爆炸问题?

这是因为BN通过对每一层的输出进行归一化处理,使得每一层的输入数据都具有相似的分布特性。这样,在反向传播的过程中,我们可以求出每个数据对应的梯度。由于新的数据的分布特性更好,所以每个数据的梯度都不会消失或爆炸。

 

CBN

        BN存在的问题:batch_size比较小时候,BN在维度统计不准确,导致准确率下降。

        针对这个问题CBN的解决办法:希望从时间维度尝试解决这个问题,利用当前和先前迭代的均值和方差。CBN认为batch_size太小,本质上还是数据太少不足以近似整个训练集的BN参数,那就通过计算前几个iteration计算好的BN参数(μ 和σ ),一起来计算这次iter的BN参数。

        第一步:使用泰勒公式去拟合前几次的BN参数(因为每一层的卷积大小不同,所以BN参数也会不同,不能直接使用) 

        第二步:累加t层到t-3层的BN参数求平均值,利用得到的平均值来对第t层进行归一化

         整体大致过程如下:

 

CmBN

        CBN的问题:过去的 BN 参数是由过去的网络参数计算出来的特征而得到的,而本轮迭代中计算 BN 时,它们的模型参数其实已经过时了,对整个模型的效果可能还是会有所不佳。

        CmBN思想:将batch分成mini-batch只在每个Batch内部使用CBN的方法,同一个batch内权重参数一样,因此计算不需要进行补偿。(与CBN类似,但是只是在单独一层内部进行)


        backbone(主干)

        终于来到了我们的主干部分,先让我们回忆一下主干部分的网络结构。

 

        CSPDarknet53 

        CSPNet的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时,可以保证准确率。

        过程:将数据划分成Part 1和Part 2两部分,Part 2通过dense block发送副本到下一个阶段,接着将两个分支的信息在通道方向进行Concat拼接,最后再通过Transition层进一步融合。(可以理解为Part2进行了计算 ,Part1不计算,最后Concat两部分的结果。)

        在了解了CSPNet结构后,我们来看看它是怎么添加到YOLOv4的网络结构中的,在前面的YOLOv3中,我们已经了解了Darknet53的结构,它是由一系列残差结构组成。进行结合后,CSPnet的主要工作就是将原来的残差块的堆叠进行拆分,把它拆分成左右两部分:主干部分继续堆叠原来的残差块,支路部分则相当于一个残差边,经过少量处理直接连接到最后。具体结构如下:(右下角为Darknet53的结构,放上来方便对比

为什么要采用CSP模块呢?

        CSPNet主要从网络结构设计的角度解决推理中计算量很大的问题。CSPNet的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时,可以保证准确率。

        YOLOv4在主干网络Backbone采用CSPDarknet53网络结构,主要有三个方面的有点:

  • 优点一:增强CNN的学习能力,使得在轻量化的同时保持准确性。
  • 优点二:降低计算瓶颈
  • 优点三:降低内存成本

        MIsh激活函数

        使用MIsh激活函数代替了原来的Leaky ReLU,在YOLOv3中,每个卷积层之后包含一个批量归一化层和一个Leaky ReLU。而在YOLOv4的主干网络CSPDarknet53中,使用Mish代替了原来的Leaky ReLU。Leaky ReLU和Mish激活函数的公式与图像如下:

为什么改用Mish激活函数?

        在YOLOv4中使用Mish函数的原因是它的低成本和它的平滑、非单调、上无界、有下界等特点,与其他常用函数如ReLU和Swish相比,提高了它的性能。

为什么mish更好?      

        1、以无上边界(即正值可以达到任何的值),避免了由于封顶而导致的饱和,理论上对负值轻微允许,允许更好得梯度流,而不是想ReLU那样的硬零边界。

        2、Mish函数在不同区间上可能单调递增或递减,有助于增加模型的非线性表达能力。

        3、随着层深的增加,ReLu精度迅速下降,其次是Swish,相比之下,Mish能更好的保持准确性。


        Dropblock正则化 

        传统的Dropout:随机删除减少神经元的数量,使网络变得更简单。主要作用在全连接层

        Dropblock:一种针对卷积层的正则化方法,在称为块的相邻相关区域中丢弃特征

        Dropout主要作用在全连接层,而Dropblock可以作用在任何卷积层之上。这样既可以实现生成更简单模型的目的,又可以在每次训练迭代中引入学习部分网络权值的概念,对权值矩阵进行补偿,从而减少过拟合。

为什么提出Dropblock?

        Dropblock的研究者认为,卷积层对于这种随机丢弃并不敏感,因为卷积层通常是三层连用:卷积+激活+池化层,池化层本身就是对相邻单元起作用。即使随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息。因此,在全连接层上效果很好的Dropout在卷积层上效果并不好。所以Dropblock的研究者则干脆整个局部区域进行删减丢弃。

为什么需要正则化?

        在解决实际问题的过程中,我们会倾向于用复杂的模型来拟合复杂的数据,但是使用复杂模型会产生过拟合(overfitting)的风险,而正则化就是常用的减少过拟合风险的工具之一。

        补充:conv的空间相关性

        对比上面两图,左边的即使随机置0了部分网格,但是经过卷积后任然有数值传入到下一层,而右边的处理是将整块区域都置0,这样卷积后下一层的内容也是0 


        neck(颈部)

        先来看看neck部分的网络结构(橙色框部分):

         SPP

        SPP-Net全称Spatial Pyramid Pooling Networks(空间金字塔池),主要是用来解决不同尺寸的特征图如何进入全连接层的,在网络的最后一层concat所有特征图,后面能够继续接CNN模块。

        例如下图:两张图片字体的宽高比不同

为什么需要SPP?

        在一般的CNN结构中,在卷积层后面通常连接着全连接。而全连接层的特征数是固定的,所以在网络输入的时候,会固定输入的大小但在现实中,我们的输入的图像尺寸总是不能满足输入时要求的大小。为了满足指定的输入大小通常的手法就是裁剪(crop)和拉伸(warp)。这样做总是不好的:图像的纵横比(ratio aspect) 和 输入图像的尺寸是被改变的,这样就会扭曲原始的图像。

        SPP就是为了解决这个问题。让任意大小的图片都可以输入而不需要拉伸裁剪。同时SPP块在不影响推理速度的情况下增加了感受野

        ​ 

        SPP原理

         多尺度特征提取出固定大小的特征向量,送入全连接层。使得任意大小的特征图都能够转换成固定大小的特征向量。

        过程:假设我们希望提取出21个特征,那么对一张输入的图片进行划分三种不同大小的刻度(4×4,2×2,1×1),最后总共可以得到16+4+1=21个块,我们即将从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。

        SPP应用在YOLOv4中的结构如下图:

在YOLOv4中,作者引入SPP,是因为它显著地增加了感受野,分离出了最重要的上下文特征,并且几乎不会降低的YOLOv4运行速度

         计算过程如下图:


         PANet

        YOLOv3中的neck只有自顶向下的FPN,对特征图进行特征融合,而YOLOv4中则是FPN+PAN的方式对特征进一步的融合。引入了自底向上的路径,使得底层信息更容易传到顶部

        FPN是自顶向下的,将高层的特征信息通过上采样的方式进行传递融合,得到进行预测的特征图。

        FPN+PAN的结构如下图:

为什么要加入PAN?

        FPN是自顶向下,将高层的强语义特征传递下来,对整个金字塔进行增强,不过只增强了语义信息,对定位信息没有传递。PAN就是针对这一点,在FPN的后面添加一个自底向上的金字塔,对FPN补充,将低层的强定位特征传递上去。

深层网络:

        随着下采样或卷积次数增加,感受野逐渐增加,感受野之间的重叠区域也不断增加,此时的像素点代表的信息是一个区域的信息,获取的是这块区域或相邻区域之间的特征信息,相对不够细粒度。

浅层网络:

        一般感受野较小,能够利用更多的细粒度特征信息,而且此时特征图每个像素点对应的感受野重叠区域还很小,早就保证了网络能捕获更多细节。

        改进部分:

        YOLOv4在原始PAN结构上进行了一点改进,原本的PANet网络的PAN结构中,特征层之间融合时是直接通过addition的方式进行融合的,而Yolov4中则采用在通道方向concat拼接操作融合的,如下图所示。

为什么要把add改为concat?        

        add: 将两个特征图直接相加,是resnet中的融合方法,基于这种残差堆叠相加,可以有效地减小因为网络层数加深而导致的cnn网络退化问题。add改变特征图像素值,并没有完全保留原本特征图信息,更多的可以看作对原特征图信息的一种补充,深层特征图在卷积过程中丢失了许多细节信息,通过add的方式得以补全,是在二维的平面上对特征图的增强。因此add在进行图像特征增强时使用最佳。

        concat: 将两个特征图在通道数方向叠加在一起,原特征图信息完全保留下来,再对原特征图增加一些我们认为是较好的特征图,丰富了特征图的多样性,是在空间上对原特征图的增强,这样在下一次卷积的过程中我们能得到更好的特征图。

        整体过程:


        Head头部(预测)


        先验框(anchor) 

        先验框微调:

        微调过程 (由先验框得到的预测框不断接近真实框):


         DIoU-NMS(非极大抑制)

        不同于yolo之前的版本使用的是IOU,v4使用的是DIOU。

 

鉴于IOU存在以上的问题,因此引入DIOU


损失函数

        对比YOLOv3有两处不同:

1.位置在类别损失和置信度损失的计算由均方损失换成了交叉熵损失。

        解决均方损失造成的梯度消失问题,另外交叉熵只看重正确分类的结果,而均方差对每个输出结果都看重。

2.位置损失换成了CIOU损失。

 

### 回答1: 你好!Yolov4是一个目标检测算法,它是Yolov3的改进版本,采用了更多的技巧来提高检测精度和速度。"Bubbliiiing"可能是指在使用Yolov4进行目标检测时,标注框或检测框出现了泡泡状的效果。这通常是在可视化结果时添加的一种效果。 如果你有任何其他的问题或需要更详细解释,请随时提出。 ### 回答2: Bubbliiiing YOLOv4是一款基于深度学习的图像目标检测系统。它是在YOLOv4的基础上进行改进的,因此可以实现更高的准确率和更快的检测速度。 这个系统最大的特点是其检测精度的提升。它采用了更深的神经网络结构,包含更多的层数和更多的卷积核,从而能够有效地提高检测精度。此外,它还运用了一些新的技术和算法,如CutMix、Mosaic等,进一步提升了检测的可靠性和准确性。 与此同时,Bubbliiiing YOLOv4还大幅提高了其检测速度,这是深度学习图像目标检测系统在实际应用中必需的。它采用了一些优化措施,如支持FP16加速和多流并行计算等,从而可以在不牺牲检测精度的情况下,提高检测的速度和效率。 总体而言,Bubbliiiing YOLOv4是一款非常优秀的图像目标检测系统。它不仅具有较高的准确率和较快的速度,还具有良好的可扩展性和可优化性,可以很好地适应不同的应用场景和需求。作为一款基于深度学习的图像目标检测系统,Bubbliiiing YOLOv4具有较强的实用性和推广价值,有着广泛的应用前景。 ### 回答3: Bubbliiing yolov4是一种基于YOLOv4(You Only Look Once version 4)算法的物体检测技术。YOLOv4是目前最先进的物体检测算法之一,被广泛应用于智能交通、智能安防、自动驾驶等领域。Bubbliiing yolov4在其基础上进一步提升了检测的准确性、速度以及对视觉数据多样性的适应性。 相对于传统的基于滑动窗口或区域建议的物体检测算法,YOLO系列算法的优势在于一次前向传播可以直接输出所有物体框及其类别概率。而在YOLOv4中,使用多个尺度的特征图,采用DIOU损失函数,并且引入了SPP,PAN等结构进行融合,使得YOLOv4在精度和速度方面大幅度提高。 针对YOLOv4在应对大场景、小物体等问题上的不足,Bubbliiing yolov4采用了基于分层策略和多样化的数据增强方式。首先,通过分层策略将物体检测任务分解为多个子任务,提高了算法的适应性。其次,采用数据增强方式,增加了数据的多样性,可以更好地应对场景复杂、光照不均等问题。这些技术的引入使得Bubbliiing yolov4在一些公开数据集上达到了目前最好的检测精度,同时保持了快速的检测速度。 总之,Bubbliiing yolov4是一种有效的物体检测技术,可以在智能交通、智能安防、自动驾驶等领域得到广泛应用,为人们的日常生活带来更多便利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值