面试问题总结——关于YOLO系列(三)

  • 接着上篇的的YOLO系列面试问题总结,加油,冲!

在这里插入图片描述

三.YOLOv3

1.YOLOv3主干网络BackBone——Darknet-53网络结构(因为有53个卷积层)

(原论文中Darknet53的尺寸是在图片分类训练集上训练的,所以输入的图像尺寸是256x256,而在YOLOv3中输入尺寸是416×416)
在这里插入图片描述
  ①上图中,Top-1 Accuracy和Top-5 Accuracy是指什么呢?区别在哪呢?
  我们知道ImageNet有大概1000个分类,而模型预测某张图片时,会给出1000个按概率从高到低的类别排名,所谓的Top-1 Accuracy是指排名第一的类别与实际结果相符的准确率,而Top-5 Accuracy是指排名前五的类别包含实际结果的准确率。

  ②为什么Darknet-53相比于同时期更深层的网络ResNet-101、ResNet-152效果更好些呢?
  在两个模型的主干网络中,我发现基本都是通过一系列的残差结构堆叠来实现的主干网络,唯一不同的是Darknet-53网络中没有最大池化层即Maxpooling层,而Darknet-53中所有的下采样基本都是通过卷积层来实现的,我猜想是这个原因。

  ③为什么Darknet-53运行速度快呢?
  因为它的卷积核个数相比之下更少一些,所以参数也就更少了,运算量也就小。

  ④关于残差网络
  残差网络的提出是为了解决深层网络出现的退化问题,我们知道神经网络的每一层对应提取到不同层次的特征信息,网络越深的时候,提取到的信息也越丰富。而深度增加之后,会产生梯度消失或者梯度爆炸的问题,传统的解决办法是数据初始化和BN层,虽然解决了梯度消失和爆炸的问题,但也产生了别的问题,即网络的性能退化了,虽然深度增加但错误率却上升了。而残差网络,可有效解决此问题,同时也解决了梯度的问题。

2.YOLOv3网络模型

  下面是以YOLOv3 416模型进行绘制的,所以输入的尺寸是416x416,预测的三个特征层大小分别是52,26,13。
在这里插入图片描述
  残差结构就是将主分支上1×1卷积层和3×3卷积层之后的输出和捷径分支上的输出进行相加,所以上图中的每个矩形框,并不是在两个卷积层之后又接了一个残差结构,而是这整个矩形框就是一个残差结构。
(上图要是背不下来,也可以直接画下面这个模型图,面试的时候直接就说输出了三个尺寸的特征层52×52、26×26、13×13。作者在三个特征层上分别用了3个预设边界框的尺寸,一共是9个anchor boxes,都是根据COCO数据集聚类得到的。)
在这里插入图片描述

3.关于YOLOv3网络的训练细节:正负样本的匹配

  在原论文中,针对每一个ground truth(简称GT,真值,就是你打标签时标注的目标矩形框),都会分配一个bounding box,表示针对每一个GT,都会分配一个正样本,则一张图片有几个GT,就会有几个正样本。

  YOLOv3中正负样本的定义:YOLOv3中就不再看中心点落在哪个grid cell(网格)里面就由哪个grid cell预测了,而是看谁的anchor与待检测目标的grouth truth的iou值最大,才由那个anchor去预测,也就是在YOLOv3里面正样本是指与grouth truth的iou值最大的预测框或anchor,对于和grouth truth有iou值且大于设定iou阈值(原论文中设为0.5)但不是最大值的预测框或anchor,就忽略它们;对于小于设定iou阈值的预测框或anchor而言就是负样本
  此外,在原论文中也提到,对于当前的bounding box,若其不是正样本的话,则它既没有定位损失,也没有类别损失,仅仅只有置信度损失(confidence loss)。
在这里插入图片描述
在这里插入图片描述

4.YOLOv3损失函数

在这里插入图片描述

  YOLOv3的损失函数主要分为三个部分:目标定位偏移量损失目标置信度损失以及目标分类损失,其中λ1、λ2、λ3是平衡系数。
在这里插入图片描述
原论文中损失函数写的很粗略,比如坐标损失采用的是误差的平方和,类别损失采用的是二值交叉熵,在github上也找了很多YOLO v3的公开代码,有的采用的是YOLOv1或者YOLOv2的损失函数。
(二值交叉熵):y为样本的期望输出,y^为样本的实际输出
在这里插入图片描述

5.YOLOv3

Backbone(骨干网络):用于提取特征
Neck(颈部网络):用于汇总、融合不同尺度的特征,类似于FPN(特征金字塔)
Head(输出头):获得各个尺度目标检测的预测结果
(因为Backbone骨干网络是全卷积网络,可以兼顾任意尺度的输入,则可以输入32倍的任意尺度图像。所以对于YOLOv3来说,输入的图像越大,则单张输出的特征数也越多。)
在这里插入图片描述
为什么YOLOv3对小目标的检测会比YOLOv1好很多?

