【目标检测】YOLOv6 的网络结构,图解RepBlock重参数化

news2024/12/28 20:39:16

YOLOv6 是美团推出的,在这个版本里面,不再使用之前 YOLOv4 和 YOLOv5 的带 CSP 结构的 CSPDarknet-53 作为 backbone 了,而是在 RepVGG 的启发下,推出了新的 EfficientRep 作为 YOLOv6 的 backbone。

RepVGG 最重要的一点是:结构的重参数化

简单来说,在训练和推理的时候采用不同的结构,在训练的时候采用多分支结构进行训练,但是在推理的时候使用单分支,即保留了训练多分支的准确度,又兼具推理时单分支的速度。

具体来说,训练中,backbone 中使用的是 RepBlock 模块,但是在推理的时候,可以将这些 RepBlock 模块换成带 ReLU 激活函数的 3 x 3 卷积块。

RepVGG 主干在小型网络中具有更强的特征表示能力,但是随着参数和计算成本的爆炸式增长, RepVGG 在大模型中难以获得较高的性能,所以:

  • 在小模型(n / t / s)中,使用 RepBlock
  • 在大模型(m / l) 中,使用 CSPStackRep Block

YOLOv5 和 YOLOv6 的 backbone 对比

在这里插入图片描述
最左边 YOLOv5 的 backbone 我用的是最新版本的,其中 CSP 模块是 C3 模块,然后激活函数也是 SiLU的。从上面图片可以看出来,基本上,YOLOv6 大体上的结构变化不大,但是内部的 C3 模块换成了 RepBlock 模块或者是 CspStackRep Block 模块(这取决于模型的大小)。用到的 RepBlock 模块和 CspStackRep 模块的具体结构也在右边给了出来。

值得注意的是,就和前面提到的训练和推理的解耦,训练的时候,RepBlock 和 CspStackRep Block 模块内部使用的都是 RepVGG 模块,这是一种多分支结构,可以学习到更多不同的特征。但是到了推理的时候,为了提升推理的速度,将多分支的 RepVGG 换成了单分支的 RepConv 结构。

其实也可以看出来 YOLOv6 的一个比较创新的地方就是 RepVGG 模块向 RepConv 转换的一个结构重参数化。

RepVGG(train) -> RepConv(infer)

在这里插入图片描述
对于不同的分支,重参数化的过程不一样:

  • 3x3 Conv:直接与 BN 层进行融合
  • 1x1 Conv:先 padding 成 3x3 Conv,然后与 BN 层进行融合
  • identity:先转换成 1x1 Conv,然后再转成 3x3 Conv,最后与 BN 层进行融合

3x3 Conv 层与 BN 层融合

RepConv 其实就是一个 3x3 卷积 + ReLU 激活函数,相比于普通的卷积块,少了其中的 BN 层,这是因为 Rep 的核心思想就是 Conv2D 与 DB 的融合,等效成一个 3x3 卷积。

我们知道:卷积 Conv2D 和 批归一化 BN 的公式如下: Conv ( x ) = W ( x ) + b \text{Conv}(x) = W(x) + b Conv(x)=W(x)+b BN ( x ) = γ ⋅ ( x − mean ) var + β \text{BN}(x) = \gamma \cdot \frac{(x - \text{mean})}{\sqrt[]{\text{var}} } + \beta BN(x)=γvar (xmean)+β按照卷积块的流程,先经过卷积层,然后是 BN 层,公式可以写成下面形式: BN ( Conv ( x ) ) = γ ⋅ W ( x ) + b − mean var + β \text{BN}(\text{Conv}(x)) = \gamma \cdot \frac{W(x) + b - \text{mean}}{\sqrt{\text{var} } } + \beta BN(Conv(x))=γvar W(x)+bmean+β化简可以得到: BN ( Conv ( x ) ) = γ var ⋅ W ( x ) + ( γ ⋅ ( b − mean ) var + β ) \text{BN}(\text{Conv}(x)) = \frac{\gamma }{\sqrt[]{\text{var}}}\cdot W(x) + (\frac{\gamma \cdot (b - \text{mean})}{\sqrt[]{\text{var}}} + \beta ) BN(Conv(x))=var γW(x)+(var γ(bmean)+β)其实可以等价为一个卷积层: W f u s e d ( x ) = γ var ⋅ W ( x ) W_{fused}(x) = \frac{\gamma }{\sqrt[]{\text{var}}}\cdot W(x) Wfused(x)=var γW(x) b f u s e d = γ ⋅ ( b − mean ) var + β b_{fused} = \frac{\gamma \cdot (b - \text{mean})}{\sqrt[]{\text{var}}} + \beta bfused=var γ(bmean)+βConv 与 BN 融合的结果可以表示为: BN ( Conv ( x ) ) = W f u s e d ( x ) + b f u s e d \text{BN}(\text{Conv}(x)) = W_{fused}(x) + b_{fused} BN(Conv(x))=Wfused(x)+bfused

