【YOLO系列】YOLOv4论文超详细解读2(网络详解)

 上一篇我们一起读了YOLOv4的论文《YOLOv4:Optimal Speed and Accuracy of Object Detection》(直通车→【YOLO系列】YOLOv4论文超详细解读1(翻译 +学习笔记)),有了初步的印象,论文里面涉及到很多tricks,上一篇介绍的比较简略,我们这篇来详细介绍一下。


目录

一、YOLOv4的简介

 二、YOLOv4的网络结构

三、输入端

数据增强①CutMix

数据增强②Mosaic

SAT自对抗训练

cmBN

Label Smoothing类标签平滑

四、主干网络BackBone

CSPDarknet53

Mish激活函数

Dropblock正则化

五、Neck

SPP

PAN

SAM

六、Head

Loss

NMS


一、YOLOv4的简介

YOLOv4一共有如下三点贡献:

(1)开发了一个高效、强大的目标检测模型。它使每个人都可以使用1080ti或2080ti GPU来训练一个非常快速和准确的目标检测器。

(2)验证了最先进的 Bag-of-Freebies和 Bag-of-Specials对象检测在检测器训练时的影响。

(3)对现有的方法进行了改进,使其更加高效,更适合于单个GPU的训练,包括CBN,PAN,SAM等。


 二、YOLOv4的网络结构

YOLOv4的整体原理图如下:和v3还是比较接近的

可以看到由以下四个部分组成:

输入端: 训练时对输入端的改进,主要包括Mosaic数据增强、cmBN、SAT自对抗训练

BackBone主干网络: 各种方法技巧结合起来,包括:CSPDarknet53、Mish激活函数、Dropblock

Neck: 目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如YOLOv4中的SPP模块、FPN+PAN、SAM结构

Head: 输出层的锚框机制和YOLOv3相同,主要改进的是训练时的回归框位置损失函数CIOU Loss,以及预测框筛选的nms变为DIOU nms

YOLOv4的五个基本组件:

  1. CBM:Yolov4网络结构中的最小组件,由Conv+Bn+Mish激活函数三者组成。
  2. CBL:由Conv+Bn+Leaky_relu激活函数三者组成。
  3. Res unit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。
  4. CSPX:借鉴CSPNet网络结构,由三个卷积层和X个Res unint模块Concate组成。
  5. SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。

三、输入端

Yolov4对训练时的输入端进行改进,使得训练时在单张GPU上跑的结果也蛮好的。比如数据增强Mosaic、cmBN、SAT自对抗训练。

数据增强①CutMix

数据增强的原因:在平时项目训练时,小目标的AP一般比中目标和大目标低很多。而Coco数据集中也包含大量的小目标,但比较麻烦的是小目标的分布并不均匀。Coco数据集中小目标占比达到41.4%,数量比中目标和大目标都要多。但在所有的训练集图片中,只有52.3%的图片有小目标,而中目标和大目标的分布相对来说更加均匀一些。

核心思想:将一部分区域cut掉但不填充0像素,而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配。

处理方式:对一对图片做操作,随机生成一个裁剪框Box,裁剪掉A图的相应位置,然后用B图片相应位置的ROI放到A图中被裁剪的区域形成新的样本,ground truth标签会根据patch的面积按比例进行调整。

另外两种数据增强的方式:

(1)Mixup: 将随机的两张样本按比例混合,分类的结果按比例分配

(2)Cutout: 随机的将样本中的部分区域Cut掉,并且填充0像素值,分类的结果不变


数据增强②Mosaic

Yolov4中使用的Mosaic是参考2019年底提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放、随机裁剪、随机排布的方式进行拼接。

优点:

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

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


SAT自对抗训练

自对抗训练(SAT)也代表了一种新的数据增加技术,在两个前后阶段操作。

(1)在第一阶段: 神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对自己执行一种对抗性攻击,改变原始图像,以制造图像上没有期望对象的假象。

(2)在第二阶段: 神经网络以正常的方式对这个修改后的图像进行检测。

通过引入噪音点进行数据增强


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内权重参数一样,因此计算不需要进行补偿。


Label Smoothing类标签平滑

原因:对预测有100%的信心可能表明模型是在记忆数据,而不是在学习。如果训练样本中会出现少量的错误样本,而模型过于相信训练样本,在训练过程中调整参数极力去逼近样本,这就导致了这些错误样本的负面影响变大。

具体做法:标签平滑调整预测的目标上限为一个较低的值,比如0.9。它将使用这个值而不是1.0来计算损失。这样就缓解了过度拟合。说白了,这个平滑就是一定程度缩小label中min和max的差距,label平滑可以减小过拟合。所以,适当调整label,让两端的极值往中间凑凑,可以增加泛化性能。

 


