【目标检测】Yolov7 的 ELAN 和 E-ELAN 模块演进(涉及到分组卷积,cardinality,梯度路径)

server/2024/9/24 3:34:36/

感觉从 YOLOv6 开始,YOLOv6 系列感觉优化点都着重于推理速度上面,YOLOv6 的 RepBlock 重参数化,给我的感觉就是算子融合进行加速。而 YOLOv7,为了在各种架构的边缘设备上获得极致的推理速度。

YOLOv7 的工作:

  1. 新的 bag of freebies(有效的训练技巧,不会增加推理的计算量)
  2. 有规划的重参数化模型(不同边缘设备架构,不同的重参数化方法)
  3. 新的动态标签分配方法

为了更好的理解 YOLOv7 里的 E-ELAN 模块,我们将模块的整个演变历程给出来:

E-ELAN 模块的演进

ResNet -> DenseNet -> VovNet -> CspVovNet -> ELAN(YOLOv7) -> E-ELAN

ResNet -> DenseNet

首先是何凯明大佬的 ResNet,DenseNet 的作者认为相比于 ResNet 对 shortcut 进行 Add 的方式,Concat 的方式可以让网络的 feature map 获得多个感知域的信息,对于不同尺度的特征提取是非常有效的。

DenseNet -> VovNet

在这里插入图片描述
但是 DenseNet 有两个问题:

  1. 每一层都用到之前所有特征层,导致大量内存读取(MAC memory access cost 比较大,shuffleNet v2 提出的概念)
  2. 每次 Concat 都会成倍扩大 channel,为了减少计算量而使用的 1x1 卷积,但是这种小卷积核不能很好被 GPU 并行计算支持

解决方案:OSA(One-Shot Aggregation)

最后阶段才进行 aggregation。不仅继承了 DenseNet 的多感受野表示多种特征的优点,也解决了密集连接效率低下的问题。

VovNet -> CspVovNet

在这里插入图片描述
Csp 结构我们已经很熟悉了,是在 PRN 的基础上发展过来的,在 YOLOv4,YOLOv5 和 YOLOv6 都得到了广泛的应用,通过将特征图分成 2 部分,在这些部分之间进行交叉连接。来提升特征提取能力。

CspVovNet 就是 VovNet 加上了 Csp 结构,既可以保留 DenseNet 多感受野的信息,也可以通过 CSP 结构避免过多重复梯度信息。

CspVovNet 的输入是 2c,因为 Csp,所以将通道 2c 分成了两部分,每部分的输出是 c,第一部分直接通过 cross stage connection,第二部分就是流过 VovNet 的部分。

CspVovNet -> ELAN

作者发现一个问题,在比较 VovNet 和 ResNet 的时候,随着 VovNet 模块的叠加,网络的表现会比 ResNet 要差,作者觉得是因为随着叠加, VovNet 中 transition layer 过多导致的。

我们一般会将改变特征图尺寸或者通道数的层,叫做 transition layer。从上面 CspVovNet 的图可以看出来,模块中含有两个 transition layer,分别是将通道数从 3c -> c 和 4c -> c 两个。梯度在经过 transition layer 这些层的时候,可能会发生损失或者变形。

所以,作者的对模块修改的优化方向就是减少这样的 transition layer:
在这里插入图片描述
在设计 ELAN 的时候涉及两个概念:梯度最短路径梯度最长路径。关于这个还是有点没太明白这两个概念的定义是啥。

在 ELAN 模块中,中间的 transition layer 被删掉了,合并了之前的两条 shortcut。

ELAN -> E-ELAN

在这里插入图片描述
E-ELAN 上半部分会出现 4 个分支,和 ELAN 一样,但是 ELAN 经过一个 transition layer 就输出了,但是 E-ELAN 的 4 个分支,每个分支都是 2c,然后每个分支的 2c 都分成两个 c 的分支,分别输入两个 4c 的层。

由上图可以看出,E-ELAN 在右侧 computational block 部分扩展 cardinality,进行 VoVNet 中 OSA Module 相关操作,在 OSA Module 最后的 concatenate 阶段使用 shuffule ,最后对 cardinality进行融合。

我们看到上面主要有三个操作:

  • Expand cardinality
  • Shuffle cardinality
  • Merge cardinality

这里又涉及到一个新的概念 cardinality 基数,这个超参数是在 ResNeXt 中第一次被引入的。

在这里插入图片描述

分组卷积

其实就是分组卷积,每一组都分配到一定的通道,然后分别进行卷积,然后 concat 到一起。例如,

首先说一下普通的多通道卷积,我们输入是一个 32x32x4 的图像,如果想要输出 64 通道的特征图,我们需要有 64 个三维卷积核,这意味着,每个三维卷积核都是 3x3x4 的维度,然后使用输入的 4 个通道,一一和 64 个三维卷积核对应的通道进行卷积,这样就会产生,4 x 64 个特征图,也就是每个三维卷积核都会生成 4 个特征图,这 4 个特征图会进行 Add 操作,也就是最终,每个三维卷积核都只会产生 1 张特征图,所以最后会输出 64 个特征图,也就是得到所谓的 64 通道。

