YOLOv5、v7改进之三十八:引入RepVGG模型结构

news/2024/5/13 10:54:55/文章来源:https://blog.csdn.net/m0_70388905/article/details/127532645

前 言:作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv7的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。由于出到YOLOv7,YOLOv5算法2020年至今已经涌现出大量改进论文,这个不论对于搞科研的同学或者已经工作的朋友来说,研究的价值和新颖度都不太够了,为与时俱进,以后改进算法以YOLOv7为基础,此前YOLOv5改进方法在YOLOv7同样适用,所以继续YOLOv5系列改进的序号。另外改进方法在YOLOv5等其他算法同样可以适用进行改进。希望能够对大家有帮助。

具体改进办法请关注后私信留言!关注即可免费领取深度学习算法资料!

解决问题:之前改进增加了很多注意力机制的方法,包括比较常规的SE、CBAM等,本文加入简单但功能强大的轻量级卷积神经网络结构,权衡网络精度和速度,实现双赢的检测效果。

基本原理:

提出了一种简单但功能强大的卷积神经网络结构,它具有一个类似VGG的推理时间体,由3×3卷积和ReLU组成,而训练时间模型具有多分支拓扑。这种训练时间和推理时间架构的解耦是通过结构重新参数化技术实现的,因此该模型被命名为RepVGG。在ImageNet上,据我们所知,RepVGG达到了80%以上的前1精度,这是普通模型的第一次。在NVIDIA 1080Ti GPU上,RepVGG型号的运行速度比ResNet-50快83%,比ResNet-101快101%,具有更高的精度,与EfficientNet和RegNet等最先进的型号相比,显示出令人满意的精度-速度权衡。

    与最先进的基线相比,考虑到其简单性,RepVGG也表现出良好的性能:RepVGG-A2比EfficientNet-B0好1.37%/59%,RepVVGG-B1比RegNetX-3.2GF好0.39%,运行速度稍快。值得注意的是,RepVGG模型在200个时代达到了80%以上的准确率(表5),据我们所知,这是普通模型第一次赶上最先进的水平。与RegNetX-12GF相比,RepVGG-B3的运行速度快31%,考虑到RepVGG不需要太多,这一点令人印象深刻。我们使用这样的批处理大小,因为它足够大,可以实现每个测试模型100%的GPU利用率,以模拟追求最大QPS(每秒查询数)的实际应用场景,而我们的GPU内存不足,无法满足批量大小为256的EfficientNet-B3。表:在ImageNet上训练的120个时期的简单数据增强结果。速度在1080Ti上进行测试,批量大小为128,全精度(fp32),以示例/秒为单位进行测量。我们计算第节中所述的理论FLOP和Wino MUL。

添加方法:

第一步:确定添加的位置,作为即插即用的注意力模块,可以添加到YOLOv7网络中的任何地方。

第二步:common.py构建模块。部分代码如下,关注文章末尾,私信后领取。