四、主干网络BackBone

CSPDarknet53

简介:CSPNet(Cross Stage Partial Networks),也就是跨阶段局部网络。CSPNet解决了其他大型卷积神经网络框架Backbone中网络优化的梯度信息重复问题,CSPNet的主要目的是使网络架构能够实现获取更丰富的梯度融合信息并降低计算量。

具体做法:CSPNet实际上是基于Densnet的思想,即首先将数据划分成Part 1和Part 2两部分,Part 2通过dense block发送副本到下一个阶段,接着将两个分支的信息在通道方向进行Concat拼接,最后再通过Transition层进一步融合。CSPNet思想可以和ResNet、ResNeXt和DenseNet结合,目前主流的有CSPResNext50 和CSPDarknet53两种改造Backbone网络。

具体改进点:

①用 Concat 代替 Add,提取更丰富的特征。

②引入 transition layer (1 * 1conv + 2 * 2pooling),提取特征,降低计算量,提升速度。

③将Base layer 分为两部分进行融合,提取更丰富的特征。

Q:为什么要采用CSP模块呢?

CSPNet全称是Cross Stage Paritial Network,主要从网络结构设计的角度解决推理中计算量很大的问题。

CSPNet的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。

因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时,可以保证准确率。

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

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

Mish激活函数

简介:Mish是一个平滑的曲线,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化;在负值的时候并不是完全截断,允许比较小的负梯度流入。Mish是一个与ReLU和Swish非常相似的激活函数,但是Relu在小于0时完全杀死了梯度,不太符合实际情况,所以可以在不同数据集的许多深度网络中胜过它们。

公式:y=x∗tanh(ln(1+ex))

Mish图像:

Mish和Leaky_relu激活函数的图形对比如下:

优点:

(1)从图中可以看出该激活函数,在负值时并不是完全截断,而允许比较小的负梯度流入从而保证了信息的流动

(2)Mish激活函数无边界,这让他避免了饱和(有下界,无上界)且每一点连续平滑且非单调性,从而使得梯度下降更好。


Dropblock正则化

传统的Dropout:随机删除减少神经元的数量,使网络变得更简单。

Dropblock:DropBlock技术在称为块的相邻相关区域中丢弃特征。Dropblock方法的引入是为了克服Dropout随机丢弃特征的主要缺点,Dropout主要作用在全连接层,而Dropblock可以作用在任何卷积层之上。这样既可以实现生成更简单模型的目的,又可以在每次训练迭代中引入学习部分网络权值的概念,对权值矩阵进行补偿,从而减少过拟合。

之前的Dropout是随机选择点(b),现在随机选择一个区域:

Q:全连接层上效果很好的Dropout在卷积层上效果并不好?

        中间Dropout的方式会随机的删减丢弃一些信息,但Dropblock的研究者认为,卷积层对于这种随机丢弃并不敏感,因为卷积层通常是三层连用:卷积+激活+池化层,池化层本身就是对相邻单元起作用。

        而且即使随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息。因此,在全连接层上效果很好的Dropout在卷积层上效果并不好。所以右图Dropblock的研究者则干脆整个局部区域进行删减丢弃。


五、Neck

SPP

简介:SPP-Net全称Spatial Pyramid Pooling Networks,是何恺明大佬提出的,主要是用来解决不同尺寸的特征图如何进入全连接层的,在网络的最后一层concat所有特征图,后面能够继续接CNN模块。

如下图所示,下图中对任意尺寸的特征图直接进行固定尺寸的池化,来得到固定数量的特征。

具体结构如下:


PAN

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

下面是YOLOv3的neck中的FPN,如图所示:

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

YOLOv4中的neck如下:

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

Q:为什么要把add改为concat?

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

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


SAM

SAM源自于论文CBAM(Convolutional Block Attention Module)的论文,提出了两种注意力机制的技巧。

先来介绍一下CBAM

如下图所示,输入一个特征F,先进行Channel attention module后得到权重系数和原来的特征F相乘,然后在进行Spatial attention module后得到权重系数和原来的特征F相乘,最后就可以得到缩放后的新特征。不仅每个通道有注意力,而且特征图每个位置有注意力。

接着我们来介绍Channel attention module(通道注意力模块)

该模块就是将输入的特征F分别进行全局的Maxpooling与Averagepooling,接着将这两个输入到一个权重共享的MLP,再将这两个进行element-wise summation操作后经过Sigmoid函数会得到权重系数Mc,再将这个权重系数与原来的特征F相乘,就可以得到缩放后的新特征。

我们再看看Spatial attention module(空间注意力模块)