这上面的计算过程中 Conv 是带 bias 的,但是现在一般来说,如果后面接的是 BN 层,Conv 是不需要带 bias 的,因为即便带了 bias,在后续的 BN 层中,也不会有什么作用,反而增加计算量。

3x3 Conv 与 1x1 Conv 融合

在这里插入图片描述
首先,我们知道多通道卷积:

  • 卷积核的通道数 = 输入的通道数
  • 卷积核的数量 = 输出的通道数
  • 输入和卷积核的卷积是对应通道之间的卷积之和

所以上面的图中,输入是 3x3x2,有 2 个 channel。然后卷积核也有 2 个,每个卷积核有 2 个 channel。

在这里插入图片描述
所以 3x3 Conv 简化下来可以画上面那样,中间的 4 个 3x3 卷积核实际上和 RepVGG(train) -> RepConv(infer) 章节的 4 个绿色的卷积核是一样的意思。

在这里插入图片描述
我们知道 1x1 Conv 的卷积的计算过程如上面示意图所示,其实我们也发现了,将 1x1 Conv 周围 padding 成 0 就可以等效转换成 3x3 Conv 层了,获得和 1x1 Conv 一样的输出结果。

在这里插入图片描述

identity -> 1x1 Conv -> 3x3 Conv

而 identity 的分支,我们想要输入和输出是一样的,根据上面的 1x1 卷积,其实我们可以做出下面的转换
在这里插入图片描述
首先将 identity 转换成如上所示的 1x1 Conv,然后再转换成 3x3 Conv

identity 层就是输入直接等于输出,也即 input 中每个通道每个元素直接输出到 output 中对应的通道,用一个什么样的卷积层来等效这个操作呢,我们知道,卷积操作必须涉及要将每个通道加起来然后输出的,然后又要保证 input 中的每个通道每个元素等于 output 中,从这一点,我们可以从 PWconv 想到,只要令当前通道的卷积核参数为 1,其余的卷积核参数为 0,就可以做到;从 DWconv 中可以想到,用 conv_1x1 卷积且卷积核权重为 1,就能保证每次卷积不改变输入,因此, identity 可以等效成如下的 conv_1x1 的卷积形式:

参考文章:

  • 【笔记】YOLOv7重参数化(RepConV)原理+代码
  • 【YOLO系列】YOLOv6论文超详细解读(翻译 +学习笔记)
  • 大道至简!深度解读CVPR2021论文RepVGG

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

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

相关文章

学透Spring Boot 003 —— Spring 和 Spring Boot 常用注解(附面试题和思维导图)

这是 学透 Spring Boot 专栏 的第三篇,欢迎关注我,与我一起学习和探讨 Spring Boot 相关知识,学透 Spring Boot。 从面试题说起 今天我们通过一道和Spring Boot有关的常见面试题入手。 面试题:说说 Spring Boot 中有哪些常用注解…

助力瓷砖生产智造,基于YOLOv5全系列参数【n/s/m/l/x】模型开发构建瓷砖生产制造场景下1280尺寸瓷砖表面瑕疵检测识别系统

砖生产环节一般经过原材料混合研磨、脱水、压胚、喷墨印花、淋釉、烧制、抛光,最后进行质量检测和包装。得益于产业自动化的发展,目前生产环节已基本实现无人化。而质量检测环节仍大量依赖人工完成。一般来说,一条产线需要配数名质检工&#…

Windows系统搭建TortoiseSVN客户端并实现无公网IP访问内网服务端

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统,它与Apache Subversion(SVN)集成在一起,提供了一个用户友好的界面,方便用…

Mysql的基本命令

1 服务相关命令 命令描述systemctl status mysql查看MySQL服务的状态systemctl stop mysql停止MySQL服务systemctl start mysql启动MySQL服务systemctl restart mysql重启MySQL服务ps -ef | grep mysql查看mysql的进程mysql -uroot -hlocalhost -p123456登录MySQLhelp显示MySQ…

使用 Django 构建简单 Web 应用

当我们在使用Django构建Web应用时,通常将会涉及到多个步骤,从创建项目到编写视图、模板、模型,再到配置URL路由和静态文件,最后部署到服务器上。所以说如果有一个环节出了问题,都是非常棘手的,下面就是我们…

vim copilot插件安装使用

copilot简介 在使用不熟悉的开发语言或函数库进行开发工作时,虽然可以通过阅读开发文档或示例代码的方式学习开发,但这种方式学习成本较高、效率较低,且后续不一定会用上。 GitHub Copilot是一个由GitHub开发的机器学习工具,可以…

加密软件VMProtect教程:使用脚本-功能

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic(本机)、Virtual Pascal和XCode编译器。 同时,VMProtect有一个内置的反汇编程序,可以与Windows和Mac OS X可执行文件一起…

HTTP的介绍

