YOLOv4来了,大型调优现场,速度和准确率俱佳
作者 | VincentLee
来源 | 晓飞的算法工程笔记
简介
论文提出YOLOv4,从图1的结果来看,相对于YOLOv3在准确率上提升了近10个点,然而速度并几乎没有下降,论文主要贡献如下:
提出速度更快、精度更好的检测模型,仅需要单张1080Ti或2080Ti即可完成训练。
验证了目前SOTA的Bag-ofFreebies(不增加推理成本的trick)和Bag-of-Specials(增加推理成本的trick)的有效性。
修改了SOTA方法,让其更高效且更合适地在单卡进行训练,包括CBN、PAN、SAM等。
方法论
Selection of architecture
对检测模型来说,分类最优的主干网络不一定是最合适的,适用于目标检测的主干网络需满足以下要求:
高输入分辨率,提高小物体的检测准确率。
更多的层,提高感受域来适应输入的增加。
更多的参数,提高检测单图多尺寸目标的能力。
理论来讲,应该选择感受域更大且参数了更大的模型作为主干网络,表1对比了三种SOTA主干网络的,可以看到CSPDarknet53的感受域、参数量以及速度都是最好的,故选其为主干网络。
另外,使用不同大小的感受域有以下好处:
匹配物体大小,可以观察完整的物体。
匹配网络大小,可以观察物体的上下文信息。
超过网络的大小,增加点与最终激活之间的连接数。
为此,YOLOv4加入了SPP block,能够显著地改善感受域大小,而且速度几乎没有什么下降。
另外,使用PANet替换FPN来进行多通道特征的融合。
最终,YOLOv4选择CSPDarknet53作为主干网络,配合SPP模块,PANet通道融合以及YOLOv3的anchor based head。
Selection of BoF and BoS
目前比较有效的目标检测提升的trick:
激活函数: ReLU, leaky-ReLU, parametric-ReLU, ReLU6, SELU, Swish, or Mish。
bbox回归损失: MSE, IoU, GIoU, CIoU, DIoU
数据增强: CutOut, MixUp, CutMix
正则化方法: DropOut, DropPath, Spatial DropOut, or DropBlock
归一化方法: Batch Normalization(BN), Cross-GPU Batch Normalization(CGBN or SyncBN), Filter Response Normalization (FRN), or Cross-Iteration Batch Normalization(CBN)
由于PReLU和SELU难以训练,并且ReLU6是专门为量化网络设计的,从激活函数中去除这几种。而在正则化方法中,DropBlock的效果是最优的。对于归一化方法的选择,由于需要单卡训练,因此不考虑SyncBN。
Additional improvements
为了让模型能更好地在单卡进行训练,做了以下的改进:
提出新的数据增强方法Mosaic和Self-Adversarial Training (SAT)。
使用遗传算法选择最优的超参数。
修改目前的方法来让训练和检测更有效,包括改进的SAM,改进的PAN以及 Cross mini-Batch Normalization (CmBN)
Mosaic是新的数据增强方法,同时融合4张训练图片,CutMix仅融合2张图片,使得目标的检测范围超出其正常的上下文,另外BN每次统计4张图片,这能显著地减少对大mini-batch的需要。
Self-Adversarial Training(SAT)也提供新的数据增强手段,分为两个前向反向阶段。在第一阶段,先对图片进行前向计算,然后通过反向传播修改图片的像素,注意这里不修改网络的权重,通过这种方式,网络进行了一次对抗式训练,制造出没有目标的假象。在第二阶段,对修改后的图片进行正常的训练。
CmBN是改进版的CBN,仅统计single-batch中的mini-batch,如图4所示,假设t-3~t为single-batch中的mini-batch,若干single-batch中包含单个mini-batch,则CmBN与BN一样。
将SAM从spitial-wise attention修改为point-wise attention,即输入和输出的大小一致。
将PAN的shortcut连接方法,从相加改为concate。
YOLOv4
YOLOv4包含:
Backbone:CSPDarknet53
Neck:SPP,PAN
Head:YOLOv3
YOLO v4使用:
主干网络的BoF(Bag of Freebies):CutMix和Mosaic数据增强, DropBlock正则化, 标签平滑(Class label smoothing)
主干网络的BoS(Bag of Specials):Mish激活, Cross-stage partial connections (CSPNet), Multiinput weighted residual connections(MiWRC)
检测端的BoF(Bag of Freebies):CIoU-loss, CmBN, DropBlock正则化, Mosaic数据增强, Self-Adversarial Training, 去除边框敏感性(Eliminate grid sensitivity,见实验部分的解释), 多anchor回归(之前只选最大的), 余弦退火学习率调整(Cosine annealing scheduler), 使用遗传算法最优化超参数, 随机输入大小
检测端的BoS(Bag of Specials):Mish激活, SPP-block, SAM-block, PAN通道融合, DIoU-NMS
实验
Influence of different features on Classifier training
CutMix、Mosaic数据增强和标签平衡(Class label smoothing)比较有效。
Influence of different features on Detector training
表4对比的BoF如下:
S:去除边框敏感性,,之前的中心点回归与anchor的边相关,当需要趋近或时,需要很大的,为此对sigmoid添加一个大于1的因子来减少这个影响
M:Mosaic数据增强
IT:IoU阈值,使用大于IoU阈值的anchor进行训练,之前好像只选最大的
GA:使用遗传算法进行最优超参选择
LS:标签平滑
CNB:论文提出的CmBN
CA:使用余弦退火(Cosine annealing scheduler)进行学习率下降
DM:动态mini-batch大小,小分辨率时增加mini-batch
OA:使用最优的anchors
GIoU, CIoU, DIoU, MSE:bbox损失函数
论文也对比了检测端的BoS,从结果来看,SPP、PAN和SAM同时使用时效果最好。
Influence of different backbones and pretrained weightings on Detector training
论文研究了不同主干网络对检测准确率的影响,可以看到CSPDarknet53能更好地适应各种改进。
Influence of different mini-batch size on Detector training
论文对比了不同的mini-batch大小下的检测准确率,在加入BoF和BoS训练策略后,mini-batch的改变几乎对准确率没有影响。
Results
表8、9和10分别为Maxwell GPU、Pascal GPU和Volta GPU上的实验结果,从大量的实验对比来看,YOLOv4在速度和准确率上都十分耐看。
结论
YOLOv4在速度和准确率上都十分优异,作者使用了大量的trick,论文也写得很扎实,在工程还是学术上都有十分重要的意义,既可以学习如何调参,也可以了解目标检测的SOTA trick。
论文地址:https://arxiv.org/abs/2004.10934
论文代码:https://github.com/AlexeyAB/darknet
推荐阅读
那个分分钟处理 10 亿节点图计算的 Plato,现在怎么样了?
看似毫不相干,哲学与机器学习竟有如此大的交集
黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快来认识一下
“谷歌杀手”发明者,科学天才 Wolfram
数据库激荡 40 年,深入解析 PostgreSQL、NewSQL 演进历程
5分钟!就能学会以太坊 JSON API 基础知识
你点的每个“在看”,我都认真当成了AI
相关文章:

