YOLOv4:目标检测的最佳速度和精度

news2025/1/12 20:56:13

来源:投稿 作者:王同学

编辑:学姐

《YOLOv4:Optimal Speed and Accuracy of Object Detection》

发表时间及作者:2020 CVPR


目录

1.YOLOv4介绍

2.YOLOv4网络结构

2.1  Backbone改进

2.2  Neck改进

3.YOLOv4训练策略

3.1BackBone训练策略

4.BackBone推理策略

4.1 Mish激活函数

4.2 MiWRC策略

5.检测头训练策略

5.1 CIoU-loss

5.2 CmBN策略

5.3 自对抗训练(SAT)

5.4 消除网格敏感度

6.检测头推理策略

6.1 SAM模块

6.2 DIoU-NMS

总结


1.YOLOv4介绍

Yolov4其实并没有提出什么创新点,主要是对当时领域内的一些Tricks(WRC、CSP、CmBN、SAT、Mish激活、Mosaic数据增强,DropBlock和CIoU)进行了大量的实验,并且对模型的精度和速度进行了平衡;最终在MS COCO数据集上实现了43.5% AP (65.7% AP50),在Tesla V100的实时速度为65帧/秒。

YOLOv4一共有如下三点贡献:

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

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

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

图1:YOLOv4与其他最先进的物体探测器的比较。在性能相当的情况下,YOLOv4运行速度是EfficientDet的两倍。YOLOv4将YOLOv3的AP和FPS分别提升10%和12%。


2.YOLOv4网络结构

YOLOv4结构组成如下:

• Backbone: CSPDarknet53

• Neck: SPP , PAN

• Head: YOLOv3


2.1  Backbone改进

YOLOv4借鉴了CSPNet(Cross Stage Partial Networks,跨阶段局部网络)的思想,对YOLOv3Darknet53网络进行了改进,形成了全新的主干网路结构--CSPDarknet53

采用CSP结构有如下几点好处:

1.加强CNN学习能力

2.删除计算瓶颈

3.减少内存成本

 

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

改进后的主干网络结构如下图所示

2.2  Neck改进

2.2.1 SPP结构介绍

SPP-Net全称Spatial Pyramid Pooling Networks,主要是用来解决不同尺寸的特征图如何进入全连接层的,如下2图所示,下图中对任意尺寸的特征图直接进行固定尺寸的池化,来得到固定数量的特征。

2.2.2 PAN结构介绍

PANPath Aggregation Network结构其实就是在FPN(从顶到底信息融合)的基础上加上了从底到顶的信息融合,如下图(PAN结构图)所示。

FPN结构图

PAN结构图

2.2.3 YOLOv4 PAN结构介绍

YOLOv4在原始PAN结构上进行了一点改进,如下图所示。图(a)是PAN论文中的原始融合方式,即特征层之间融合时是直接通过addition的方式进行融合的,但在YOLOv4中的PAN是通过在通道方向Concat拼接的方式进行融合的。


3.YOLOv4训练策略

这里首先介绍两个概念:Bag of FreebiesBag of Specials

Bag of Freebies指的是那些不增加模型复杂度,也不增加推理的计算量的训练方法技巧,来提高模型的准确度。目标检测经常采用的符合Bag of Freebies定义的是数据增强。数据增强的目的是增加输入图像的可变性,使所设计的目标检测模型对从不同环境中获取的图像具有更高的鲁棒性。例如,光学畸变和几何畸变是两种常用的数据增强方法,它们对目标检测有明显的好处。

Bag of Specials指的是那些增加少许模型复杂度或计算量的训练技巧,但可以显著提高模型的准确度。一般来说,这些插件模块是为了增强模型中的某些属性,如放大感受野、引入注意机制或增强特征集成能力等。

1.Backbone采用的Bag of Freebies

CutMixMosaic数据增强, DropBlock类标签平滑

2.Backbone采用的Bag of Specials

Mish激活函数, Cross-stage partial connections (CSP)多输入加权残差连接(MiWRC)

3.Detector采用的Bag of Freebies

CIoU损失CmBNDropBlock正则化Mosaic数据增强自对抗训练消除网格敏感性单目标使用多 Anchor,余弦退火最优超参数随机训练形状

4.Detector采用的Bag of Specials

Mish激活SPPSAMPAN路径聚合DIoU-NMS


3.1BackBone训练策略

3.1.1 数据增强

3.1.2 DropBlock正则化

DropBlock方法的引入是为了克服Dropout随机丢弃特征的主要缺点,Dropout被证明是全连接网络的有效策略,但在特征空间相关的卷积层中效果不佳。DropBlock技术在称为块的相邻相关区域中丢弃特征。这样既可以实现生成更简单模型的目的,又可以在每次训练迭代中引入学习部分网络权值的概念,对权值矩阵进行补偿,从而减少过拟合。如下图:

3.1.3 类标签平滑

训练样本中会出现少量的错误样本,而模型过于相信训练样本,在训练过程中调整参数极力去逼近样本,这就导致了这些错误样本的负面影响变大,因此需要在一定程度上减缓这些错误样本的影响,使得模型避免过于相信训练样本。


