万字长文解析 Scaled YOLOv4 模型(YOLO 变体模型)

本文涉及的产品
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,100CU*H 3个月
简介: 万字长文解析 Scaled YOLOv4 模型(YOLO 变体模型)

一,Scaled YOLOv4

Scaled YOLOv4 的二作就是 YOLOv4 的作者 Alexey Bochkovskiy

摘要

作者提出了一种网络缩放方法,不仅可以修改深度、宽度、分辨率,还可以修改网络的结构。

1,介绍

实验结果表明,基于 CSP 方法的 YOLOv4 目标检测模型在保持最优速度和准确率的前提下,同时也具有向上/向下可伸缩性,可用于不同大小的网络。由此,作者提出了一种网络缩放方法,它不仅改变深度、宽度、分辨率,而且还改变网络的结构。

主要工作Scaled YOLOv4 的主要工作如下:

  • 设计了一种针对小模型的强大的模型缩放方法,系统地平衡了浅层 CNN 的计算代价和存储带宽;
  • 设计一种简单有效的大型目标检测器缩放策略;
  • 分析各模型缩放因子之间的关系,基于最优组划分进行模型缩放;
  • 实验证实了 FPN 结构本质上是一种 once-for-all 结构;
  • 利用上述方法研制了 YOLOv4-tinyYOLO4v4-large 模型。

以往模型缩放,如 EfficientDet 无非是首先选择网络基础模块,它往往又好又快,然后针对影响目标检测的重要参数如:网络宽度 www、深度 ddd、输入图像分辨率size 等进行(满足一定条件下按照一定规律)调参,或者 NAS 自动调参。

2,相关工作

2.1,模型缩放

传统的模型缩放是指改变模型的深度,如 VGG 变体,以及后边可以训练深层的 ResNet 网络等;后面 agoruyko 等人开始考虑模型的宽度,通过改变卷积层卷积核的数量来实现模型缩放,并设计了 Wide ResNet[43],同样的精度下,它的参数量尽管比原始 ResNet 多,但是推理速度却更快。随后的 DenseNetResNeXt 也设计了一个复合缩放版本,将深度和宽度都考虑在内。

何凯明等人提出的 ResNet 网络解决了随着深度增加带来的网络退化问题。

3,模型缩放原则

3.1,模型缩放的常规原则

这段内容,原作者的表达不够严谨,计算过程也没有细节,所以我不再针对原文进行一一翻译,而是在原文的基础上,给出更清晰的表达和一些计算细节。

这里,我们得先知道对一个卷积神经网络来说,其模型一般是由 conv stageconv blockconv layer 组成的。我以 ResNet50 为例进行分析,大家就能明白了。ResNet50 的卷积过程分成 4stage,分别对应的卷积 blocks 数目是 [3,4,6,3][3,4,6,3][3,4,6,3],卷积 blockbottleneck 残差单元,bottleneck 残差单元又是 1×11\times 11×13×33\times 33×31×11\times 11×1 这样 3 个卷积层组成的,所以 ResNet50 总共的卷积层数目为:3×3+4×3+6×3+3×3=483\times 3 + 4\times 3+ 6\times 3 + 3\times 3 = 483×3+4×3+6×3+3×3=48,再加上第一层的卷积和最后一层的分类层(全连接层),总共是 50 层,所以命名为 ResNet50ResNet 模型的组成和结构参数表如下图所示。

大部分 backbone 都是分成 4stage

网络异常,图片无法展示
|


对一个基础通道数是 bbb 的卷积模块(conv block),总共有 kkk 个这样的模块的 CNN 网络来说,其计算代价是这样的。如 ResNet 的总的卷积层的计算量为 k∗[conv(1×1,b/4)→conv(3×3,b/4)→conv(1×1,b)]k\ast [conv(1\times 1,b/4)\rightarrow conv(3\times 3,b/4)\rightarrow conv(1\times 1,b)]k[conv(1×1,b/4)conv(3×3,b/4)conv(1×1,b)]ResNeXt 的总的卷积层的计算量为 k∗[conv(1×1,b/2)→gconv(3×3/32,b/2)→conv(1×1,b)]k\ast [conv(1\times 1,b/2)\rightarrow gconv(3\times 3/32, b/2)\rightarrow conv(1\times 1, b)]k[conv(1×1,b/2)gconv(3×3/32,b/2)conv(1×1,b)]Darknet 网络总的计算量为 k∗[conv(1×1,b/2)→conv(3×3,b)]k\ast [conv(1\times 1,b/2)\rightarrow conv(3\times 3, b)]k[conv(1×1,b/2)conv(3×3,b)]。假设可用于调整图像大小、层数和通道数的缩放因子分别为 α\alphaαβ\betaβγ\gammaγ。当调整因子变化时,可得出它们和 FLOPs 的关系如下表所示。

