目标检测学习--yolo v4

论文地址:

《YOLOv4: Optimal Speed and Accuracy of Object Detection》

 读完论文的感受就像是一篇目标检测tricks综述,疯狂叠buff就完事了。

先来论文tricks的截图:

Backbones-Neck-Heads的tricks:

Activations、bbox回归、数据增强、正则化、归一化、跨域连接的tricks:

YOLOv4: 

1. 目标检测器通用框架:

除了输入,一般one-stage的目标检测算法通常由提取特征的backbone、传输到检测网络的Neck部分和负责检测的Head部分。而two-stage的算法通常还包括空间预测部分;

作为one-stageYOLO网络主要由三个主要组件组成:

  • Backbone -在不同图像细粒度上聚合并形成图像特征的卷积神经网络;

  • Neck:一系列混合和组合图像特征的网络层,并将图像特征传递到预测层;

  • Head:对图像特征进行预测,生成边界框和并预测类别;

yolo v4作为yolo系列的网络改进,也是基于上述几个方面进行改进的,作者对目标检测的tricks进行了简单介绍,并改进了部分buff,形成了最终的yolo v4网络;

2. yolo v4的网络结构:

网图侵删

Input:

trick1:Mosaic数据增强

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

在这里插入图片描述

Mosaic数据增强将4张训练图像合并成一张进行训练的数据增强方法(而不是CutMix中的2张)。这增强了对正常背景(context)之外的对象的检测,丰富检测物体的背景;此外,每个小批包含一个大的变化图像(4倍),因此,减少了估计均值和方差的时需要大mini-batch的要求,降低了训练成本;

trick2:自对抗训练(SAT)

SAT为一种新型数据增强方式。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对其自身进行一种对抗式的攻击,改变原始图像,制造图像上没有目标的假象。在第二阶段,训练神经网络对修改后的图像进行正常的目标检测。

Self-Adversarial Training是在一定程度上抵抗对抗攻击的数据增强技术。CNN计算出Loss, 然后通过反向传播改变图片信息,形成图片上没有目标的假象,然后对修改后的图像进行正常的目标检测。需要注意的是在SAT的反向传播的过程中,是不需要改变网络权值的。 使用对抗生成可以改善学习的决策边界中的薄弱环节,提高模型的鲁棒性。因此这种数据增强方式被越来越多的对象检测框架运用。

BackBone:

trick1:CSPDarknet53 

YOLOv3中特征提取网络使用的是Darknet53,YOLOv4借鉴了CSPNet,其全称是Cross Stage Partial Networks,即跨阶段局部网络;

CSPNet解决了其他大型卷积神经网络框架Backbone中网络优化的梯度信息重复问题,将梯度的变化从头到尾地集成到特征图中,因此减少了模型的参数量和FLOPS数值,既保证了推理速度和准确率,又减小了模型尺寸;CSPNet如下:

trick2:Mish激活函数

Mish是一个平滑的曲线,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化;在负值的时候并不是完全截断,允许比较小的负梯度流入。实验中,随着层深的增加,ReLU激活函数精度迅速下降,而Mish激活函数在训练稳定性、平均准确率(1%-2.8%)、峰值准确率(1.2% - 3.6%)等方面都有全面的提高;

主干网络为什么要用Mish,那当然是炼丹有效果啦。

trick3:Dropblock 

传统的dropout对FC层效果更好,对conv层效果较差,因为卷积层通常是:卷积+激活+池化层,池化层本身就是对相邻单元起作用,而且即使随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息;因此,在全连接层上效果很好的Dropout在卷积层上效果并不好,输入的信息仍旧能够被送到下一层,导致网络过拟合;而DropBlock则是将在特征图上去掉一部分相邻的整片的区域(比如头和脚),网络就会去注重学习狗的别的部位的特征,来实现正确分类,从而表现出更好的泛化;

Neck 

trick1:SPP(Spatial Pyramid Pooling Networks)

使用k={1×1,5×5,9×9,13×13}的最大池化的方式,再将不同尺度的特征图进行Concat操作,采用SPP模块的方式,比单纯的使用k×k最大池化的方式,极大地增加感受野,显著的分离了最重要的上下文特征;