关于对J2EE几点误解和错误认识的澄清
转自:http://www.jdon.com .Net和J2EE的争论一直没有停止,我也参加过“程序员”杂志主持的“.Net和Java之争”之类的讨论,本来这两种技术都是为用户提供了竞争性的选择,对于用户来说是一件好事,多种选择远胜于单一选择…

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in r...
2019独角兽企业重金招聘Python工程师标准>>> Struts Problem Report Struts has detected an unhandled exception: Messages: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or re…
Java的Redis连接池代码性能不错
其实这个是引用自网友http://blog.csdn.net/tuposky/article/details/45340183,有2个版本,差别就是ReentrantLock和synchronized。另外原作者使用了断言,我觉得这个还是不用为好。 ReentrantLock版 import java.util.concurrent.locks.Reent…
降低预测过程计算成本,这些NLP模型压缩方法要知道
编译 | 凯隐出品 | AI科技大本营(ID:rgznai100)近年来,基于谷歌Transformer的语言模型在神经机器翻译,自然语言推理和其他自然语言理解任务上取得了长足进展。通过多种语言模型的平均损失进行自我监督预训练,使得在大范…

政府要尽快对应用商店出台管理办法
前两天联想的开发者大会,我和联想的CTO贺志强先生联合接受了一个视频访谈,贺先生谈到联想的乐园软件商店,组织大量的人力对于软件进行检测,以保证软件是合格产品,不会给用户一路带来侵害,对于联想这种负责态…