首先对不同的feature map上相同位置的像素值进行全局的Maxpooling与Average pooling,接着将这两个spatial attention map 进行concat,再利用一个7X7的卷积后经过Sigmoid函数会得到权重系数Ms,在将这个权重系数与原来的特征F相乘,就可以得到缩放后的新特征,如下所示:

YOLOv4将SAM从空间注意修改为点注意,不应用最大值池化和平均池化,而是直接接一个7X7的卷积层,这样使速度相对快一些。


六、Head

Loss

经典IoU loss

IoU算法是使用最广泛的算法,大部分的检测算法都是使用的这个算法。

不足:没有相交则IOU=0无法梯度计算,相同的IOU却反映不出实际情况


GIOU(Generalized IoU)损失

GIoU考虑到,当检测框和真实框没有出现重叠的时候IoU的loss都是一样的,因此GIoU就引入了最小封闭形状C(C可以把A,B包含在内),在不重叠情况下能让预测框尽可能朝着真实框前进,这样就可以解决检测框和真实框没有重叠的问题。


公式:

不足:但是在两个预测框完全重叠的情况下,不能反映出实际情况


DIOU(Distance IoU)损失

DIoU考虑到GIoU的缺点,也是增加了C检测框,将真实框和预测框都包含了进来,但是DIoU计算的不是框之间的交并,而是计算的每个检测框之间的欧氏距离,这样就可以解决GIoU包含出现的问题。

公式:其中分子计算预测框与真实框的中心点欧式距离d 分母是能覆盖预测框与真实框的最小BOX的对角线长度c


 CIOU(Complete IoU)损失

CIoU就是在DIoU的基础上增加了检测框尺度的loss,增加了长和宽的loss,这样预测框就会更加的符合真实框。

公式:损失函数必须考虑三个几何因素:重叠面积,中心点距离,长宽比 其中α可以当做权重参数

总结:

  • IOU_Loss:主要考虑检测框和目标框重叠面积。
  • GIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。
  • DIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。
  • CIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。

NMS

DIOU-NMS

DIOU-NMS不仅考虑IOU的值,还考虑两个框的中心点的距离。如果两个框之间的IOU比较大,但是他们中心点之间的距离比较远,则会被认为是不同物体的检测框而不会被过滤掉。

公式: 不仅考虑了IoU的值,还考虑了两个Box中心点之间的距离 其中M表示高置信度候选框,Bi就是遍历各个框跟置信度高的重合情况

 SOFT-NMS

对于重合度较大的不是直接剔除,而是施加惩罚。


本文参考:

想读懂YOLOV4,你需要先了解下列技术(一) - 知乎 (zhihu.com)

 想读懂YOLOV4,你需要先了解下列技术(二) - 知乎 (zhihu.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/587781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

15-网络安全框架及模型-BLP机密性模型

目录 BLP机密性模型 1 背景概述 2 模型原理 3 主要特性 4 优势和局限性 5 困难和挑战 6 应用场景 7 应用案例 BLP机密性模型 1 背景概述 BLP模型,全称为Bell-LaPadula模型,是在1973年由D.Bell和J.LaPadula在《Mathematical foundations and mod…

波特云 集装箱和 海恒蓝 集装箱 自动化集装箱下单方案

背景: 这几天 遇到了一个客户 是做外贸的 需要大量多的集装箱,了解后 他们是需要在平台上 下单集装箱 才有可能预约到集装箱使用,所以公司每天都需要都需要派个人 盯着电脑来 下单集装箱。 波特云 网站:https://www.eportyun.com…

vue-springboot基于JavaWeb的汽配汽车配件销售采购管理系统

过对知识内容的学习研究,进而设计并实现一个基于JavaWeb的汽配销售管理系统。系统能实现的主要功能应包括;汽车配件、销售订单、采购订单、采购入库等的一些操作,ide工具:IDEA 或者eclipse 编程语言: java 数据库: mysql5.7 框架&…

回首2023: 程序员跳出舒适圈

1 前言 今天的冬日暖阳高照,照耀着我穿着羽绒服的身体,让我感到火一般的燥热,仿佛错觉中已经到了阳春三月。刚刚把孩子洗好,我坐在电脑前,准备整理一下思绪,回顾一下2023年的生活和工作。 2 2023 回顾 回…

SAP 资产管理后台配置之设定主数据字段

前阵子给财务创建了一个固定资产类型,但同事使用时发现字段跟平时不一样。 正常是有下面这些标签页的 然后我找到主数据屏幕格式的配置里发现 发现格式默认错了 应该是默认我司的自定义格式ZSAP 但是改成ZSAP还是不会生效 需要给这个资产分类重新分配一下字段标签页…

vue-springboot基于javaEE的二手手机交易平台的设计与实现

在此基础上,结合现有二手手机交易平台体系的特点,运用新技术,构建了以 SpringBoot为基础的二手手机交易平台信息化管理体系。首先,以需求为依据,根据需求分析结果进行了系统的设计,并将其划分为管理员、用户…

Vue+elementUI引入MessageUI展示问题

VueelementUI引入MessageUI展示问题 1.出现问题的界面 2.解决问题 import "element-plus/theme-chalk/el-message.css";

【年度总结 | 2023】稳步前进吧,少年

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

局部线性嵌入(LLE)的代码示例以及详细数学解释

文章目录 局部线性嵌入(LLE)的数学原理LLE中的重建权重计算示例 LLE降维映射的详细解释LLE降维映射的示例示例数据集降维映射 从LLE的特征值和特征向量到低维数据(低维嵌入)特征值和特征向量的计算选择特征向量以获得低维表示构建…

探索小红书笔记API:挖掘数据背后的故事

随着数字化时代的到来,数据已经成为企业和个人决策的重要依据。小红书作为一个流行的社交电商平台,积累了大量的用户数据和内容。通过探索小红书笔记API,我们可以深入挖掘这些数据背后的故事,从而更好地理解用户需求和市场趋势。 …

SpringCloud 和 Linux 八股文第三期五问五答

SpringCloud 和 Linux 八股文第三期五问五答 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的! ⭐点赞⭐收藏⭐不迷路!⭐ 1)Linux常用命令 2)如何查看测试项目的日志 一…