消融实验结果:

表1:BoF和Mish对CSPResNeXt-50分类精度的影响。


 表2 BoF和Mish对CSPDarknet-53分类器精度的影响。


 表3: Bag-of-Freebies的消融研究。(CSPResNeXt50-PANet-SPP 512 x512)。


 表4:Bag of Specials的消融实验。(Size 512 x512)。


4.BackBone推理策略

4.1 Mish激活函数

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

4.2 MiWRC策略

MiWRC是Multi-input weighted residual connections的简称, 在BiFPN中,提出了用MiWRC来执行标尺度级重加权,添加不同尺度的特征映射。我们已经讨论了FPNPAN作为例子。下面的图(d)显示了另一种被称为BiFPNneck设计,根据BiFPN的论文,该设计具有更好的准确性和效率权衡。

(a)FPN引入自顶向下的路径,将多尺度特征从3级融合到7级(P3-P7);

(b)PANET在FPN之上增加一个额外的自下而上的路径;

(c)NAS-FPN使用神经网络搜索找到一个不规则的特征拓扑网络,然后重复应用同一块拓扑结构;

(d)是这里的BiFPN,具有更好的准确性和效率权衡。将该neck放到整个整个网络的连接中如下图:

上图采用EfficientNet作为骨干网络,BiFPN作为特征网络,共享class/box预测网络。基于不同的资源约束,BiFPN层和类/盒网层都被重复多次。


5.检测头训练策略

5.1 CIoU-loss

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

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

5.3 自对抗训练(SAT)

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

5.4 消除网格敏感度

对于 b_x=c_x和 b_x=c_x+1的情况,我们需要t_x分别具有很大的负值和正值。但我们可以将 与一个比例因子(>1.0)相乘,从而更轻松地实现这一目标

6.检测头推理策略

6.1 SAM模块

YOLOv4SAM从空间注意修改为点注意,下图(a)图为原始SAM模块,下(b)图为改进的SAM模块

6.2 DIoU-NMS

根据DIOU的论文,如果只是单纯的使用NMS,即是使用IoU作为阈值去筛掉其他预测框时,当两个物体过于接近时,很有可能另外一个物体的预测框就被滤除了。

就像下图中的摩托。使用DIOU-NMS可以一定程度上提升对于靠近的物体的检测


总结

最后放上一些不同模型的速度和精度的比较。(一些文章仅说明了他们的探测器针对其中一个GPU的FPS:Maxwell/Pascal/Volta),可以看到,YOLOv4在速度和精度方面都优于最快和最准确的探测器。

CVPR 2022论文50+分类PDF免费领取👇👇👇

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

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

相关文章

java多线程基础