antlr-2.7.6.jar的作用
项目中没有添加antlr-2.7.6.jar,hibernate不会执行hql语句 并且会报NoClassDefFoundError: antlr/ANTLRException错误

junit集成Hamcrest测试集合中某个属性是否包含特定值
junit已经集成Hamcrest但是还是需要引用hamcrest-library,不然只有基本方法,高级的没有 <dependency> <groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test<…
腾讯第100个开源项目:微信开源推理加速工具TurboTransformers
出品 | AI科技大本营(ID:rgznai100)4月24日,腾讯正式宣布开源Transformer推理加速工具TurboTransformers。该工具面向自然语言处理领域中Transformers相关模型丰富的线上预测场景,在微信、腾讯云、QQ看点等产品的线上服务中已经广…

程序员:提高编程效率的技巧
本文写给那些认为在项目上所花时间和效率成正比的程序员。我要说的是,事实并非如此。虽然你需要在电脑前敲键盘输入东西,但这只和编程沾上一点边。那么,程序员该如何利用时间呢? 俗话说,磨刀不误砍柴工,拿出…

Qunee for HTML5 V2.5新版本发布
为什么80%的码农都做不了架构师?>>> Qunee for HTMl5 V2.5 beta2版本正式发布,此次版本内核改动较大,采用了新的2D渲染引擎,增加了延迟绘制功能,大幅改善画布的浏览体验,此外重构了鼠标键盘以及触控交互监听处理,增加右键框选功能,改善了多点触控交互,增…
泛型推断类型不符合上限
程序报错推断类型不符合上限 springsecurity需要自定义用户服务 代码 Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(new CustomUserDetailsService());}public class CustomUserDetailsService implemen…
如何通过深度学习,完成计算机视觉中的所有工作?
Mask-RCNN做对象检测和实例分割作者 | George Seif译者 | 天道酬勤,责编 | Carol出品 | AI科技大本营(ID:rgznai100)Mask-RCNN做对象检测和实例分割:https://miro.medium.com/max/1200/1*s9raSe9mLeSSuxE3API-ZA.gif你想做计算机视…

Windows PowerShell 2.0语言之字面类型系统
PowerShell语言允许通过一个字面类型(type Literals)来访问类型,它是用括号抬起的类型名,返回.NET底层的System.Type对象实例,如: PS C:\> [System.Int32]IsPublic IsSerial Name …

建立名称server
一、实验的目的:实现DNSserver功能,提供正向、反向解析二、实验环境装有Linux的Windows系统IP为192.168.6.3的虚拟机三、实验目的建立gr.org域的主名称server。解析:名称 IP 用途ns.gr.org 192.168.…

Java的JSON操作存储List到Redis
使用jackson和json-lib都可以 <dependency> <groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.13</version></dependency><dependency><groupId>net.sf.json-li…

关注基于云的下一代应用开发
接受经济和信息化的视频专访专访的主页地址为:http://www.enicn.com/article/2010-08-20/0R064b52010.shtml我的其他视频,请参考土豆空间,地址为http://www.tudou.com/home/larryvmw。
确认了!MySQL 狠甩 Oracle 稳居 Top1!
01几乎所有程序员都会用到的 MySQL稳居 Top 1科技长河,顺之者昌,错失者亡。在2019年,CSDN面向具备超强计算力的数字化世界,我们进行了「大数据技术应用现状分析」,并发布了《2019-2020 年中国开发者调查报告》。发现&a…