VSCode使用Remote SSH远程连接Windows 7

结论 VSCode Server不能启动,无法建立连接。 原因 .vscode-server 目录中的 node.exe 无法运行。 原因是Node.js仅在Windows 8.1、Windows Server 2012 R2或更高版本上受支持。 由于vscode基于node.js v14,不支持Windows 7操作系统。 另&#xff…

关于苹果iOS 16:揭开伪装成飞机模式的隐形蜂窝接入漏洞的动态情报

一、基本内容 在日常生活中,网络威胁不断演变,给个人和组织带来了一系列重大挑战。网络犯罪分子使用的一种最常见的、最具破坏性的方法之一就是网络钓鱼。这种攻击方式通过电子邮件、短信或其他通讯渠道冒充可信实体,诱使个人泄露敏感信息&am…

从0到1入门C++编程——01 C++基础知识

文章目录 一、工具安装二、新建项目三、设置字体、注释、行号四、C基础知识1.数据类型2.输入输出3.运算符4.选择、循环结构5.跳转语句6.数组7.函数8.指针9.结构体 一、工具安装 学习C使用到的工具是Visual Studio,Visual Studio 2010旗舰版下载链接:点此…

软件测试/测试开发丨Python 内置库 多线程threading

线程基本使用 单线程 def main():print("在扔一个苹果")if __name__ "__main__":main()多线程 Python提供了thread、threading等模块来进行线程的创建与管理,后者在线程管理能力上更进一步,因此我们通常使用threading模块。创建一…

Vue.js和Node.js的关系--类比Java系列

首先我们看一张图 这里我们类比了Java的jvm和JavaScript的node.js。 可以看到,node.js是基础,提供了基础的编译执行的能力。vue,js是实际上定义了一种他自己的代码格式,以加速开发。

告别HTTP,拥抱HTTPS!免费SSL证书领取指南

为什么选择HTTPS? HTTP和HTTPS之间的主要区别在于安全性。HTTP是一种不安全的协议,数据在传输过程中是明文的,容易受到中间人攻击。而HTTPS通过SSL(Secure Sockets Layer)或TLS(Transport Layer Security&…

计算机视觉:朗伯光度立体法(Lambertian Photometric Stereo)

计算机视觉:朗伯光度立体法(Lambertian Photometric Stereo) 光度立体法简介朗伯光度立体法算法原理朗伯光度立体法matlab程序示例Albedo图Normal图Re_rendered图 参考文献 光度立体法简介 光度立体法,即Photometric Stereo, 最早…

啊哈c语言——4.10(练习)

1&#xff0e;请尝试用for循环打印下面的图形。 #include <stdio.h> #include <stdlib.h> int main() {int a,b,c,d,e;for(a 1;a < 10;a){if(a < 5){b a * 2 - 1;c 5 - a;}else{b 9 - (a - 5) * 2;c a - 5;}for(d 0;d < c;d ){printf(" "…

【LeetCode每日一题】1154. 一年中的第几天(直接计算+调用库函数)

2023-12-31 文章目录 [1154. 一年中的第几天](https://leetcode.cn/problems/day-of-the-year/)方法一&#xff1a;直接计算思路&#xff1a; 方法二&#xff1a;调用库函数思路 1154. 一年中的第几天 方法一&#xff1a;直接计算 思路&#xff1a; 1.根据所给的字符串&#…