YOLOv3更进一步的扩充了预测框的数量(52×52+26×26+13×13)×3=10647,所以检测效果更好。

YOLOv1/v2中使用IoU作为置信度标签有何不好?

  ①很多预测框与ground truth的IoU最高只有0.7。
  ②COCO中的小目标IoU对像素偏移很敏感无法有效学习。
而在YOLOv3中正样本的标签都用1表示,负样本0表示。
只有正样本对分类和定位学习产生贡献(与YOLOv1和YOLOv2思想一致),负样本只对置信度学习产生贡献。

YOLOv3对于小目标/密集目标的改进

1.grid cell个数增加(兼容任意图片大小输入)
2.Anchor
3.多尺度预测(FPN)
4.损失函数惩罚小框项
5.网络结构(骨干网络 跨层连接)


在这里插入图片描述

四.YOLOv4

YOLOv4主要做的改进方法分为两类:Bag of freebies(BoF)Bag of specials(BoS)
BoF方法只改变训练策略或者只增加训练的成本与时间,但不会影响测试阶段的性能;BoS方法只会增加少量的推理成本但却能显著提高对象检测精度的插入组件和后处理方法。
(论文中提到的BoF和BoS方法并不是YOLOv4全部采用的,只是用了其中的一些tricks)

1.Bag of freebies(BOF)

①提出对数据的预处理(pixel-wise调整):数据扩充

a.光度畸变:调整图像的亮度、对比度、色调、饱和度和噪声。
b.几何畸变:加入随机缩放、剪切、翻转和反旋。
Mosaic data augmentation(马赛克数据增强)
  Mosaic方法基于Sangdoo Yun等人于2019年提出的CutMix数据增强方法,CutMix方法只处理合并两张图片,而Mosaic方法读取四张图片,然后分别进行翻转、缩放等操作,接着拼成一张图片。这种方法可以丰富图片背景,大大扩充训练数据集。而且随机缩放操作增加了很多小目标,使得训练出的模型更加鲁棒。使用Mosaic方法在训练时,可一次直接输入4张图片,使得训练时的Mini-batch可以设置得很小,单个GPU就可以进行训练。

②模拟对象遮挡

a. random eraseCutOut:可以随机选择图像中的矩形区域,并填充一 个随机的或互补的零值。
b. hide-and-seekgrid mask:随机或均匀地选择图像中的多个矩形区 域,并将其全部替换为0。

③特征矩阵采用DropBlock regularization()

在这里插入图片描述
  在上图中,×格子表示网络层是学习不到的,但可以通过×格子周围的信息来进行学习从而和检测目标关联。
(理解:网络会从dropout掉的激活单元附近学习到同样的信息,通过dropout掉一部分相邻的整片区域(比如眼睛和鼻子),网络就会去注重学习人的别的部位的特征来实现正确分类,从而表现出更好的泛化能力。)

④解决类别不平衡

  解决数据分布不平衡:在实际的训练过程中,正负样本总是相差悬殊的,通过设置损失函数前面的权重来解决。

⑤Label smoothing(标签平滑处理)

  用于解决one-hot类别之间没有关联。
比如对于一个标签矩阵 [0,0,1] 转化为-> [0.01,0.01,0.98],分类标签的平滑,将0,0,1转变成0.01,0.01,0.98,这样会提高识别精度。
在这里插入图片描述
在这里插入图片描述

⑥Bounding box回归

YOLOv4采用的是CIoU_loss。
在这里插入图片描述

⑦ Self-Adversarial Training(自对抗训练)

  对抗样本的定义:以图像样本为例,在原样本上加入一些轻微的扰动,使得在人眼分辨不出差别的情况下,诱导模型进行错误分类。
  作用:使得训练出的模型更加鲁棒。

2.Bag of specials(BOS)

①采用DIoU-NMS

在这里插入图片描述
(式中,M:表示置信度最高的框的四个参数(长、宽、中心点坐标);
Bi:表示其他的框,需要从置信度最高的框开始遍历;ε:设定的阈值)
在原始的NMS中,IoU度量被用来抑制冗余检测盒,其中重叠区域是唯一的因素,在有遮挡的情况下常常产生错误的抑制。
  DIoU-NMS不仅考虑了检测区域的重叠,而且还考虑了检测区域间的中心点距离。

②激活函数 Mish activation

在这里插入图片描述
在这里插入图片描述
  理论上对负值的轻微允许更好的梯度流,而不是像ReLU中那样的硬零边界。
  平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化。

③ enhance receptive field(提升模型感受野)