[AWK]使用AWK进行分割字符串以及截取字符串
如何split当前的字符串,用$0,例如: cat num.2012032911 | awk {print $2} | awk {split($0,b,".");print b[2]} | cut -c 3- 获取第二列,例如第二列是com.sb3456.you那么在split当前的这个字符串获得sb3456,最后截取sb3…
SpringMVC集成Tiles布局引擎框架
Tiles布局框架, http://tiles.apache.org/ Spring已经对Tiles进行了集成。页头页尾公共模板页要靠这个,不然重复代码太多。 <dependency><groupId>org.apache.tiles</groupId><artifactId>tiles-servlet</artifactId><…

VC 文件操作(文件查找,打开/保存,读/写,复制/删除/重命名)
右击项目->属性->字符集:使用多字节字符集。这样可以使用char到CString的转化。char sRead[20] ""; CString strtest sRead; 大气象 //文件查找/*CString strFileTitle;CFileFind finder;BOOL bWorking finder.FindFile(_T("C:\*.sys"…
程序员会懂的冷笑话:各大编程语言的内心独白
作者 | Anupam Chugh译者 | 弯月,责编 | 夕颜出品 | CSDN(ID:CSDNnews)软件工程领域鱼龙混杂。有些人乐不思蜀,而有些人则饱受打击。然而,构建软件的工作让每个人倍感压力,这点毋庸置疑。在本文…

swift集成alamofire的简单封装
import UIKit import Alamofire enum MethodType{ case GET case POST } class NetworkTool: NSObject { class func request(type : MethodType ,urlString : String , paramters: [String :Any]? nil,finishedCallback : escaping (_ result : Any) -> ()) { //判断是什…
Go后台项目架构思考与重构 | 深度长文
作者 | 腾讯云后台工程师黄雷编辑 | 唐小引来源 | CSDN(ID:CSDNnews)引言本文首先介绍了架构的重要性,随后从一个实际项目的重构过程作为主线,逐步引出主流的架构设计思想以及其所解决的实际问题是什么。通过阅读本文&…

前途到底是网络工程还是程序设计
本人89年年底生的,现在快满21了,大二的时候过的国家网络工程师考试,并不是cisco的网络支持工程师,大三也就是现在,在学校花销太大,想自己赚点钱,于是在学校招聘会上应聘了一家通信公司ÿ…

FAIL - Deployed application at context path / but context failed to start
IDE报错:FAIL - Deployed application at context path / but context failed to start 编译通过,这个错误原因是很多地方被误用,导致Spring运行时不能解析某些Class导致, 例如:ModelAndView用错 public ModelAndView…

项目ITP(五) spring4.0 整合 Quartz 实现任务调度
2014-05-16 22:51 by Jeff Li 前言 系列文章:[传送门] 项目需求: 二维码推送到一体机上,给学生签到扫描用。然后须要的是 上课前20分钟 。幸好在帮带我的学长做 p2p 的时候。接触过。自然 quartz 是首选。所以我就配置了下,搞了个…
Spring security防止跨站请求伪造(CSRF防护)
因为使用了spring security 安全性框架 所以spring security 会自动拦截站点所有状态变化的请求(非GET,HEAD,OPTIONS和TRACE的请求),防止跨站请求伪造(CSRF防护),即防止其他网站或是程序POST等请求本站点。…
从Ops到NoOps,阿里文娱智能运维的关键:自动化应用容量管理
作者| 阿里文娱高级开发工程师 金呈编辑 | 夕颜来源 | CSDN(ID:CSDNnews)概述1. 背景随着业务形态发展,更多的生产力集中到业务创新,这背后要求研发能力的不断升级。阿里文娱持续倾向用更加高效、稳定、低成本的方式支…

JAVA目录树(全功能),Java+ajax实现
我自己要的功能全实现了 一:双击选中项进行编辑 二:右键菜单功能(新增,删除,修改,自定义颜色什么的) 三:选中项进行拖动事件 四:输入项进入搜索(并自动选中结果项) 2011.03.14更新功能 …

SiteMesh介绍
1. SiteMesh简介 SiteMesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权等等。它不仅仅能处理动态的内容,…