class RepVGGBlock(nn.Module):def __init__(self, in_channels, out_channels, kernel_size=3,stride=1, padding=1, dilation=1, groups=1, padding_mode='zeros', deploy=False, use_se=False):super(RepVGGBlock, self).__init__()self.deploy = deployself.groups = groupsself.in_channels = in_channelspadding_11 = padding - kernel_size // 2self.nonlinearity = nn.SiLU()# self.nonlinearity = nn.ReLU()if use_se:self.se = SEBlock(out_channels, internal_neurons=out_channels // 16)else:self.se = nn.Identity()if deploy:self.rbr_reparam = nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size,stride=stride,padding=padding, dilation=dilation, groups=groups, bias=True,padding_mode=padding_mode)else:self.rbr_identity = nn.BatchNorm2d(num_features=in_channels) if out_channels == in_channels and stride == 1 else Noneself.rbr_dense = conv_bn(in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size,stride=stride, padding=padding, groups=groups)self.rbr_1x1 = conv_bn(in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=stride,padding=padding_11, groups=groups)# print('RepVGG Block, identity = ', self.rbr_identity)
def switch_to_deploy(self):if hasattr(self, 'rbr_1x1'):kernel, bias = self.get_equivalent_kernel_bias()self.rbr_reparam = nn.Conv2d(in_channels=self.rbr_dense.conv.in_channels, out_channels=self.rbr_dense.conv.out_channels,kernel_size=self.rbr_dense.conv.kernel_size, stride=self.rbr_dense.conv.stride,padding=self.rbr_dense.conv.padding, dilation=self.rbr_dense.conv.dilation, groups=self.rbr_dense.conv.groups, bias=True)self.rbr_reparam.weight.data = kernelself.rbr_reparam.bias.data = biasfor para in self.parameters():para.detach_()self.rbr_dense = self.rbr_reparam# self.__delattr__('rbr_dense')self.__delattr__('rbr_1x1')if hasattr(self, 'rbr_identity'):self.__delattr__('rbr_identity')if hasattr(self, 'id_tensor'):self.__delattr__('id_tensor')self.deploy = Truedef get_equivalent_kernel_bias(self):kernel3x3, bias3x3 = self._fuse_bn_tensor(self.rbr_dense)return kernel3x3 + self._pad_1x1_to_3x3_tensor(kernel1x1) + kernelid, bias3x3 + bias1x1 + biasiddef _pad_1x1_to_3x3_tensor(self, kernel1x1):if kernel1x1 is None:return 0else:return torch.nn.functional.pad(kernel1x1, [1, 1, 1, 1])def _fuse_bn_tensor(self, branch):if branch is None:return 0, 0if isinstance(branch, nn.Sequential):kernel = branch.conv.weightrunning_mean = branch.bn.running_meanrunning_var = branch.bn.running_vargamma = branch.bn.weightbeta = branch.bn.biaseps = branch.bn.epselse:assert isinstance(branch, nn.BatchNorm2d)if not hasattr(self, 'id_tensor'):input_dim = self.in_channels // self.groupskernel_value = np.zeros((self.in_channels, input_dim, 3, 3), dtype=np.float32)for i in range(self.in_channels):kernel_value[i, i % input_dim, 1, 1] = 1self.id_tensor = torch.from_numpy(kernel_value).to(branch.weight.device)kernel = self.id_tensorrunning_mean = branch.running_meanrunning_var = branch.running_vargamma = branch.weightbeta = branch.biaseps = branch.epsstd = (running_var + eps).sqrt()t = (gamma / std).reshape(-1, 1, 1, 1)return kernel * t, beta - running_mean * gamma / stddef forward(self, inputs):if self.deploy:return self.nonlinearity(self.rbr_dense(inputs))if hasattr(self, 'rbr_reparam'):return self.nonlinearity(self.se(self.rbr_reparam(inputs)))if self.rbr_identity is None:id_out = 0else:id_out = self.rbr_identity(inputs)return self.nonlinearity(self.se(self.rbr_dense(inputs) + self.rbr_1x1(inputs) + id_out))

第三步:yolo.py中注册RepVGGBlock模块

elif m is RepVGGBlock:c1, c2 = ch[f], args[0]if c2 != no:  # if not outputc2 = make_divisible(c2 * gw, 8)args = [c1, c2, *args[1:]]
if type(m) is RepVGGBlock:m.switch_to_deploy()

第四步:修改yaml文件,本文以修改backbone为例,将原C3模块后加入该模块。

backbone:# [from, number, module, args][[-1, 1, Conv, [32, 3, 1]],  # 0[-1, 1, Conv, [64, 3, 2]],  # 1-P1/2[-1, 1, Conv, [64, 3, 1]],[-1, 1, Conv, [128, 3, 2]],  # 3-P2/4 [-1, 1, RepVGGBlock, [128, 3, 2]], # 5-P4/16[-1, 1, Conv, [256, 3, 2]], [-1, 1, MP, []],[-1, 1, Conv, [128, 1, 1]],[-3, 1, Conv, [128, 1, 1]],[-1, 1, Conv, [128, 3, 2]],