trick2:PANet(Path Aggregation Network

PANet论文中融合的时候使用的方法是AddYOLOv4算法将融合的方法由add改为Concate,这是改进的一种特征图融合方式 ;

Prediction 

使用yolo v3的head

other tricks:

trick1:类标签平滑

对于分类特别是多分类问题,常常把标签转换成one-hot向量类别标签,对于损失函数,我们需要用预测概率去拟合真实概率,而拟合one-hot的真实概率函数会带来两个问题:

  • 无法保证模型的泛化能力,容易造成过拟合;
  • 全概率和零概率鼓励所属类别和其他类别之间的差距尽可能加大,而由梯度有界可知,这种情况很难适应,会造成模型过于相信预测的类别;

对预测有100%的信心可能表明模型只是在记忆训练数据,而不是在进行学习:标签平滑处理调整预测的目标上限为一个较低的值,比如0.995。即对分类准确做了一点惩罚,让模型不可以分类的太准确,它将使用这个值而不是1.0来计算loss,这种方法缓解了过拟合;

标签平滑就是一定程度缩小label中min和max的差距,label平滑可以减小过拟合,所以,适当调整label,让两端的极值往中间凑,以增加泛化性能。

trick2:CmBN

传统BN(batch normalization)是仅利用当前迭代时刻信息进行归一化操作,而CBN(cross batch normalization)在计算当前时刻统计量时候会考虑前k个时刻的统计量,从而实现扩大batch size操作;同时CBN操作不会引入比较大的内存开销,训练速度不会影响很多,但是训练时候会慢一些;

CmBN是CBN的改进版本,把大batch内的4个mini batch当做一个整体,对外隔离;CBN在第t时刻,也会考虑前3个时刻的统计量进行汇合,而CmBN操作不会,不再滑动cross,其仅仅在mini batch内部进行汇合操作,保持BN一个batch更新一次可训练参数;

BN:无论每个batch被分割为多少个mini batch,其算法就是在每个mini batch前向传播后统计当前的BN数据(即每个神经元的期望和方差)并进行Normalization,BN数据与其他mini batch的数据无关;

CBN:每次iteration中的BN数据是其之前n次数据和当前数据的和(对非当前batch统计的数据进行了补偿再参与计算),用该累加值对当前的batch进行Normalization,好处在于每个batch可以设置较小的size;

CmBN:只在每个Batch内部使用CBN的方法,如果每个Batch被分割为一个mini batch,则其效果与BN一致;若分割为多个mini batch,则与CBN类似,只是把mini batch当作batch进行计算,其区别在于权重更新时间点不同,同一个batch内权重参数一样,因此计算不需要进行补偿;

trick3:学习率循环余弦衰减 

学习率会先上升再下降,上升的时候使用线性上升,下降的时候模拟cos函数下降,循环执行多次;

trick4:改进的SAM(空间注意力机制)

空间注意力机制在深度学习中被广泛采用,Convolutional Block Attention Module (CBAM) 表示卷积模块的注意力机制模块,是一种结合了空间(spatial)和通道(channel)的注意力机制模块;

在这里插入图片描述

SAM中,最大值池化和平均池化分别用于输入feature map,创建两组feature map。结果被输入到一个卷积层,接着是一个Sigmoid函数来创建空间注意力;在YOLOv4中,使用修改后的SAM而不应用最大值池化和平均池化; 

trick5:DIoU-NMS

nms主要用于预测框的筛选,常用的目标检测算法中,一般采用普通的nms的方式;而Yolo v4将其中计算IOU的部分替换成DIOU的方式:

 DIOU被用作非最大值抑制(NMS)的一个因素,该方法在抑制冗余框的同时,采用IoU和两个边界盒中心点之间的距离,这使得它在有遮挡的情况下更加健壮;

在这里插入图片描述

关于DIOU等loss的总结,这里可以看看大佬的博客:

关于SIoU的原理和代码实现(回顾IoU、GIoU、DIoU、CIoU) 

trick6:遗传算法优化超参 

遗传算法如何模拟大自然的进化? 

还有一些tricks这里没有全部提到,大家可以看看下面的参考;

小结

YOLO-v4算法是在原有YOLO目标检测架构的基础上,采用了之前CNN领域中最优秀的优化策略,从数据处理、主干网络、网络训练、激活函数、损失函数等各个方面都有着不同程度的优化;

作者把训练的方法分成了两类:

Bag of freebies:只改变训练策略或者只增加训练成本,比如数据增强;

Bag of specials:插件模块和后处理方法,它们仅仅增加一点推理成本,但是可以极大地提升目标检测的精度;

参考文献

通道注意力

目标检测loss 

深度学习中的规范化 

目标检测算法YOLOv4详解

YOLO V4 — 网络结构和损失函数解析 

推荐一个大佬的代码实现(keras、tf2与torch):

Bubbliiiinghttps://blog.csdn.net/weixin_44791964/category_9408229.html?spm=1001.2014.3001.5482

仅为学习记录,侵删!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340