网络异常,图片无法展示
|


这里以 Res layer 为例,进行计算量分析。首先上表的 rrr 应该是指每个 stage 中间的残差单元的计算量,而且还是 bottleneck 残差单元,因为只有 stage 中间的 bottleneck conv block 的第一个 1×11\times 11×1 卷积层的输入通道数才是输出通道数的 4 倍,只有这种情况算出来的计算量 rrr 才符合表 1 的结论。

卷积层 FLOPs 的计算公式如下,这里把乘加当作一次计算,公式理解请参考我之前写的 文章

FLOPs=(Ci×K2)×H×W×CoFLOPs=(C_i\times K^2)\times H\times W\times C_oFLOPs=(Ci×K2)×H×W×Co

对于上面说的那个特殊的 bottleneck conv block 来说,卷积过程特征图大小没有发生变化,假设特征图大小为 whwhwh,所以 bolckFLOPs 为:

网络异常,图片无法展示
|

这里值得注意的是,虽然各个 conv block 会略有不同,比如 每个 conv stage 的第一个 conv block 都会将特征图缩小一倍,但是其 FLOPsr1r1r1 是线性的关系,所以,对于有 kkkconv blockResNet 来说,其总的计算量自然就可大概近似为 17whkb2/1617whkb^2/1617whkb2/16ResNeXtDarknet 卷积层的 FLOPs 计算过程类似,所以不再描述。

由表 1 可以看出,图像大小、深度和宽度都会导致计算代价的增加,它们分别成二次,线性,二次增长

Wang 等人提出的 CSPNet 可以应用于各种 CNN 架构,同时减少了参数和计算量。此外,它还提高了准确性,减少了推理时间。作者把它应用到 ResNet, ResNeXt,DarkNet 后,发现计算量的变化如表 2 所示。

网络异常,图片无法展示
|


CNN 转换为 CSPNet 后,新的体系结构可以有效地减少 ResNetResNeXtDarknet 的计算量(FLOPs),分别减少了 23.5%46.7%50.0%。因此,作者使用 CSP-ized 模型作为执行模型缩放的最佳模型

3.2,为低端设备缩放的tiny模型

对于低端设备,设计模型的推理速度不仅受到计算量和模型大小的影响,更重要的是必须考虑外围硬件资源的限制。因此,在执行 tiny 模型缩放时,我们必须考虑以下因素:内存带宽、内存访问代价(MACs)和 DRAM traffic。为了考虑到以上因素,我们的设计必须遵循以下原则:

1,使计算复杂度少于 O(whkb2)O(whkb^2)O(whkb2)

作者分析了高效利用参数的网络:DenseNetOSANet 的计算量,分别为 O(whgbk)O(whgbk)O(whgbk)O(max(whbg,whkg2))O(max(whbg, whkg^2))O(max(whbg,whkg2))。两者的计算复杂度阶数均小于 ResNet 系列的 O(whkb2)O(whkb^2)O(whkb2)。因此,我们基于 OSANet 设计 tiny 模型,因为它具有更小的计算复杂度。

这里的 OSANet 其实是 VoVNet 网络,专门为 GPU 平台设计的更高效的 backbone 网络架,其论文解读可参考我之前写的文章

网络异常,图片无法展示
|


2,最小化/平衡 feature map 的大小

说实话,没看明白论文这段内容,这不是跟论文 CSPNet 一样的结论吗,即分割为通道数相等的两条路径。