分组卷积呢,还是 32x32x4 的输入,如果我们想分成 4 组,则会将输入的通道数 C i n = 4 C_{in}=4 Cin=4 分成 4 份,然后 64 个三维卷积核,也是分别分成 4 组 64 个一维的卷积核,然后分别进行单通道的卷积。就是每一组都会得到 16 个特征图,得到的结果再进行 concat 操作,4 组的 16 个特征图 concat 在一起就是 64 通道的特征图了。

虽然分组卷积核普通的多通道卷积得到的输出特征图的尺寸维度一致,但是要说他们的操作并不是等价的,只是维度操作得到一样的结果。

我们要明白分组卷积与 Inception 模块有什么区别,虽然两者都会分成很多分支,但是 Inception 分支中的卷积,并不会进行分组,然后求解,都是全量通过不同的卷积核,得到不同的特征图,然后进行 concat 拼接。

expand, shuffle,merge cardinality

上面的 expand cardinality,是扩大了通道数,本来输入的通道数是 2c,现在扩大成 2 个分支,每个分支都是 2c 的通道数,一支是 shortcut,另外一支和 ELAN 的操作差不多。

而 shuffle cardinality 和分组中的 shuffle 类似,两个分组卷积之间加入 Channel_Shuffle 模块打乱通道顺序,从而实现不同分组间的信息交换。这边的 shuffle 操作也是类似的,打乱各个通道的顺序。

最后进行 merge cardinality,而merge操作则是CSPNet的精髓——跨阶段特征融合,使用 Add 操作进行特征融合。

参考文章:

  • YOLOv7 E-ELAN学习笔记
  • YOLO系列】YOLOv7论文超详细解读(翻译 +学习笔记)
  • 深度学习系列(三)卷积神经网络模型(ResNet、ResNeXt、DenseNet、DenceUnet)
  • 解读YOLO v7

http://www.ppmy.cn/server/10391.html

相关文章

【QT】QtConcurrent的使用介绍,与std::thread的区别

QtConcurrent 模块是 Qt 框架中用于简化并发编程的一部分。它提供了一系列高级API,使得开发者能够更容易地编写多线程代码,从而利用多核处理器的能力。这个模块主要围绕使用线程池来执行函数调用、运行算法或者处理数据集。QtConcurrent 的核心优势是它的…

MAC 终端命令

Command Shift . 显示隐藏文件夹 环境变量路径 ~/.zshrc ~/.bash_profile 每次打开都需要 source 安装Homebrew xcode安装 xcode-select --install brew安装 /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)” 检查是否…

喜讯 | “泰迪杯”数据挖掘挑战赛再次进入计算机类竞赛指数榜单

4月15日,第61届中国高等教育博览会在福州召开。在教师教学发展与创新人才培养论坛上,浙江大学何钦铭教授代表《全国普通高校大学生计算机类竞赛指数》专家工作组发布了最新一年的竞赛指数。据悉,今年的竞赛项目清单包含了28项赛事&#xff0c…

路由过滤器GatewayFilter

Spring Cloud (p2hp.com) spring的官方地址 可以在里边看相关文档。 GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理: 过滤器工厂:spring提供了31种不同的路由过滤器工厂 对所有的路由都生效的配置&…

python创建sqlite,并使用flask-sqlalchemy连接

python创建sqlite,并使用flask-sqlalchemy连接 在 PyCharm 中,你可以使用 SQLite 数据库来存储数据。以下是在 PyCharm 中使用 SQLite 数据库并通过 Flask-SQLAlchemy 连接它的步骤: 1. 在 PyCharm 中创建 SQLite 数据库 打开 PyCharm&…

【学习AI-相关路程-自我总结-相关入门-自我学习-NVIDIA-Jetson】

【学习AI-相关路程-自我总结-相关入门-自我学习】 1、前言2、思考前进方向3、学习路线1、基础知识阶段2、初级准备阶段3、中级学习阶段4、高级实战阶段 4、自我的努力5、学习平台6、自己总结 1、前言 最近AI相关比较火的,对于程序员,或者走这行的人来说…

【QT进阶】Qt http编程之nlohmann json库使用的简单介绍

往期回顾 【QT进阶】Qt http编程之http相关类的简单介绍-CSDN博客 【QT进阶】Qt http编程之用户登录注册功能实现-CSDN博客 【QT进阶】Qt http编程之json解析的简单介绍-CSDN博客 【QT进阶】Qt http编程之nlohmann json库使用的简单介绍 一、nlohman json库 1、C常用Json库 J…

1名工程师轻松管理20个工作流,创业企业用Serverless 让数据处理流程提效

北京语势科技有限公司成立于2023年6月,语势科技定位为“智能投资时代的主题入口”,在资管行业从以机构为核心转向以用户为核心的变革时代,通过打造主题投资引擎,赋能普惠投资一体化,打造以投资者和资管机构为主题和核心…