YOLOv4中采用SPP(结构见下图,就是一堆池化的组合)作用:加速模型对核心特征的提取,提升模型的感受野。
在这里插入图片描述
感受野(Receptive Field),指的是神经网络中神经元“看到的”输入区域,在卷积神经网络中,feature map上某个元素的计算受输入图像上某个区域的影响,这个区域即该元素的感受野。
  卷积神经网络中,越深层的神经元看到的输入区域越大,即越深层的神经元的感受野越大。
  所以,感受野是个相对概念,某层feature map上的元素看到前面不同层上的区域范围是不同的,通常在不特殊指定的情况下,感受野指的是看到输入图像上的区域。
 所以,在YOLOv4中,对主干网络CSPDarknet53后的特征采用SPP层的方式,能更有效的增加主干网络的感受野,显著的分离最重要的上下文特征。

④ CSPDarknet53

  CSPNet (Cross Stage Paritial Network) 主要从网络结构设计的角度解决推理中计算量大的问题。CSPNet 的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。 因此采用先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。
  CSPDarknet53 模型在目标检测方面具有更高的检测精度,同时,可以使用 Mish 和其他技术来提高 CSPDarknet53 的分类准确性。

⑤PAN

在这里插入图片描述
  PANet改进了主干网络结构,加强了特征金字塔的结构,缩短了高低层特征融合的路径。
  Neck颈部网络中:使用了FPN和PAN,它把不同尺度的特征进行汇总整合,增强了模型对不同大小、不同尺度目标的识别能力。
  FPN特征金字塔通过融合高底层特征,提升了不同尺度特别是小尺度的目标检测效果,而PAN在FPN特征金字塔的基础上,进一步增强了自底向上的特征增强。(原因:因为底层神经网络主要提取边缘、轮廓、颜色等底层视觉特征,而这些特征往往与目标的边缘和轮廓等密切相关,因此PAN-Net自底向上的特征增强,可以让顶层特征图充分共享到网络底层提取到的底层视觉特征,提升大目标的检测效果。)

3.YOLOv4采用的模型结构

backbone:CSP+Darknet53
additional module:SPP
neck:PANet
head:YOLOv3 (anchor based)

4. YOLOv4相比于YOLOv3作了哪些改进

  ①在主干网络CSPDarknet53中将CBL替换成了CBM,即卷积中的激活函数做了替换,改成了Mish激活函数,在主干网络后面的网络中没有作替换,依然用的是LeakyReLU;(个人猜测,后面用LeakyReLU可能是为了计算速度更快)
(CBM=卷积层+BN层+Mish,CBL=卷积层+BN层+LeakyReLU)
  ②对主干网络CSPDarknet53后的特征采用SPP层的方式,能更有效的增加主干网络的感受野,SPP的结构是三层最大池化,这里说一下感受野的定义;同时,我个人还觉得,通过SPP还可以有效减少特征提取的参数量,因为SPP是在主干网络之后,主干网络用来提取特征信息,对于提取到的信息肯定会有很多冗余,采用SPP即最大池化可以减少冗余,这是我个人观点;
  ③YOLOv3中的网络输出是从大目标到小目标,YOLOv4中的网络输出是从小目标到大目标,目的是增加了特征的融合程度,融合的比YOLOv3更深,这点看它们的网络结构图就清楚了。

5.YOLOv4损失函数采用了CIoU-loss,在此基础上,介绍下IOU、GIOU、DIOU

  CIOU解决了一般IOU无法直接优化两个框没有重叠的部分的问题,并且综合考虑了边界框的重叠面积、中心点距离,长宽比等因素,使得预测框回归的速度和精度更高。YOLOv4的损失函数可以由回归框预测误差 Lloc置信度误差Lconf分类误差Lcls三部分相加而成:
在这里插入图片描述
①IOU

  IoU 通过计算预测的边框和真实的边框之间的Intersection Area I(相交的面积) 和 Union Area U(总的面积) 的比值来获得,公式如下:
在这里插入图片描述
IoU的优点:
  a.IoU可以作为距离表示,即IoUloss=1-IoU,但是当两个边框不相交时无法回传梯度;
  b.IoU对尺度变化具有不变性的特点,即不受两个物体尺度大小的影响。
IoU的缺点:
  a.无法衡量两个框是相邻还是甚远,如下图,两种情况下IoU值均为0,可以清楚地发现,图(a)中两框距离较近,图(b)中两框距离明显要远,但是仅从IoU数值上无法判断两者距离较近还是较远(两个物体不相交时无法回传梯度);
在这里插入图片描述
  b.IoU不能反映两个物体如何重叠(相交方式),如下图,两种情况下的IoU均为0.143,图(a)中两框要比图(b)中的相交更整齐一些,但是IoU并没有反映出这个特点。
②GIOU

 GIoU作为IoU的升级版,是为了克服IoU存在的缺点同时充分利用优点而提出的。具体的计算方式是在IoU计算的基础上寻找一个最小外接凸闭合框C,公式如下:
在这里插入图片描述
式中,A为预测框,B为真实框,不管A与B是否相交,C是包含A与B的最小框(包含A与B的最小凸闭合框),首先计算IoU,A与B的交并比,再计算C框中没有A与B的面积,比上C框面积,IoU减去前面算出的比值;得到GIoU。(注:本文提出的例子中A、B均是矩形框,但是也可以为其他形状,比如A、B为椭圆形,那么此时C将是包含A、B的最小椭圆形,或者A、B均是3D box等等)
GIoU的优点:
  a.对尺度的不变性,GIoU可以衡量两个框是相邻还是甚远,GIoU可认为是IoU的下界,小于等于IoU,即-1≤GIoU≤1,当A和B完全重合时,GIoU=IoU=1,当A与B不相交而且离得很远时,GIoU(A,B)趋向于-1。
  b.GIoU能够更好地反应相交情况。
GIoU的缺点:
  当目标框完全包裹预测框的时候,IoU和GIoU的值都一样,此时GIoU退化为IoU,无法区分其相对位置关系。
③DIOU

  DIoU loss是在IoU loss基础上引入一个惩罚项,公式如下:
在这里插入图片描述
式中,b,bgt分别代表了预测框和目标框的中心点,且ρ代表的是计算两个中心点间的欧式距离。c代表的是能够同时覆盖预测框和目标框的最小矩形的对角线距离。因此DIoU中对预测框和目标框之间的归一化距离进行了建模,直观的展示如下图所示,
在这里插入图片描述
DIoU的优点:
  ①与GIoUloss类似,DIoUloss在与目标框不重叠时,仍然可以为边界框提供移动方向;
  ②DIoUloss可以直接最小化两个目标框的距离,而GIOUloss优化的是两个目标框之间的面积,因此比GIoUloss收敛快得多;
  ③对于包含两个框在水平方向和垂直方向上这种情况,DIoU损失可以使回归非常快,而GIoU损失几乎退化为IoU损失。
  ④DIoU还可以替换普通的IoU评价策略,应用于NMS中,使得NMS得到的结果更加合理和有效。
④CIOU

在这里插入图片描述
(式中,Wgt和hgt表示标签框的长宽,自己想一下tanα = w/h,就这样把bbox和gt的长宽考虑到)

为什么CIOU这么优秀,却只在损失函数中使用CIoU-loss,而在NMS中使用的却是DIoU-NMS?
  答:因为CIOU需要真实框和预测框,在损失函数即训练阶段,是有标签的真实框的,而在NMS即测试推理阶段,是没有标签真实框的。

YOLOv3和YOLOv4的网络模型图:https://blog.csdn.net/abc13526222160/article/details/107035765/


在这里插入图片描述

五.YOLOv5

  YOLOv5和v4的网络很相似,基本没有什么太大的改变,唯一比较新的就是提出了Focus模块,但我个人觉得Focus就是YOLOv2中的Passthrough layer。(但YOLOv5s确实很优秀,只有7.9M,速度快,可以用于嵌入式等设备)

1.Focus结构

Focus结构:把长度和宽度方向的空间维度信息切片并堆叠至通道维度,长和宽缩小为原来的一半,通道数变成原来的4倍,节省计算量。
在这里插入图片描述
  Focus结构,在Yolov3&Yolov4中并没有这个结构,其中比较关键是切片操作。
  以Yolov5s的结构为例,原始608×608×3的图像输入Focus结构,采用切片操作,先变成304×304×12的特征图,再经过一次32个卷积核的卷积操作,最终变成304×304×32的特征图。
  Focus结构的目的是让网络提取到多种尺度的核心特征。(多尺度特征提取)
  具体实现过程:用切片的操作将图像4×4×3切成2×2×12的特征图,然后再用卷积去卷这个特征图,来达到多尺度特征融合,增大感受野的效果。(我个人感觉就和YOLOv2中的Passthrough layer一模一样)
  Focus和SPP都是为了增大感受野的操作,不过Focus是通过切片来做完整的特征提取,而SPP是通过最大池化来提取核心特征。

2.自适应锚框计算

  在YOLO算法中,针对不同的数据集,都会有初始设定长宽的锚框,且不会改变了,YOLOv2有5个,YOLOv3和YOLOv4是9个。
  但在YOLOv5中网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算两者差距,再反向更新,迭代网络参数。
  所以YOLOv5在训练的过程中,每次训练时都会自适应的计算不同训练集的最佳锚框值,当然,这个功能也是可以在代码中将自动计算锚框功能关闭。

3.YOLOv5网络模型

输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放
Backbone:Focus结构,CSP结构
Neck:FPN+PAN结构
Prediction:GIOU_Loss

  • 18
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

boss-dog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值