深度学习(28)——YOLO系列(7)

深度学习(28)——YOLO系列(7)

咱就是说,需要源码请造访:Jane的GitHub:在这里
上午没写完的,下午继续,是一个小尾巴。其实上午把训练的关键部分和数据的关键部分都写完了,现在就是写一下推理部分
在推理过程为了提高效率,速度更快:

detect 全过程

1.1 attempt_load(weights)

  • weights是加载的yolov7之前训练好的权重
  • 刚开始load以后还有BN,没有合并的
    在这里插入图片描述
  • 关键在下面的fuse()

1.2 model.fuse()

在这里插入图片描述

# 很隐蔽,刚开始我没想到接口是在这里的def fuse(self):  # fuse model Conv2d() + BatchNorm2d() layersprint('Fusing layers... ')for m in self.model.modules():if isinstance(m, RepConv):#print(f" fuse_repvgg_block")m.fuse_repvgg_block()elif isinstance(m, RepConv_OREPA):#print(f" switch_to_deploy")m.switch_to_deploy()elif type(m) is Conv and hasattr(m, 'bn'):m.conv = fuse_conv_and_bn(m.conv, m.bn)  # update convdelattr(m, 'bn')  # remove batchnormm.forward = m.fuseforward  # update forwardelif isinstance(m, (IDetect, IAuxDetect)):m.fuse()m.forward = m.fuseforwardself.info()return self

当遇到conv后面一定是有BN的,所以
在这里插入图片描述

1.3 fuse_conv_and_bn(conv,bn)

  • 先定义一个新的conv【和原来传入的是一样的inputsize,outputsize和kernel】
    在这里插入图片描述
  • 先得到w_conv: w_conv = conv.weight.clone().view(conv.out_channels, -1)
  • 得到w_bn: w_bn = torch.diag(bn.weight.div(torch.sqrt(bn.eps + bn.running_var)))bn.weight 就是以下公式中的gamma,sigma平方是方差bn.running_var在这里插入图片描述
  • 得到w_fuse: fusedconv.weight.copy_(torch.mm(w_bn, w_conv).view(fusedconv.weight.shape))
  • 得到b_conv,因为在学习过程中bias我们都设置为0,所以: b_conv = torch.zeros(conv.weight.size(0), device=conv.weight.device) if conv.bias is None else conv.bias
  • 得到b_bn :b_bn = bn.bias - bn.weight.mul(bn.running_mean).div(torch.sqrt(bn.running_var + bn.eps))【bn.bias是上面公式中的β,μ为均值bn.running_mean】
  • 计算b_fusefusedconv.bias.copy_(torch.mm(w_bn, b_conv.reshape(-1, 1)).reshape(-1) + b_bn)
def fuse_conv_and_bn(conv, bn):# Fuse convolution and batchnorm layers https://tehnokv.com/posts/fusing-batchnorm-and-conv/fusedconv = nn.Conv2d(conv.in_channels,conv.out_channels,kernel_size=conv.kernel_size,stride=conv.stride,padding=conv.padding,groups=conv.groups,bias=True).requires_grad_(False).to(conv.weight.device)# prepare filters bn.weight 对应论文中的gamma   bn.bias对应论文中的beta bn.running_mean则是对于当前batch size的数据所统计出来的平均值 bn.running_var是对于当前batch size的数据所统计出来的方差w_conv = conv.weight.clone().view(conv.out_channels, -1)w_bn = torch.diag(bn.weight.div(torch.sqrt(bn.eps + bn.running_var)))fusedconv.weight.copy_(torch.mm(w_bn, w_conv).view(fusedconv.weight.shape))# prepare spatial biasb_conv = torch.zeros(conv.weight.size(0), device=conv.weight.device) if conv.bias is None else conv.biasb_bn = bn.bias - bn.weight.mul(bn.running_mean).div(torch.sqrt(bn.running_var + bn.eps))fusedconv.bias.copy_(torch.mm(w_bn, b_conv.reshape(-1, 1)).reshape(-1) + b_bn)return fusedconv

1.4 Repvgg_block

把Repvgg中的卷积和BN合在一起

  • 原来的block↓
    在这里插入图片描述
  • 融合rbr_dense后:
    在这里插入图片描述
  • 融合rbr_1*1后:
    在这里插入图片描述

1.5 将1* 1卷积padding成3* 3

在这里插入图片描述
padding后
在这里插入图片描述
所有的都改变以后:model长这样——>
在这里插入图片描述
在这里插入图片描述
OK,这次真没啦,886~~~~

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

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

相关文章

青岛大学_王卓老师【数据结构与算法】Week05_07_顺序栈的操作1_学习笔记

本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础…

SqlServer数据库【基础-更删改查】

一、创建语句 (1)创建数据库 1.检查系统中是否存在这个数据库,存在则删除 格式: if exists(select * from sysdatabases where name数据库名) drop database 数据库名 go例子: if exists(select * from sysdataba…

Go语言之函数补充defer语句,递归函数,章节练习

defer语句是go语言提供的一种用于注册延迟调用的机制,是go语言中一种很有用的特性。 defer语句注册了一个函数调用,这个调用会延迟到defer语句所在的函数执行完毕后执行,所谓执行完毕是指该函数执行了return语句、函数体已执行完最后一条语句…

基于SpringBoot+vue的校园闲置物品租售系统设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

h5live 2.0.1 合入测试

直接超过1个G 有消息进来,就是不显示

2023年知识库软件爆火的有哪些?

2023年知识库软件爆火的可能性有很多,以下是一些可能的候选者: 一、Baklib:Baklib是一款新兴的知识库软件,它提供了强大的知识管理和组织功能。它能够帮助用户收集、整理和共享知识,并提供智能搜索和推荐引擎&#xf…

Docker容器常用命令大全:熟练掌握使容器优化更加高效

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

微服务-Nacos环境安装

文章目录 1. 微服务1.1 微服务概括 2. 微服务框架2.1 Spring Cloud2.2 Spring Cloud alibaba/Spring Cloud Netflix2.3微服务框架组件(alibaba) 3 Nacos3.1 Nacos介绍3.3 Naocs工作结构3.3 Nacos功能3.4 环境准备下载安装 1. 微服务 1.1 微服务概括 单体架构有问题,所以做项目…

设计模式之桥接模式

写在前面 本文看下桥接设计模式。 1:介绍 1.1:什么时候桥接设计模式 当一个业务场景由多个变化维度组成,并且这多个变化的维度到底有多少种情况是不确定,比如现在我们要为瑞幸咖啡写一个系统,很自然的,…

云计算的学习(四)

四、云计算中的存储基础知识 1.云计算虚拟化中的存储架构 ①虚拟化存储 在虚拟化存储架构中,最底层为物理磁盘。 底层的硬件组成存储池,存储池分为NAS存储和SAN存储;NAS存储需要文件系统;SAN存储需要对存储池进行逻辑划分产生逻…

Stability AI 把绘画门槛打为 0!

本文由 GPT- 4 所创作,配图由 Stable Doodle 生成。 编者按 Stability AI 上新了! 其收购的 Clipdrop 发布了全新的 Stable Doodle 工具,我在使用后最为直观的感受就是 —— 把绘画门槛打下来了。 在 Stable Doodle 之前,使用各…

动手学深度学习v2 p2 线性神经网络 线性回归

3. 线性神经网络 回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法。 在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。 在机器学习领域中的大多数任务通常都与预测(prediction&#xf…