物体检测-系列教程19:YOLOV5 源码解析9 (Focus模块、Model类构造函数)

😎😎😎物体检测-系列教程 总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传
点我下载源码

13、Focus模块

13.1 基本流程

在这里插入图片描述

  1. 原始输入图像的格式为:tensor: float32[1,3,640,640]
  2. 如图所示,首先对于每个通道对应的图都将其平均分成A、B、C、D4块
  3. 再分别将A、B、C、D也平均分成更小4块
  4. 从A、B、C、D每个位置都各取一块拼接成一个大块
  5. 将大块在原图对应的通道位置进行通道的堆叠
  6. 最后得到4张图像,此时通道数变成了12
  7. 此时进行卷积的时候,长宽减小而通道输入增加了,有利于减少计算量,但是却不会减少AP值
  8. 此时数据的格式为:tensor: float32[1,320,320,12]
  9. focus模块也有自己的卷积,然后经过hardswish激活函数 H a r d s w i s h ( x ) = { 0 i f x < = − 3 , x i f x > = + 3 , x ∗ ( x + 3 ) / 6 o t h e r w i s e Hardswish(x)=\begin{cases} 0 & if x<=-3,\\ x & if x>=+3,\\ x*(x+3)/6 & otherwise \end{cases} Hardswish(x)= 0xx(x+3)/6ifx<=3,ifx>=+3,otherwise

13.2 源码

Focus模块通过空间重组来增强通道信息

class Focus(nn.Module):# Focus wh information into c-spacedef __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groupssuper(Focus, self).__init__()self.conv = Conv(c1 * 4, c2, k, s, p, g, act)def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))
  1. 继承nn.module
  2. 构造函数,接受7个参数:c1输入通道、c2输出通道、k卷积核大小、s卷积步长、p填充、g卷积分组数、act激活函数
  3. 初始化
  4. 调用Conv类构造一个卷积层,这个类已经实现了批归一化、卷积、激活函数等
  5. 前向传播函数
  6. 将输入x在空间维度上分割为四部分,然后在通道维度上拼接,通过卷积层处理后输出

14、Model类

14.1 构造函数

class Model(nn.Module):def __init__(self, cfg='yolov5s.yaml', ch=3, nc=None):  # model, input channels, number of classessuper(Model, self).__init__()if isinstance(cfg, dict):self.yaml = cfg  # model dictelse:  # is *.yamlimport yaml  # for torch hubself.yaml_file = Path(cfg).namewith open(cfg) as f:self.yaml = yaml.load(f, Loader=yaml.FullLoader)  # model dict# Define modelif nc and nc != self.yaml['nc']:print('Overriding %s nc=%g with nc=%g' % (cfg, self.yaml['nc'], nc))self.yaml['nc'] = nc  # override yaml valueself.model, self.save = parse_model(deepcopy(self.yaml), ch=[ch])  # model, savelist, ch_out# print([x.shape for x in self.forward(torch.zeros(1, ch, 64, 64))])# Build strides, anchorsm = self.model[-1]  # Detect()if isinstance(m, Detect):s = 128  # 2x min stridem.stride = torch.tensor([s / x.shape[-2] for x in self.forward(torch.zeros(1, ch, s, s))])  # forwardm.anchors /= m.stride.view(-1, 1, 1)check_anchor_order(m)self.stride = m.strideself._initialize_biases()  # only run once# print('Strides: %s' % m.stride.tolist())# Init weights, biasesinitialize_weights(self)self.info()print('')
  1. 继承nn.Module
  2. 构造函数,传入3个参数,配置文件路径、输入通道数、类别数
  3. 初始化
  4. 配置信息是否为字典:
  5. 赋值给self.yaml
  6. 否则:
  7. 导入yaml工具包
  8. yaml_file ,获取文件名称
  9. 打开配置文件
  10. yaml ,加载配置文件
  11. 如果指定了类别数,并且与配置文件中的类别数不同
  12. 打印一条消息,说明正在覆盖YAML文件中的类别数
  13. 更新yaml字典中的类别数
  14. model,save ,调用parse_model函数,传入模型配置和输入通道数,返回模型的层和需要保存的层的列表
  15. m,获取模型的最后一层,通常是用于检测的层
  16. 最后一层是否是一个检测层
  17. s,设置一个基准步长大小
  18. m.stride,计算并设置检测层的步长。这是通过前向传播一个零张量(其尺寸基于s和输入通道数ch)并计算输出特征图的高度或宽度相对于s的比率来完成的
  19. m.anchors,调整锚点大小,使其适应步长的变化
  20. 调用check_anchor_order函数,检查锚点的顺序,并在需要时进行调整
  21. stride
  22. 调用**_initialize_biases函数**初始化模型的偏置参数,确保初始预测接近于均匀分布
  23. 调用initialize_weights函数来初始化模型中所有层的权重,以帮助模型训练时的收敛
  24. 调用info函数,打印模型的信息
  25. 打印一个换行,在输出中提供清晰的分隔,使得模型信息更容易阅读

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

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

相关文章

南京观海微电子---如何区分LED显示屏与LED背光源?

LED屏绝对不是常见的LED背光源&#xff0c;LED显示屏也被称为电子显示屏或浮动字。由LED点阵和LEDPC面板&#xff0c;通过红&#xff0c;蓝&#xff0c;白&#xff0c;绿LED的亮灭来显示文字&#xff0c;图像&#xff0c;动画&#xff0c;视频&#xff0c;内容。可根据不同的场…

C++ //练习 10.5 在本节对名册(roster)调用equal的例子中,如果两个名册中保存的都是C风格字符串而不是string,会发生什么?

C Primer&#xff08;第5版&#xff09; 练习 10.5 练习 10.5 在本节对名册(roster)调用equal的例子中&#xff0c;如果两个名册中保存的都是C风格字符串而不是string&#xff0c;会发生什么&#xff1f; 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具…

CSP-201912-2-回收站选址

CSP-201912-2-回收站选址 【50分思路-暴力枚举】 #include <iostream> #include <vector> #include <algorithm> using namespace std; struct trashPoint {int x; int y; }; vector<trashPoint>trashList; vector<int>grade(5); int main…

xxl-job异步任务日志打印到调度器任务管理日志

文章目录 1. xxl-job-core模块添加过滤器2. 执行器logback.xml添加过滤器配置3. 测试 1. xxl-job-core模块添加过滤器 package com.xxl.job.core.config;import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.ThrowableProxy; import ch.qos.…

Netty之ChannelHandlerMask详解

Netty的ChannelHandlerMask是用于标记ChannelHandler的位掩码。它被用于指示ChannelHandler的事件处理方式。ChannelHandlerMask 定义了ChannelHandler所有事件。 final class ChannelHandlerMask {static final int MASK_EXCEPTION_CAUGHT 1;static final int MASK_CHANNEL_…

SpringBoot多数据源最佳实践

为什么需要spring boot多数据源 最常见的场景就是单体架构系统需要跨库进行业务增删改查,例如一个购车系统可能需要查询用户信息,然后在进行购买汽车的逻辑。而用户表和汽车表可能不在一个数据库中。 如下图所示,可能一个购买汽车的下单流程为: 用户提交请求。 基于id到数…

【InternLM 实战营笔记】浦语·灵笔的图文理解及创作部署、 Lagent 工具调用 Demo

浦语灵笔的图文理解及创作部署 浦语灵笔是基于书生浦语大语言模型研发的视觉-语言大模型&#xff0c;提供出色的图文理解和创作能力&#xff0c;结合了视觉和语言的先进技术&#xff0c;能够实现图像到文本、文本到图像的双向转换。使用浦语灵笔大模型可以轻松的创作一篇图文推…

mybatis原理图,我拿到了梦寐以求的字节跳动和腾讯双offer

Kafka 如何做到支持百万级 TPS &#xff1f; 先用一张思维导图直接告诉你答案&#xff1a; 顺序读写磁盘 生产者写入数据和消费者读取数据都是顺序读写的&#xff0c;先来一张图直观感受一下顺序读写和随机读写的速度&#xff1a; 从图中可以看出传统硬盘或者SSD的顺序读写甚…

MySQL 多表查询 连接查询 外连接

介绍 MySQL 多表查询 连接查询 内连接 外连接分为两种&#xff0c;左外和右外连接&#xff0c; 左外&#xff1a;相当于查询表1(左表)的所有数据 包含 表1和表2交集部分的数据,完全包含左表的数据 右外&#xff1a;相当于查询表2(右表)的所有数据 包含 表1和表2交集部分的数据…

攻防世界例题wp

1.看到_wakeup()函数第一反应要么触发&#xff0c;要么绕过在这里绕过 2.构造payload实例化一个对象后反序列化 3构造脚本如下&#xff1a; 4.因为它是一个绕过的方法所以我们要使用绕过的方法。 5.继续构造payload将上图的1换成2进行绕过 最终的payload为 O:4:"xctf…

消息队列+更新DB极易引发的DB并发修改bug

背景 我们在生产系统中和其他系统进行交互时一般都会通过消息队列来解耦生产者和消费者&#xff0c;然后通过每个使用方消费消息队列的消息的方式来完成消息的消费&#xff0c;并且一般来说我们消费消息后极有可能会操作DB&#xff0c;不过这种方式如果处理不够仔细&#xff0…

[攻防世界]-Web:fileclude解析

查看网页 代码审计&#xff1a; file_get_contents($file2)&#xff1a;读取文件内容并将内容返回 解法一payload&#xff1a; ?file1php://filter/readconvert.base64-encode/resourceflag.php&file2data://text/plain,hello%20ctf 解法二payload&#xff1a;

AI新工具(20240229) Ideogram 1.0先进的文本转图像模型发布;search2ai让 LLM API 支持联网搜索

1: LTX Studio LTX Studio开放测试&#xff0c;用户可以通过输入文本来生成超过25秒的微电影视频 LTX Studio是由著名AI平台Lightricks推出的生成式AI电影制作平台。用户可以通过输入文本来生成超过25秒的微电影视频&#xff0c;并且可以对视频的镜头切换、角色、场景一致性、…

C++的晨曦之旅:开启编程的新篇章

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、 命名空间 在 C/C 中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0…

继电保护测试仪

武汉凯迪正大继电保护测试仪主要特点 1&#xff0e;满足现场试验要求。本仪器具有标准的四相电压&#xff0c;三相电流输出&#xff0c;既可对传统的各种继电器及保护装置进行试验&#xff0c;也可对现代各种微机保护进行各种试验&#xff0c;特别是对变压器差功保护和备自投装…

南方电网的能源棋局上,蔚来换电扮演什么角色?

2 月 26 日&#xff0c;南网储能科技与蔚来能源签署协议&#xff0c;将充换电站、储能站、可调负载等聚合资源连接到虚拟电厂平台&#xff0c;推动换电站作为分布式储能在虚拟电厂项目上的应用。 蔚来换电站是国内首个智慧微电网型分布式换电设施&#xff0c;可透过换电订单预…

【递归搜索回溯专栏】前言与本专栏介绍

本专栏内容为&#xff1a;递归&#xff0c;搜索与回溯算法专栏。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;递归搜索回溯专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代…

【YOLO v5 v7 v8 小目标改进】ODConv:在卷积核所有维度(数量、空间、输入、输出)上应用注意力机制来优化传统动态卷积

ODConv&#xff1a;在卷积核所有维度&#xff08;数量、空间、输入、输出&#xff09;上应用注意力机制来优化传统的动态卷积 提出背景传统动态卷积全维动态卷积效果 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改 论文&#xff1a;https://openreview.net/pdf?idDmpCfq6Mg…

LeetCode54题:螺旋矩阵(python3)

路径的长度即为矩阵中的元素数量&#xff0c;当路径的长度达到矩阵中的元素数量时即为完整路径&#xff0c;将该路径返回。 循环打印&#xff1a; “从左向右、从上向下、从右向左、从下向上” 四个方向循环打印。 class Solution:def spiralOrder(self, matrix: List[List[i…

计算机网络_2.2物理层下面的传输媒体

2.2物理层下面的传输媒体 一、传输媒体的分类二、导向型传输媒体1、同轴电缆2、双绞线3、光纤&#xff08;1&#xff09;光纤通信原理&#xff08;2&#xff09;光纤组成&#xff08;4&#xff09;多模光纤与单模光纤对比&#xff08;5&#xff09;光纤的波长与规格&#xff08…