万字长文解析Scaled YOLOv4模型(YOLO变体模型)
一,Scaled YOLOv4
Scaled YOLOv4
的二作就是YOLOv4
的作者Alexey Bochkovskiy
。
摘要
作者提出了一种网络缩放方法,不仅可以修改深度、宽度、分辨率,还可以修改网络的结构。
1,介绍
实验结果表明,基于 CSP
方法的 YOLOv4
目标检测模型在保持最优速度和准确率的前提下,同时也具有向上/向下可伸缩性,可用于不同大小的网络。由此,作者提出了一种网络缩放方法,它不仅改变深度、宽度、分辨率,而且还改变网络的结构。
主要工作。Scaled YOLOv4
的主要工作如下:
- 设计了一种针对小模型的强大的模型缩放方法,系统地平衡了浅层
CNN
的计算代价和存储带宽; - 设计一种简单有效的大型目标检测器缩放策略;
- 分析各模型缩放因子之间的关系,基于最优组划分进行模型缩放;
- 实验证实了
FPN
结构本质上是一种once-for-all
结构; - 利用上述方法研制了
YOLOv4-tiny
和YOLO4v4-large
模型。
以往模型缩放,如 EfficientDet
无非是首先选择网络基础模块,它往往又好又快,然后针对影响目标检测的重要参数如:网络宽度 \(w\)、深度 \(d\)、输入图像分辨率size
等进行(满足一定条件下按照一定规律)调参,或者 NAS
自动调参。
2,相关工作
2.1,模型缩放
传统的模型缩放是指改变模型的深度,如 VGG
变体,以及后边可以训练更深层的 ResNet
网络等;后面 agoruyko
等人开始考虑模型的宽度,通过改变卷积层卷积核的数量来实现模型缩放,并设计了 Wide ResNet
[43],同样的精度下,它的参数量尽管比原始 ResNet
多,但是推理速度却更快。随后的 DenseNet
和 ResNeXt
也设计了一个复合缩放版本,将深度和宽度都考虑在内。
何凯明等人提出的
ResNet
网络解决了随着深度增加带来的网络退化问题。
3,模型缩放原则
3.1,模型缩放的常规原则
这段内容,原作者的表达不够严谨,计算过程也没有细节,所以我不再针对原文进行一一翻译,而是在原文的基础上,给出更清晰的表达和一些计算细节。
这里,我们得先知道对一个卷积神经网络来说,其模型一般是由 conv stage
、conv block
、conv layer
组成的。我以 ResNet50
为例进行分析,大家就能明白了。ResNet50
的卷积过程分成 4
个 stage
,分别对应的卷积 blocks
数目是 \([3,4,6,3]\),卷积 block
是 bottleneck
残差单元,bottleneck
残差单元又是 \(1\times 1\)、\(3\times 3\) 和 \(1\times 1\) 这样 3
个卷积层组成的,所以 ResNet50
总共的卷积层数目为:\(3\times 3 + 4\times 3+ 6\times 3 + 3\times 3 = 48\),再加上第一层的卷积和最后一层的分类层(全连接层),总共是 50
层,所以命名为 ResNet50
。ResNet
模型的组成和结构参数表如下图所示。
大部分
backbone
都是分成4
个stage
。
对一个基础通道数是 \(b\) 的卷积模块(conv block
),总共有 \(k\) 个这样的模块的 CNN
网络来说,其计算代价是这样的。如 ResNet
的总的卷积层的计算量为 \(k\ast [conv(1\times 1,b/4)\rightarrow conv(3\times 3,b/4)\rightarrow conv(1\times 1,b)]\);ResNeXt
的总的卷积层的计算量为 \(k\ast [conv(1\times 1,b/2)\rightarrow gconv(3\times 3/32, b/2)\rightarrow conv(1\times 1, b)]\);Darknet
网络总的计算量为 \(k\ast [conv(1\times 1,b/2)\rightarrow conv(3\times 3, b)]\)。假设可用于调整图像大小、层数和通道数的缩放因子分别为 \(\alpha\)、\(\beta\) 和 \(\gamma\)。当调整因子变化时,可得出它们和 FLOPs
的关系如下表所示。
这里以 Res layer
为例,进行计算量分析。首先上表的 \(r\) 应该是指每个 stage
中间的残差单元的计算量,而且还是 bottleneck
残差单元,因为只有 stage
中间的 bottleneck conv block
的第一个 \(1\times 1\) 卷积层的输入通道数才是输出通道数的 4
倍,只有这种情况算出来的计算量 \(r\) 才符合表 1
的结论。
卷积层 FLOPs
的计算公式如下,这里把乘加当作一次计算,公式理解请参考我之前写的 文章。
\(FLOPs=(C_i\times K^2)\times H\times W\times C_o\)
对于上面说的那个特殊的 bottleneck conv block
来说,卷积过程特征图大小没有发生变化,假设特征图大小为 \(wh\),所以 bolck
的 FLOPs
为:
r1 &= (b \times 1^2\times \frac{b}{4} + \frac{b}{4} \times 3^2\times \frac{b}{4} + \frac{b}{4} \times 1^2\times b)\times hw \\\\
&= \frac{17}{16}whb^2
\end{align*}\]
这里值得注意的是,虽然各个 conv block
会略有不同,比如 每个 conv stage
的第一个 conv block
都会将特征图缩小一倍,但是其 FLOPs
和 \(r1\) 是线性的关系,所以,对于有 \(k\) 个 conv block
的 ResNet
来说,其总的计算量自然就可大概近似为 \(17whkb^2/16\)。ResNeXt
和 Darknet
卷积层的 FLOPs
计算过程类似,所以不再描述。
由表 1
可以看出,图像大小、深度和宽度都会导致计算代价的增加,它们分别成二次,线性,二次增长。
Wang
等人提出的 CSPNet 可以应用于各种 CNN
架构,同时减少了参数和计算量。此外,它还提高了准确性,减少了推理时间。作者把它应用到 ResNet, ResNeXt,DarkNet
后,发现计算量的变化如表 2
所示。
CNN
转换为 CSPNet
后,新的体系结构可以有效地减少 ResNet
、ResNeXt
和 Darknet
的计算量(FLOPs
),分别减少了 23.5%
、46.7%
和 50.0%
。因此,作者使用 CSP-ized
模型作为执行模型缩放的最佳模型。
3.2,为低端设备缩放的tiny模型
对于低端设备,设计模型的推理速度不仅受到计算量和模型大小的影响,更重要的是必须考虑外围硬件资源的限制。因此,在执行 tiny
模型缩放时,我们必须考虑以下因素:内存带宽、内存访问代价(MACs
)和 DRAM traffic
。为了考虑到以上因素,我们的设计必须遵循以下原则:
1,使计算复杂度少于 \(O(whkb^2)\)。
作者分析了高效利用参数的网络:DenseNet
和 OSANet
的计算量,分别为 \(O(whgbk)\)、\(O(max(whbg, whkg^2))\)。两者的计算复杂度阶数均小于 ResNet
系列的 \(O(whkb^2)\)。因此,我们基于 OSANet
设计 tiny
模型,因为它具有更小的计算复杂度。
这里的
OSANet
其实是 VoVNet 网络,专门为GPU
平台设计的更高效的backbone
网络架,其论文解读可参考我之前写的文章。
2,最小化/平衡 feature map 的大小
说实话,没看明白论文这段内容,这不是跟论文
CSPNet
一样的结论吗,即分割为通道数相等的两条路径。
为了获得在计算速度方面的最佳平衡,我们提出了一个新概念:在CSPOSANet
的计算块之间执行梯度截断。如果我们将原来的 CSPNet
设计应用到 DenseNet
或 ResNet
架构上,由于这两种架构的第 \(j\) 层输出是第 \(1^{st}\) 层到第 \((j-1)^{th}\) 层输出的积分,我们必须将整个计算块作为一个整体来处理。由于 OSANet
的计算块属于 PlainNet
架构,从计算块的任意层制作 CSPNet
都可以达到梯度截断的效果。我们利用该特性对基层的 \(b\) 通道和计算块(computational block
)生成的 \(kg\) 通道进行重新规划,并将其分割为通道数相等的两条路径,如表 4
所示。
当通道数量为 \(b + kg\) 时,如果要将这些通道分割成两条路径,最好将其分割成相等的两部分,即 \((b + kg)/2\)。
3,在卷积后保持相同的通道数
评估低端设备的计算成本,必须考虑功耗,而影响功耗的最大因素是内存访问代价(\(MAC\))。根据 Shufflenetv2
的推导证明,可知卷积层的输入输出通道数相等时,即 \(C_{in} = C_{out}\) 时, \(MAC\) 最小。
4,最小化卷积输入/输出(CIO)
CIO
是一个可以测量 DRAM IO
状态的指标。表 5
列出了 OSA
、CSP
和我们设计的 CSPOSANet
的 CIO
。当 \(kg > \frac {b}{2}\) 时,CSPOSANet
可以获得最佳的 CIO
。
3.3,为高端设备缩放的Large模型
feature pyramid network
(FPN
)的架构告诉我们,更高的 stage
更适合预测大的物体。表 7
说明了感受野与几个参数之间的关系。
从表 7
可以看出,宽度缩放可以独立操作。当输入图像尺寸增大时,要想对大对象有更好的预测效果,就必须增大网络的 depth
或 stage
(一般每个 stage
都会降低特征图分辨率的一半)的数量。在表 7
中列出的参数中,\(\left \{ size^{input}, \#stage \right \}\) 的组合效果最好。因此,当执行缩放时,我们首先在 \(\left \{ size^{input} \right \}\),#stage
上执行复合缩放,然后根据实时的环境,我们再分别进一步缩放深度 depth
和宽度 width
。
4,Scaled-YOLOv4
4.1,CSP-ized YOLOv4
YOLOv4
是为通用 GPU
上的实时目标检测而设计的。
1,Backbone
为了获得更好的速度/精度权衡,我们将第一个 CSP
阶段转换为原始的 DarkNet
的残差层。
没能理解这段内容。
2,Neck
3,SPP
4.2,YOLOv4-tiny
YOLOv4-tiny
是为低端 GPU
设备设计的,设计将遵循 3.2
节中提到的原则。
我们将使用 PCB
(partial in computational block
) 架构的 CSPOSANet
作为 YOLOv4
backbone
。我们设 \(g = b/2\) 为增长率,最终使其增长到 \(b/2 + kg = 2b\)。通过计算,我们得到 \(k = 3\)。YOLOv4
的卷积块(computational block
)结构如图 3
所示。对于每个阶段的通道数量和 neck
网络结构,我们采用 YOLOv3-tiny
一样的设计。
4.3,YOLOv4-large
专门为云端 GPU
设计的,主要目的就是为实现高精度的目标检测。我们设计了一个完全 CSP
化的模型 YOLOv4-P5
,并将其扩展到 YOLOv4-P6
和 YOLOv4-P7
。Sacled-YOLOv4
large
版本的模型结构图,如下图所示。
我们通过设计 \(size^{input}\), #stage
来对 backbone
执行复合缩放。我们把每个 stage
的深度设置为 \(2^{d_{s_{i}}}\)。\(d_s\) 范围为 \([1, 3, 15, 15, 7, 7, 7]\)。与之前的 ResNet
的卷积划分为 4
个 stage
不同,这里最多划分为 7
个 stage
(YOLOv4-P7
)。
5,实验
与其他实时目标检测检测器进行比较,对比实验结果如表 11
所示。
总结
通篇论文看下来,感觉这篇论文最主要的贡献在于通过简单的理论分析和对比实验,验证了模型缩放的原则,进一步拓展了 CSPNet
方法,并基于此设计了一个全新的 Scaled-YOLOv4
。个人感觉就是针对不同的 GPU
平台,可以根据作者分析出来的模型缩放理论且符合其他一些原则的情况下,通过选择不同的模型宽度和深度参数,让模型更深更宽。
anchor-free
的方法,如centernet
是不需要复杂的后处理,如NMS
。Backbone
模型的宽度、深度、模块的瓶颈比(bottleneck
)、输入图像分辨率等参数的关系。
Reference
[43] Sergey Zagoruyko and Nikos Komodakis. Wide residualnet works. arXiv preprint arXiv:1605.07146, 2016.
参考资料
- Scaled-YOLOv4: Scaling Cross Stage Partial Network
- Scaled-YOLOv4: Scaling Cross Stage Partial Network 论文翻译
万字长文解析Scaled YOLOv4模型(YOLO变体模型)的更多相关文章
- 性能追击:万字长文30+图揭秘8大主流服务器程序线程模型 | Node.js,Apache,Nginx,Netty,Redis,Tomcat,MySQL,Zuul
本文为<高性能网络编程游记>的第六篇"性能追击:万字长文30+图揭秘8大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让 ...
- 万字长文:从计算机本源深入探寻volatile和Java内存模型
万字长文:从计算机本源深入探寻volatile和Java内存模型 前言 在本篇文章当中,主要给大家深入介绍Volatile关键字和Java内存模型.在文章当中首先先介绍volatile的作用和Java ...
- 万字长文,以代码的思想去详细讲解yolov3算法的实现原理和训练过程,Visdrone数据集实战训练
以代码的思想去详细讲解yolov3算法的实现原理和训练过程,并教使用visdrone2019数据集和自己制作数据集两种方式去训练自己的pytorch搭建的yolov3模型,吐血整理万字长文,纯属干货 ...
- LevelDB学习笔记 (3): 长文解析memtable、跳表和内存池Arena
LevelDB学习笔记 (3): 长文解析memtable.跳表和内存池Arena 1. MemTable的基本信息 我们前面说过leveldb的所有数据都会先写入memtable中,在leveldb ...
- c# winform用sharpGL(OpenGl)解析读取3D模型obj
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11783026.html 自己写了个简单的类读取解析obj模型,使用导入类,然后new个对象,在 ...
- 【万字长文】使用 LSM-Tree 思想基于.Net 6.0 C# 实现 KV 数据库(案例版)
文章有点长,耐心看完应该可以懂实际原理到底是啥子. 这是一个KV数据库的C#实现,目前用.NET 6.0实现的,目前算是属于雏形,骨架都已经完备,毕竟刚完工不到一星期. 当然,这个其实也算是NoSQL ...
- 万字长文,详解推荐系统领域经典模型FM因子分解机
在上一篇文章当中我们剖析了Facebook的著名论文GBDT+LR,虽然这篇paper在业内广受好评,但是毕竟GBDT已经是有些老旧的模型了.今天我们要介绍一个业内使用得更多的模型,它诞生于2010年 ...
- 万字长文 | 23 个问题 TCP 疑难杂症全解析
每个时代,都不会亏待会学习的人. 在进入今天主题之前我先抛几个问题,这篇文章一共提出 23 个问题. TCP 握手一定是三次?TCP 挥手一定是四次? 为什么要有快速重传,超时重传不够用?为什么要有 ...
- Cesium案例解析(四)——3DModels模型加载
目录 1. 概述 2. 代码 3. 解析 4. 参考 1. 概述 Cesium自带的3D Models示例,展示了如何加载glTF格式三维模型数据.glTF是为WebGL量身定制的数据格式,在网络环境 ...
- 2万字长文包教包会 JVM 内存结构 保姆级学习笔记
写这篇的主要原因呢,就是为了能在简历上写个"熟悉JVM底层结构",另一个原因就是能让读我文章的大家也写上这句话,真是个助人为乐的帅小伙....嗯,不单单只是面向面试学习哈,更重要的 ...
随机推荐
- 220514 T1 查询 (二分查找+vector)
用vector记录每个数出现的位置,对于要查询的X,要找他落在L~R的个数有几个,用lower_bound和upper_bound查找,相减就是答案. 1 #include<bits/stdc+ ...
- SQL基础语句入门
SQL语句入门 起因 学校开设数据库相关的课程了,打算总结一篇关于基础SQL语句的文章. SQL介绍 SQL最早版本是由IBM开发的,一直发展到至今. SQL语言有如下几个部分: 数据定义语言DDL: ...
- 记一次 .NET 某电子病历 CPU 爆高分析
一:背景 1.讲故事 前段时间有位朋友微信找到我,说他的程序出现了 CPU 爆高,帮忙看下程序到底出了什么情况?图就不上了,我们直接进入主题. 二:WinDbg 分析 1. CPU 真的爆高吗? 要确 ...
- rowkey设计原则和方法
rowkey设计首先应当遵循三大原则: 1.rowkey长度原则 rowkey是一个二进制码流,可以为任意字符串,最大长度为64kb,实际应用中一般为10-100bytes,它以byte[]形式保存, ...
- Ansible 批处理实战
软件简介 Ansible 是一款自动化运维工具,基于 Python 开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功 ...
- Golang 和Python 几个小时前 几分钟 几天前的处理
在用golang爬虫的时候 总会遇到 10天前 10分钟前 刚刚这种很影响我们爬取正常事件 所以我写了个方法 来格式化这种事件 golang 版本 package utils import ( &qu ...
- UML建模语言、设计原则、设计模式
1.UML统一建模语言 定义:用于软件系统设计与分析的语言工具 目的:帮助开发人员更好的梳理逻辑.思路 学习地址:UML概述_w3cschool 官网:https://www.omg.org/spec ...
- FastApi学习
vscode配置 插件 code runner在 setting.json中关于python的修改为,因为我使用了虚拟环境,得让vscode找到python的路径 "code-runner. ...
- Vue3 企业级优雅实战 - 组件库框架 - 2 初始化 workspace-root
上文已经搭建了 pnpm + monorepo 的基础环境,本文对 workspace-root 进行初始化配置,包括:通用配置文件.公共依赖.ESLint. 1 通用配置文件 在项目 根目录 下添加 ...
- WPF之MVVM实践中的Command与CommandParameter
先记录一下,方便以后复习. https://www.cnblogs.com/babietongtianta/p/3474101.html