第五步:将train.py中改为本文的yaml文件即可,开始训练。

结 果:本人在遥感数据集上进行实验,有涨点效果。需要请关注留言。

预告一下:下一篇内容将继续分享深度学习算法相关改进方法。有兴趣的朋友可以关注一下我,有问题可以留言或者私聊我哦

PS:该方法不仅仅是适用改进YOLOv5,也可以改进其他的YOLO网络以及目标检测网络,比如YOLOv7、v6、v4、v3,Faster rcnn ,ssd等。

最后,有需要的请以关注文末私信我吧。关注即可免费领取深度学习算法学习资料!

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微服务】微服务万字实战,带你了解工程原理

微服务实战1、前期准备1.1 技术选型1.2 模块设计1.3 微服务调用2、创建父工程3、创建基础模块3.1 导入依赖3.2 创建实体类4、创建用户微服务4.1 创建shop-user模块4.2 用户微服务启动类4.3 创建配置文件5、创建商品微服务5.1 创建shop_product模块5.2 商品微服务启动类5.3 创建…

【自学CSS笔记第7篇】——CSS三大特征(这一篇就够了)

其实,我清楚的知道什么是对的什么是错的,什么该做什么不该做,然而懒惰的天性驱使我们每每做出错误的决定,结束后我又再一次重复着厌倦和懊恼。 目录 CSS的三大特性总览: 层叠性: 继承性: 优先级&#x…

链路状态路由协议 OSPF (二)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.Router ID 1.什么是Router ID 2.获得Router ID方法 二.DR和…

Libevent库的学习

目录 Libevent 概述 Libevent 使用模型 使用Libevent的基本流程: libevent 的核心,event 事件 1. 创建一个事件event 2. 释放event_free 3. 注册event 4. 信号事件 5. 销毁event_base Libevent 结构图 使用libevent库去实现tcp服务器 Libev…

【目标检测】【边界框回归】Bounding-Box regression

最近开始看目标检测的论文,第一篇为R-CNN论文,是两阶段目标检测的开山奠基之作。论文中的损失函数包含了边界框回归,且在R-CNN论文里面有详细的介绍。 一、为什么要做边界框回归? 对于上图,绿色的框表示Ground Truth&…

【VIO】第2讲 基于优化的IMU