一.什么是HTTP? Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 二.HTTP的特点 (1)基于TCP协议:面向连接,安全 (2)基于请求-响应模型的&…

壁纸小程序Vue3(自定义头部组件)

1.自定义头部 coustom-nav <view class"layout"><view class"navbar"><view class"statusBar"></view><view class"titleBar"><view class"title">标题</view><view class&qu…

网络安全 | 什么是网络安全?

关注WX&#xff1a;CodingTechWork 网络安全 网络安全-介绍 网络安全是指用于防止网络攻击或减轻其影响的任何技术、措施或做法。网络安全旨在保护个人和组织的系统、应用程序、计算设备、敏感数据和金融资产&#xff0c;使其免受简单而不堪其绕的计算机病毒、复杂而代价高昂…

RabbitMQ安装及Springboot 集成RabbitMQ实现消息过期发送到死信队列

死信队列 RabbitMQ 的死信队列&#xff08;Dead-Letter-Exchanges&#xff0c;简称 DLX&#xff09;是一个强大的特性&#xff0c;它允许在消息在队列中无法被正常消费&#xff08;例如&#xff0c;消息被拒绝并且没有设置重新入队&#xff0c;或者消息过期&#xff09;时&…

在 Three.js 中,`USDZExporter` 类用于将场景导出为 USDZ 格式,这是一种用于在 iOS 平台上显示增强现实(AR)内容的格式。

demo 案例 在 Three.js 中&#xff0c;USDZExporter 类用于将场景导出为 USDZ 格式&#xff0c;这是一种用于在 iOS 平台上显示增强现实&#xff08;AR&#xff09;内容的格式。下面是关于 USDZExporter 的入参、出参、方法和属性的讲解&#xff1a; 入参 (Parameters): sc…

解决Quartus与modelsim联合仿真问题:# Error loading design解决,是tb文件中没加:`timescale 1ns/1ns

解决Quartus与modelsim联合仿真问题&#xff1a;# Error loading design解决&#xff0c;是tb文件中没加&#xff1a;timescale 1&#xff0c;一直走下来&#xff0c;在modelsim中出现了下面问题2&#xff0c;rtl文件、tb文件2.1&#xff0c;rtl代码2.2&#xff0c;tb测试2.3&a…

C# WPF编程-Application类(生命周期、程序集资源、本地化)

C# WPF编程-Application类 应用程序的生命周期创建Application对象应用程序的关闭方式应用程序事件 Application类的任务显示初始界面处理命令行参数访问当前Application对象在窗口之间进行交互 程序集资源添加资源检索资源pack URI内容文件 本地化构建能够本地化的用户界面 每…

Day5-

Hive 窗口函数 案例 需求&#xff1a;连续三天登陆的用户数据 步骤&#xff1a; -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…

封装表格组件,最后一列动态生成 vue3子组件通过slot传值向父组件

将表格二次封装&#xff0c;方便以后开发中的复用。每次只需调用表格组件后&#xff0c;在父组件中往子组件标签上写入dataSource&#xff08;表格数据&#xff09;和columns&#xff08;表格列标题&#xff09;即可。 此案例中最后一列是删除按钮&#xff0c;动态生成&#xf…

如何提高图片的分辨率?dpi修改工具推荐

在调整分辨率之前&#xff0c;我们需要了解什么是dpi分辨率&#xff0c;简单来说&#xff0c;分辨率是指图像中包含的像素数量&#xff0c;分辨率越高&#xff0c;图像就越清晰&#xff0c;常见的分辨率包括72dpi、96dpi和300dpi等&#xff0c;在打印照片或者一些考试平台对图片…

uniapp 开发之原生Android插件

开发须知 在您阅读此文档时&#xff0c;我们假定您已经具备了相应Android应用开发经验&#xff0c;使用Android Studio开发过Android原生。也应该对HTML,JavaScript,CSS等有一定的了解, 并且熟悉在JavaScript和JAVA环境下的JSON格式数据操作等。 为了插件开发者更方便快捷的开…

【论文阅读】DETR 论文逐段精读

【论文阅读】DETR 论文逐段精读 文章目录 【论文阅读】DETR 论文逐段精读&#x1f4d6;DETR 论文精读【论文精读】&#x1f310;前言&#x1f4cb;摘要&#x1f4da;引言&#x1f9ec;相关工作&#x1f50d;方法&#x1f4a1;目标函数&#x1f4dc;模型结构⚙️代码 &#x1f4…

Django源码之路由匹配(下)——图解逐步分析底层源码

目录 1. 前言 2. 路由匹配全过程分析 2.1 请求的入口 2.2 request的封装 2.3 response的源头 2.4 handler的获取 2.5 获取resolver对象 2.6 路由进行匹配 3. 小结 1. 前言 在上一篇文章中&#xff0c;我们谈到了路由的定义&#xff0c;通过URLPattern路由路径对象和Rou…