为了获得在计算速度方面的最佳平衡,我们提出了一个新概念:在CSPOSANet 的计算块之间执行梯度截断。如果我们将原来的 CSPNet 设计应用到 DenseNetResNet 架构上,由于这两种架构的第 jjj 层输出是第 1st1^{st}1st 层到第 (j−1)th(j-1)^{th}(j1)th 层输出的积分,我们必须将整个计算块作为一个整体来处理。由于 OSANet 的计算块属于 PlainNet 架构,从计算块的任意层制作 CSPNet 都可以达到梯度截断的效果。我们利用该特性对基层的 bbb 通道和计算块(computational block)生成的 kgkgkg 通道进行重新规划,并将其分割为通道数相等的两条路径,如表 4 所示。

网络异常,图片无法展示
|


当通道数量为 b+kgb + kgb+kg 时,如果要将这些通道分割成两条路径,最好将其分割成相等的两部分,即 (b+kg)/2(b + kg)/2(b+kg)/2

3,在卷积后保持相同的通道数

评估低端设备的计算成本,必须考虑功耗,而影响功耗的最大因素是内存访问代价(MACMACMAC)。根据 Shufflenetv2 的推导证明,可知卷积层的输入输出通道数相等时,即 Cin=CoutC_{in} = C_{out}Cin=Cout 时, MACMACMAC 最小。

4,最小化卷积输入/输出(CIO)

CIO 是一个可以测量 DRAM IO 状态的指标。表 5 列出了 OSACSP 和我们设计的 CSPOSANetCIO。当 kg>b2kg > \frac {b}{2}kg>2b 时,CSPOSANet 可以获得最佳的 CIO

网络异常,图片无法展示
|


3.3,为高端设备缩放的Large模型

feature pyramid network (FPN)的架构告诉我们,更高的 stage 更适合预测大的物体。表 7 说明了感受野与几个参数之间的关系。

网络异常,图片无法展示
|


从表 7 可以看出,宽度缩放可以独立操作。当输入图像尺寸增大时,要想对大对象有更好的预测效果,就必须增大网络的 depthstage (一般每个 stage 都会降低特征图分辨率的一半)的数量。在表 7 中列出的参数中,{sizeinput,#stage}\left \{ size^{input}, \#stage \right \}{sizeinput,#stage} 的组合效果最好。因此,当执行缩放时,我们首先在 {sizeinput}\left \{ size^{input} \right \}{sizeinput}#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 节中提到的原则。

我们将使用 PCBpartial in computational block) 架构的 CSPOSANet 作为 YOLOv4backbone。我们设 g=b/2g = b/2g=b/2 为增长率,最终使其增长到 b/2+kg=2bb/2 + kg = 2bb/2+kg=2b。通过计算,我们得到 k=3k = 3k=3YOLOv4 的卷积块(computational block)结构如图 3 所示。对于每个阶段的通道数量和 neck 网络结构,我们采用 YOLOv3-tiny 一样的设计。

网络异常,图片无法展示
|


4.3,YOLOv4-large

专门为云端 GPU 设计的,主要目的就是为实现高精度的目标检测。我们设计了一个完全 CSP 化的模型 YOLOv4-P5,并将其扩展到 YOLOv4-P6YOLOv4-P7Sacled-YOLOv4large 版本的模型结构图,如下图所示。

网络异常,图片无法展示
|


我们通过设计 sizeinputsize^{input}sizeinput, #stage 来对 backbone 执行复合缩放。我们把每个 stage 的深度设置为 2dsi2^{d_{s_{i}}}2dsidsd_sds 范围为 [1,3,15,15,7,7,7][1, 3, 15, 15, 7, 7, 7][1,3,15,15,7,7,7]。与之前的 ResNet 的卷积划分为 4stage 不同,这里最多划分为 7stageYOLOv4-P7)。

5,实验

与其他实时目标检测检测器进行比较,对比实验结果如表 11 所示。

网络异常,图片无法展示
|


总结

通篇论文看下来,感觉这篇论文最主要的贡献在于通过简单的理论分析和对比实验,验证了模型缩放的原则,进一步拓展了 CSPNet 方法,并基于此设计了一个全新的 Scaled-YOLOv4。个人感觉就是针对不同的 GPU 平台,可以根据作者分析出来的模型缩放理论且符合其他一些原则的情况下,通过选择不同的模型宽度和深度参数,让模型更深更宽。