第2讲 基于优化的 IMU 与视觉信息融合 1.最小二乘问题求解 (1)最小二乘基础概念 ​ 1 定义:找到一个n维的变量 x∈Rnx \in R^nx∈Rn ,使得损失函数 F(x)F(x)F(x) 取得局部最小值: F(x)12∑i1m(fi(x))2F(x) \frac{1…

Word控件Spire.Doc 【文本】教程(5) ;从 Word 文档中的文本框中提取文本

文本框的目的是允许用户输入程序要使用的文本信息。也可以从文本框中提取现有的文本信息。以下指南重点介绍如何通过Spire.Doc for .NET从 C# 中 Word 文档的文本框中提取文本。 Spire.Doc for.NET 最新下载(qun:767755948)https://www.evget.com/produ…

3、Java对象相关

目录JVM内存分配机制对象的创建对象大小与指针压缩java对象的指针压缩指针压缩的原因分代回收机制分代GC分类对象内存分配栈上分配逃逸分析标量替换标量与聚合量Eden区分配大对象分配老年代分配对象动态年龄判断老年代空间分配担保机制对象的内存布局对象的访问定位对象内存回收…

WebDAV之葫芦儿·派盘+一刻日记

一刻日记 支持webdav方式连接葫芦儿派盘。 是一款强大的记录软件,通过平台可以随意的记录重要的事情,让用户在平台里能获得更多的帮助,实时的解决你的记录需求,让你可以更好的进行使用;在使用的过程中,用户可以记录当天重要的事情,把你的感想更好的记录在平台里,让用…

js-键盘事件

onkeydown:按键被按下 onkeyup:按键被松开 事件绑定的对象:键盘事件一般绑定给可以获取焦点的对象或者document对象 焦点:光标在闪的:比如input标签 如果一直按按键不松手,按键会一直被触发 当:onkeydown连续触发时…

后端php项目和数据库启动

有两种方法可以启动 1.使用小皮面板 ①启动php项目开启后端网站 可去官网下载 下载后就能使用了 官网地址:小皮面板(phpstudy) - 让天下没有难配的服务器环境! 下载完成后打开 php项目需要启动apache 创建一个php项目的网站 注意这里要写public 点击…

亚马逊云 RDB数据库故障转移(多可用区)

RDB关系数据库(Relational Database,RDB) 创建名为VPC for RDS的vpc 两个可用区,两组公内网创建安全组创建RDS数据库实例用的数据库子网组创建RDS数据库实例创建数据库连接RDS数据库实例并给数据库test添加数据 1.创建安全组2.创建用来连接数据库实例的EC2选择vpc for rds那…

MyBatis 环境搭建配置全过程【IDEA】

文章目录一、MyBatis 介绍二、MyBatis 环境搭建1.MyBatis 下载2.配置 jdk 版本3.创建 Maven 工程4.IDEA 连接数据库5.项目文件构架6.引入相关依赖7.命令行创建数据库8.数据库配置文件9.核心配置文件三、入门测试程序1.创建表准备数据2.创建 POJO 实体3.创建映射文件4.修改核心配…

將一個react+nodejs聊天軟件前後端項目進行docker打包並運行

文章目录1概述2将react前端打包入docker2.1打包react项目2.2nginx配置2.3创建Docker镜像2.4打包和运行2.5上传dockerhub3将nodejs打包入dockerDockerfile文件.dockerignore 文件打包和运行上传dockerhub1概述 https://gitee.com/chuge325/practise–chat-app-react-nodejs.git…

爱上源码,重学Spring IoC深入

回答: 我们为什么要学习源码? 1、知其然知其所以然 2、站在巨人的肩膀上,提高自己的编码水平 3、应付面试1.1 Spring源码阅读小技巧 1、类层次藏得太深,不要一个类一个类的去看,遇到方法该进就大胆的进 2、更不要一行…

左程云老师算法课笔记( 四)

前言 仅记录学习笔记,如有错误欢迎指正。 啊啊,才发现二被我挤掉了,有空补下! 一、图: 图的深度优先遍历:(和二叉树的区别就是有环,不能重复打印)(Queue队…

网课搜题接口-查题校园题库系统

网课搜题接口-查题校园题库系统 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台&…

全球名校AI课程库(28)| MIT麻省理工 · 基因组学机器学习课程『Machine Learning for Genomics』

🏆 课程学习中心 | 🚧 AI生物医疗课程合辑 | 🌍 课程主页 | 📺 中英字幕视频 | 🚀 项目代码解析 课程介绍 MIT 6.047/6.878是全球顶校麻省理工开设的基因组学与机器学习的交叉专业课程。课程以基因组学为主要应用领域…

智慧城市万亿级蓝海赛道机遇何在?

工商业的发展,为人类居住历史增添了“城市”这一全新的选项。从春秋战国时期的“货市”,到13世纪地中海沿岸星罗棋布的都市,风格迥异的城市为身处不同时代的居民提供了栖居之地。仅在中国,城市就以不到6%的土地面积,维…

个人征信预测

个人征信预测 --数据分析项目报一、项目概述 通过脱敏的现有数据,如:用户基本身份信息,消费行为,银行还款等,进行数据处理特征,选取并建立逾期预测模型,预测用户是否会逾期还款。二、项目概述数…