Transformer实战-系列教程17:DETR 源码解读4(Joiner类/PositionEmbeddingSine类/位置编码/backbone)

🚩🚩🚩Transformer实战-系列教程总目录

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

DETR 算法解读
DETR 源码解读1(项目配置/CocoDetection类)
DETR 源码解读2(ConvertCocoPolysToMask类)
DETR 源码解读3(DETR类)
DETR 源码解读4(Joiner类/PositionEmbeddingSine类/位置编码/backbone)

5、Joiner类

位置:models/backbone.py/Joiner类

class Joiner(nn.Sequential):def __init__(self, backbone, position_embedding):super().__init__(backbone, position_embedding)def forward(self, tensor_list: NestedTensor):xs = self[0](tensor_list)out: List[NestedTensor] = []pos = []for name, x in xs.items():out.append(x)pos.append(self[1](x).to(x.tensors.dtype))return out, pos
  1. 定义Joiner类,继承自PyTorch的nn.Sequential
  2. 构造函数
  3. 初始化
  4. 前向传播函数,接收一个类型为NestedTensor的参数tensor_list
  5. xs,self[0] 指的是nn.Sequential容器中的第一个模块,根据__init__方法中的定义,这是backbone模块。所以,self[0](tensor_list)表示对输入的tensor_list执行backbone模块的前向传播
  6. 初始化一个空列表out,用于存储backbone输出的特征
  7. pos = []**:初始化一个空列表pos,用于存储由position_embedding`生成的位置编码
  8. 遍历xs
  9. 将当前层的输出x添加到out列表中
  10. self[1] 指的是nn.Sequential容器中的第二个模块,根据初始化时的顺序,这是position_embedding模块。因此,self[1](x)表示对backbone的输出x执行position_embedding模块的前向传播
  11. out、pos

6、PositionEmbeddingSine类

位置:models/position_encoding.py/PositionEmbeddingSine类

DETR提供了两种位置编码方式,一种是和Transformer一样的正余弦,另一种是可学习的位置编码方式,下面是和Transformer一样的正余弦

6.1 构造函数

class PositionEmbeddingSine(nn.Module):def __init__(self, num_pos_feats=64, temperature=10000, normalize=False, scale=None):super().__init__()self.num_pos_feats = num_pos_featsself.temperature = temperatureself.normalize = normalizeif scale is not None and normalize is False:raise ValueError("normalize should be True if scale is passed")if scale is None:scale = 2 * math.piself.scale = scale
  1. 继承nn.Module的类
  2. 构造函数
  3. 初始化
  4. num_pos_feats ,每个位置特征数量的一般
  5. temperature ,缩放因子,用于调整位置编码的频率
  6. normalize ,是否对位置坐标进行归一化
  7. scale,在归一化位置坐标时使用的额外缩放因子
  8. 验证scale和normalize参数的兼容性
  9. 设置scale的默认值为2 * math.pi,如果未提供

6.2 前向传播

    def forward(self, tensor_list: NestedTensor):x = tensor_list.tensorsmask = tensor_list.maskassert mask is not Nonenot_mask = ~masky_embed = not_mask.cumsum(1, dtype=torch.float32)x_embed = not_mask.cumsum(2, dtype=torch.float32)if self.normalize:eps = 1e-6y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scalex_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scaledim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=x.device)dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats)pos_x = x_embed[:, :, :, None] / dim_tpos_y = y_embed[:, :, :, None] / dim_tpos_x = torch.stack((pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4).flatten(3)pos_y = torch.stack((pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4).flatten(3)pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2)return pos
  1. 前向传播函数
  2. x,从tensor_list提取张量,torch.Size([2, 2048, 25, 29]),2是batch,2048是一个像素点的特征向量维度,后面是特征图长宽
  3. mask ,从tensor_list提取掩码,torch.Size([2, 25, 29]),这里面存储的全是bool值
  4. 确认mask 存在
  5. 通过对掩码取反获取非掩码区域,这里非掩码区域指的是图像的有效部分
  6. y_embed,计算非掩码区域在垂直(y)方向上的累积和,用于生成位置编码,torch.Size([2, 25, 29])
  7. x_embed,计算非掩码区域在水平(x)方向上的累积和,用于生成位置编码,torch.Size([2, 25, 29])
  8. 如果启用了归一化
  9. 一个很小的数,防止出现除以0
  10. 对y_embed
  11. x_embed进行归一化并应用缩放因子self.scale
  12. dim_t ,torch.Size([128]),生成一个维度张量dim_t,用于控制正弦和余弦函数的频率
  13. dim_t ,torch.Size([128]),根据temperature和num_pos_feats调整其值
  14. pos_x ,对x_embed应用缩放,torch.Size([2, 25, 29, 128])
  15. pos_y ,对y_embed应用缩放,准备生成正弦和余弦编码,torch.Size([2, 25, 29, 128])
  16. pos_x ,分别计算所有偶数位置的正弦值和所有奇数位置的余弦值,将正弦值和余弦值沿着新的维度堆叠起来,将堆叠后的维度(正弦和余弦值对)展平,torch.Size([2, 25, 29, 128])
  17. pos_y ,torch.Size([2, 25, 29, 128])
  18. pos ,将pos_y和pos_x在第3维上进行拼接,形成完整的位置编码,torch.Size([2, 256, 25, 29])
  19. 返回pos

通过这种方式,PositionEmbeddingSine类为每个像素位置生成了一个独特的编码,这个编码通过正弦和余弦函数的交替使用捕获了空间位置信息。正弦和余弦函数的周期性和连续性特点使得这种编码非常适合表示位置关系,有助于提高模型对图像空间信息的理解和处理能力

DETR 算法解读
DETR 源码解读1(项目配置/CocoDetection类)
DETR 源码解读2(ConvertCocoPolysToMask类)
DETR 源码解读3(DETR类)
DETR 源码解读4(Joiner类/PositionEmbeddingSine类/位置编码/backbone)

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

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

相关文章

数据结构-并查集

并查集原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个 单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询一 个元素归属于那个集合的运算。适合于描述这类…

Matplotlib Figure与Axes速成:核心技能一网打尽

Matplotlib Figure与Axes速成:核心技能一网打尽 🌵文章目录🌵 🌳引言🌳🌳 一、Figure(图形)🌳🍁1. 创建Figure🍁🍁2. 添加Axes&#…

NARF关键点提取原理简介

一、NARF2D边缘点探测的矩形平面的边长s和计算点p和上邻域的距离所用的k值 二、障碍物边缘和阴影边缘 三、NARF边缘点探测 四、NARF借助边缘点信息进行关键点检测 本人也是参考其他博主,以及这份英文文献写的(毕竟是英文文献,部分翻译肯定有些误差&…

一探Lepton Search究竟

2024年1月25日,阿里巴巴原技术副总裁在 Twitter 上称用不到 500 行 Python 代码实现了 AI 对话搜索引擎,并在27日附上了开源地址:https://github.com/leptonai/search_with_lepton,截止春节期间已经5.8K的Star。 Twitter截图 Comm…

Spring Security学习(四)——登陆认证(包括自定义登录页)

前言 和前面的文章隔了很长时间才更新Spring Security系列,主要原因一个是之前太忙了,把项目都忙完了,赶上春节假期,就慢慢研究。Spring Security的体系非常复杂,一口吃不了热豆腐,没办法速成,…

第10讲投票创建页面实现

投票创建页面实现 文件选择上传组件 uni-file-picker 扩展组件 安装 https://ext.dcloud.net.cn/plugin?nameuni-file-picker 日期选择器uni-datetime-picker组件 安装 https://ext.dcloud.net.cn/plugin?nameuni-datetime-picker iconfont小图标 https://www.iconfont…

【数据结构与算法】判断二叉树是否完全二叉树

递归方式判断二叉树是否完全二叉树 bool TreeComplete(TreeNode* root) {if (root ! NULL) {if (root->left NULL && root->right ! NULL) {return false; // 左子树空}else if (root->left NULL && root->right NULL) {return true; // 左右子…

【力扣每日一题】力扣987二叉树的垂序遍历

题目来源 力扣987二叉树的垂序遍历 题目概述 给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。 对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row 1, col - 1) 和 (row 1, col 1) 。树的根结点位于 (0, 0) 。 二…

仰暮计划|“​他们艰苦半生,但真的希望祖国安祥,山河无恙”

自述,自赎 我没有在那个年代生活过,我一出生就是盛世中国,看遍了祖国的大好河山。但我没想到,走了这么远的路,吃了这么多的苦的爷爷会一直跟我说“不是国家不好,只是中国的钱拿去还债了,过了那…

代码随想录算法训练营Day56|583. 两个字符串的删除操作、72. 编辑距离

目录 583. 两个字符串的删除操作 前言 思路 算法实现 法二 72. 编辑距离 前言 思路 算法实现 总结 583. 两个字符串的删除操作 题目链接 文章链接 前言 本题与上一题不同的子序列相比,变化就是两个字符串都可以进行删除操作了。 思路 利用动规五部曲进…

【AI视野·今日Robot 机器人论文速览 第七十九期】Thu, 18 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Thu, 18 Jan 2024 Totally 43 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers CognitiveDog: Large Multimodal Model Based System to Translate Vision and Language into Action of Quadruped Robot Aut…

哈希表 ?

哈希表 首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。 哈希表是根据关键码的值而直接进行访问的数据结构。 这么这官方的解释…

【C++初阶:类和对象(下篇)】初始化列表 | static成员 | 友元

目录 一、构造函数构造函数体赋值🐾初始化列表🐾💦 explicit关键字 二、static成员🐾概念**💦 关于静态的特性** 三、友元💦 **友元函数**💦 **友元类** **四、内部类** 一、构造函数 构造函数…

Spark的timestamp 数据时间问题

使用Spark来处理国际业务数据,涉及到数据时区转换,在实际项目中出现时区转换问题。 使用代码: spark.conf.set("spark.sql.session.timeZone", "Asia/Hong_Kong") spark.selectExpr("date_format(eff_dt, yyyyMMdd…

VM和Linux安装

VM和Linux安装 一、下载VM 1.官网地址:https://www.vmware.com/cn.html 2.其他地址:http://ww7.nocmd.com/windows/740.html 许可证这个,大家可以自己上网搜索,很容易就搜索到就可以使用了 上面内容就是安装VM的步骤 安…

30. 异常

异常 1. 概述2. Throwable 方法2.1 概述2.2 代码示例 3. 异常分类4. 异常处理方式4.1 JVM默认处理异常4.2 自己处理(捕获异常)try...catch4.2.1 概述4.2.2 灵魂四问 4.3 抛出处理(throw和throws) 5. 自定义异常5.1 概述5.2 代码示例 6. 异常注意事项 文章…

代码随想录算法训练营第三十一天 |基础知识,455.分发饼干,376.摆动序列,53.最大子序和(已补充)

基础知识: 题目分类大纲如下: #算法公开课 《代码随想录》算法视频公开课(opens new window):贪心算法理论基础!(opens new window),相信结合视频再看本篇题解,更有助于大家对本题的理解。 #什么是贪心 贪心的本质…

C语言——oj刷题——回文字符串

问题: 实现一个函数,判断一个字符串是否为回文字符串。 回文字符串是指正读和反读都相同的字符串。例如,"level"、"radar"和"madam"都是回文字符串。 要解决这个问题,我们可以使用两个指针分别指向…

c语言简单json库

文章目录 写在前面头文件源代码使用示例 写在前面 用c语言实现的一个简单json库,极其轻量 仅1个四百多行源码的源文件,和1个头文件 支持对象、数组、数值、字符串类型 github仓库 头文件 对主要的json API的声明 #ifndef ARCOJSON_ARCOJSON_H #defin…

python从入门到精通(二十):python的exe程序打包制作

python的exe程序打包制作 python打包的概念python打包的模块导入模块安装验证基本语法命令参数文件夹模式单文件模式资源嵌入exe更改图标启动画面(闪屏)禁用异常提示 python打包的概念 将普通的*.py程序文件打包成exe文件。exe文件即可执行文件&#xf…