java多线程基础1. 线程是什么2. 线程的创建和运行方式1:继承Thread类示例:方式2:实现Runnable接口(推荐)示例:3. Thread类的常用方法4. 线程插队(1)yield 当前线程把时间片让给其它线程,不一定成功示例:(2&…

数据库基础-Mongodb数据库复制操作

Mongodb数据库复制操作 关闭mongodb的服务,如下图 创建以下文件夹 现在我们开启三个服务,端口号为9927做为主节点,9928做为从节点,9929做为仲裁节点 仲裁节点的作用是协调leader选举,监测系统运行状态,提供节点互相通讯的数据信息。 开启主服务: m…

【视觉高级篇】24 # 如何模拟光照让3D场景更逼真?(下)

说明 【跟月影学可视化】学习笔记。 什么是镜面反射? 如果若干平行光照射在表面光滑的物体上,反射出来的光依然平行,这种反射就是镜面反射。越光滑的材质,它的镜面反射效果也就越强,并且物体表面会有闪耀的光斑&…

Windows系统下HTTP(S)透明代理

本文为joshua317原创文章,转载请注明:转载自joshua317博客 Windows系统下HTTP(S)透明代理 - joshua317的博客 软件文档地址:goproxy/README_ZH.md at master snail007/goproxy GitHub 一、windows系统下进行下载及安装 分别有两个版本:proxy-admin …

Servlet学习笔记

1.在pom.xml中添加依赖 <dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><!-- 不会最终打包到服务器中去 --><scope>provided&…

SpringBoot内置tomcat启动过程及原理

作者&#xff1a;李岩科 1 背景 SpringBoot 是一个框架&#xff0c;一种全新的编程规范&#xff0c;他的产生简化了框架的使用&#xff0c;同时也提供了很多便捷的功能&#xff0c;比如内置 tomcat 就是其中一项&#xff0c;他让我们省去了搭建 tomcat 容器&#xff0c;生成 …

和年薪30W的阿里测试员聊过后,才知道自己一直在打杂...

前几天和一个朋友聊面试&#xff0c;他说上个月同时拿到了腾讯和阿里的offer&#xff0c;最后选择了阿里。 阿里内部将员工一共分为了14个等级&#xff0c;P6是资深工程师&#xff0c;P7是技术专家。 其中P6和P7就是一个分水岭了&#xff0c;P6是最接近P7的不持股员工&#x…

JavaScript-DOM操作表格

DOM操作表格的用途 DOM操作表格会在项目做数据展示的时候用到&#xff0c;其余地方使用并不多。 表格内容 <table><thead><tr><th>编号</th><th>姓名</th><th>性别</th><th>年龄</th></tr></thead…

二叉树遍历非递归算法

二叉树遍历非递归算法 文章目录二叉树遍历非递归算法二叉树的遍历一、先序遍历非递归算法算法构思&#xff1a;从先序遍历的递归算法得出循环算法的思路:下面进行框架构建:代码实操:二、中序遍历(左-根-右)非递归算法中序遍历二叉树的过程构建思路:根据以上思路&#xff0c;构建…

vscode 安装clangd插件 替代 c++自带插件

目录 1. 背景 2. 安装clangd 安装前&#xff1a;禁用c插件 2.1 clangd插件名称 2.2 安装 2.3 配置 settings.json 2.4 语言服务器下载 2.5 安装 cmake tools 2.6 设置编译选项 3. 生成 compile_command.json 4. 查看使用效果 1. 背景 vscode c开大家一般用 vscode 自家…

磨金石教育摄影技能干货分享|乡愁摄影作品欣赏

乡愁是是什么&#xff1f; 我们走在异乡的街道上&#xff0c;人声嘈杂的一瞬间&#xff0c; 或许是某个角落&#xff0c;或许是某个人的声音&#xff0c; 让你感到无比的熟悉&#xff0c;在你的记忆深处掀起了一阵阵浪花。 这个熟悉的感觉就是乡愁 它可以是家乡的一棵树 …

JUC(5) : ForkJoinPool | 线程的极致管理

一、前言 前文介绍了线程的异步编排工具类 CompletableFuture 的使用&#xff0c;使用它能够很好的完成线程任务的编排工作&#xff0c;但同时&#xff0c;我们也注意到&#xff0c;其使用的默认线程池是 ForkJoinPool.commonPool() 的方法。则这个线程池是共用的&#xff0c;…

一个普通前端的2022年终总结:多病的一年

多病 用一个词总结我的2022 &#xff0c;毫无疑问是【多病】。 翻看挂号记录&#xff0c;今年累计跑了19次医院&#xff0c;除去定期的脱发复查、尿常规复查外&#xff0c;其他还得了皮肤病、急性咽炎、筋膜炎、结膜炎、肾结石、慢性胃炎、胸闷&#xff0c;体验过了无法忍受的…

基于java+springmvc+mybatis+jsp+mysql的网络作者与美工交流平台

项目介绍 本次设计任务是要设计一个网络作者与美工交流平台&#xff0c;通过这个系统能够满足网络作者与美工交流信息的管理及版主的网络作者与美工交流信息管理功能。系统的主要功能包括&#xff1a;主页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;版主管理&#…

text文本属性

text文本属性 源代码 color color属性用于定义文本的颜色&#xff0c;有预定义的颜色值(red, blue, yellow)、十六进制(#FF0000, #FF6600,#29D794)、RBG代码(rgb(255,0,0)或rgb(100%,0%,0%)) text-align text-align属性用于设置元素内文本的水平对…

R语言对BRFSS数据探索回归数据分析

执行摘要 最近我们被客户要求撰写关于BRFSS的研究报告&#xff0c;包括一些图形和统计输出。该项目包括探索一个现实世界的数据集-CDC的2013年 行为风险因素监视系统 -并针对三个 选择的研究问题创建报告。 选择的研究问题及其各自的结果是&#xff1a; 被访者对其健康状况…

Redis框架(一):Redis入门和Jedis连接池

Redis入门和Jedis连接池&#xff1a;基本介绍实例Demo源码分析SpringCloud章节复习已经过去&#xff0c;新的章节Redis开始了&#xff0c;这个章节中将会回顾Redis 主要依照以下几个原则 基础实战的Demo和Coding上传到我的代码仓库在原有基础上加入一些设计模式&#xff0c;st…

c#扩展方法

1、前言: 通常,我们想要向一个类型中添加方法,可以通过以下两种方式: 修改源代码。 在派生类中定义新的方法。 但是以上方法并不是万能的,我们并不能保证拥有一个类型的源码,也并不能保证这个类型可以让我们继承(如结构,枚举,String等等)。但是C#提供了一个办法,…

教你如何写一个符合自己需求的小程序日历组件

1|0 前言 很多时候&#xff0c;我们生活中会有各种打卡的情况&#xff0c;比如 keep 的运动打卡、单词的学习打卡和各种签到打卡或者酒店的入住时间选择&#xff0c;这时候就需要我们书写一个日历组件来处理我们这种需求。 但是更多时候&#xff0c;我们都是网上找一个插件直…

【HBase】【一】windows搭建源码开发环境

目录环境配置1. Windows安装Cygwin2. 安装ProtocolBuffers3. 启动zookeeper4. 搭建Hadoop环境5. 编译Hbase源码6. 启动HRegionServer7. 启动HMaster8. 启动HShell客户端环境配置 系统&#xff1a;windows10 IDE: Eclipse hadoop: 3.3.4 hbase: 2.4.15 java: 17 1. Window…