anchor-free 的方法,如 centernet 是不需要复杂的后处理,如 NMSBackbone 模型的宽度、深度、模块的瓶颈比(bottleneck)、输入图像分辨率等参数的关系。

Reference

[43] Sergey Zagoruyko and Nikos Komodakis. Wide residualnet works. arXiv preprint arXiv:1605.07146, 2016.

参考资料


相关文章
|
2月前
|
机器学习/深度学习 人工智能 算法
模型无关的局部解释(LIME)技术原理解析及多领域应用实践
在当前数据驱动的商业环境中,人工智能(AI)和机器学习(ML)已成为各行业决策的关键工具,但随之而来的是“黑盒”问题:模型内部机制难以理解,引发信任缺失、监管合规难题及伦理考量。LIME(局部可解释模型无关解释)应运而生,通过解析复杂模型的个别预测,提供清晰、可解释的结果。LIME由华盛顿大学的研究者于2016年提出,旨在解决AI模型的透明度问题。它具有模型无关性、直观解释和局部保真度等优点,在金融、医疗等领域广泛应用。LIME不仅帮助企业提升决策透明度,还促进了模型优化和监管合规,是实现可解释AI的重要工具。
114 9
|
2月前
|
开发框架 供应链 监控
并行开发模型详解:类型、步骤及其应用解析
在现代研发环境中,企业需要在有限时间内推出高质量的产品,以满足客户不断变化的需求。传统的线性开发模式往往拖慢进度,导致资源浪费和延迟交付。并行开发模型通过允许多个开发阶段同时进行,极大提高了产品开发的效率和响应能力。本文将深入解析并行开发模型,涵盖其类型、步骤及如何通过辅助工具优化团队协作和管理工作流。
74 3
|
20天前
|
机器学习/深度学习 人工智能 PyTorch
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
本文探讨了Transformer模型中变长输入序列的优化策略,旨在解决深度学习中常见的计算效率问题。文章首先介绍了批处理变长输入的技术挑战,特别是填充方法导致的资源浪费。随后,提出了多种优化技术,包括动态填充、PyTorch NestedTensors、FlashAttention2和XFormers的memory_efficient_attention。这些技术通过减少冗余计算、优化内存管理和改进计算模式,显著提升了模型的性能。实验结果显示,使用FlashAttention2和无填充策略的组合可以将步骤时间减少至323毫秒,相比未优化版本提升了约2.5倍。
35 3
Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
|
1月前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
84 2
|
1月前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
|
26天前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习与自然语言处理的前沿技术:Transformer模型的深度解析
探索深度学习与自然语言处理的前沿技术:Transformer模型的深度解析
83 0
|
2月前
|
机器学习/深度学习 搜索推荐 大数据
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
【10月更文挑战第2天】在处理大规模数据集的推荐系统项目时,提高检索模型的召回率成为关键挑战。本文分享了通过改进特征工程(如加入用户活跃时段和物品相似度)和优化模型结构(引入注意力机制)来提升召回率的具体策略与实现代码。严格的A/B测试验证了新模型的有效性,为改善用户体验奠定了基础。这次实践加深了对特征工程与模型优化的理解,并为未来的技术探索提供了方向。
130 2
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
|
2月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
24 1
|
3月前
|
机器学习/深度学习 存储 人工智能
让模型评估模型:构建双代理RAG评估系统的步骤解析
在当前大语言模型(LLM)应用开发中,评估模型输出的准确性成为关键问题。本文介绍了一个基于双代理的RAG(检索增强生成)评估系统,使用生成代理和反馈代理对输出进行评估。文中详细描述了系统的构建过程,并展示了基于四种提示工程技术(ReAct、思维链、自一致性和角色提示)的不同结果。实验结果显示,ReAct和思维链技术表现相似,自一致性技术则呈现相反结果,角色提示技术最为不稳定。研究强调了多角度评估的重要性,并提供了系统实现的详细代码。
70 10
让模型评估模型:构建双代理RAG评估系统的步骤解析
|
2月前
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
468 3

热门文章

最新文章

推荐镜像

更多