Transformer在文本、图像和点云数据中的应用——经典工作梳理

摘要

最近在整一些3D检测和分割的任务,接触了一下ptv3,在之前梳理的工作owlv2中用到了vit,去年年假阅读《多模态大模型:算法、应用与微调》(刘兆峰)时学习了Transformer网络架构及其在文本数据中的应用,细数下来,似乎各方面都多多少少了解和应用过一些,但是直到昨天跟别人讨论起Transformer在多模态数据中的应用,发现自己了解的不太系统,基于这个大背景,我希望借助闲暇时间梳理一下相关的代表性工作,后面如果有机会,也会做一些实践记录,希望自己学会的同时也可以帮助到一些有需要的小伙伴。

Transformer基础知识

网络架构

在这里插入图片描述

Transformer在nlp中的应用

Transformer在image处理中的应用

Transformer在point clouds处理中的应用

20250820:因为最近在整一些3d相关的工作,所以从该部分开始梳理。如果大家对pointnet系列的点云分割工作感兴趣的话,可以去看一下我之前整理的这篇文章3D分割系列论文梳理,欢迎一起讨论。

PT

参考链接:https://zhuanlan.zhihu.com/p/681682833

贡献

We design a highly expressive Point Transformer layer for point cloud processing. The layer is invariant to permutation and cardinality and is thus inherently suited to point cloud processing.
在pointnet中有提到,3d点云实际上是一种集合,在点云网络结构的设计中,由于点云是无序的,所以设计与点云排序和点数量无关的网络至关重要。而transformer的自注意力机制天生具有排序和点个数不变性,使得它非常适合用来提取点集的特征。
而本文也是聚焦在对点云局部特征提取结构的改造,将自注意力机制应用在了局部特征提取上。

Based on the Point Transformer layer, we construct high-performing Point Transformer networks for classification and dense prediction on point clouds. These networks can serve as general backbones for 3D scene understanding.

We report extensive experiments over multiple domains and datasets. We conduct controlled studies to examine specific choices in the Point Transformer design and set the new state of the art on multiple highly competitive benchmarks, outperforming long lines of prior work.

相关工作梳理

第一类,将不规则点云转换成规则表示:

Projection-based networks

将点云投影成图片,利用2D CNN进行处理,最后利用多视角特征融合构建最终的输出特征表示。

在基于投影的框架中,点云中的几何信息会在投影阶段被压缩。这些方法在投影平面上构建密集像素网格时,可能未能充分利用点云的稀疏特性。投影平面的选择会显著影响识别性能,而三维场景中的遮挡现象也可能导致精度下降。

Voxel-based networks

3D体素+3D 卷积
该类方法,如果直接简单粗暴的使用3D卷积的话,计算量和内存占用会随着分辨率增加导致体素块数量呈三次方增长而增加,解决方式是使用稀疏卷积或者非平衡八叉树结构,一定程度上减少计算量和内存占用。此外,由于体素网格上的量化处理,仍可能丢失部分几何细节。

第二类,直接操作不规则点云

Point-based networks.

研究人员没有将不规则点云投影或量化到二维或三维的规则网格上,而是设计了深度网络结构,直接将点云作为嵌入连续空间的集合来吸收。(pointnet/pointnet++)
许多方法将点集连接成一个图,并在此图上进行信息传递。(此类目前了解的比较少)
许多方法基于直接应用于三维点集的连续卷积,而无需量化。(此类目前了解的比较少)

本文的研究灵感

在序列处理和二维图像任务中,Transformer和自注意力网络的表现可与卷积网络相媲美甚至更胜一筹。自注意力机制在本研究中具有特殊意义,因其本质上属于集合运算:位置信息作为元素属性被处理为集合形式。由于三维点云本质上是具有空间属性的点集,这种机制特别适合此类数据类型。为此,开发了专门针对三维点云的点变换器层,实现了自注意力机制的应用。

Point Transformer

background

Self-attention operators can be classified into two types: scalar attention [39] and vector attention [54]. 此处文章中公式很清晰,如果还是看不懂的话,可以问问豆包,并让它给举个例子,很清晰。

Point Transformer layer

数学运算:
在这里插入图片描述

在局部邻域应用vector self-attention,对特征所做的数学运算见上图公式(3),对应的网络架构见下图。(确定提局部邻域特征的运算是关键,后续搭建网络是水到渠成的事情)

在这里插入图片描述

Position Encoding

在这里插入图片描述

Network Architecture

在这里插入图片描述

Backbone structure

The feature encoder in point transformer networks for semantic segmentation and classification has five stages that operate on progressively downsampled point sets. The downsampling rates for the stages are [1, 4, 4, 4, 4], thus the cardinality of the point set produced by each stage is [N, N/4, N/16, N/64, N/256], where N is the number of input points.

Transition down

见网络架构图

Transition up

见网络架构图

Output head

见网络架构图

问题及解答

问题1:TransitionDown与PointTransformerLayer都是做局部特征提取的,它俩有什么不同?并且两个块之间的数据是怎么流动的?

参考了openpoints库中的代码:


class TransitionDown(nn.Module):def __init__(self, in_planes, out_planes, stride=1, nsample=16):super().__init__()self.stride, self.nsample = stride, nsampleif stride != 1:self.linear = nn.Linear(3 + in_planes, out_planes, bias=False)self.pool = nn.MaxPool1d(nsample)else:self.linear = nn.Linear(in_planes, out_planes, bias=False)self.bn = nn.BatchNorm1d(out_planes)self.relu = nn.ReLU(inplace=True)# 如果self.stride != 1会减少点数,通过最大池化获取每个分组的全局特征。def forward(self, pxo):p, x, o = pxo  # (n, 3), (n, c), (b)if self.stride != 1:n_o, count = [o[0].item() // self.stride], o[0].item() // self.stridefor i in range(1, o.shape[0]):count += (o[i].item() - o[i - 1].item()) // self.striden_o.append(count)n_o = torch.cuda.IntTensor(n_o)# print(n_o.device, p.device)idx = pointops.furthestsampling(p, o, n_o)  # (m)n_p = p[idx.long(), :]  # (m, 3)x = pointops.queryandgroup(self.nsample, p, n_p, x, None, o, n_o, use_xyz=True)  # (m, nsample,3+c)x = self.relu(self.bn(self.linear(x).transpose(1, 2).contiguous()))  # (m, out_planes, nsample)x = self.pool(x).squeeze(-1)  # (m, out_planes)p, o = n_p, n_oelse:x = self.relu(self.bn(self.linear(x)))  # (n, out_planes)return [p, x, o]class PointTransformerLayer(nn.Module):def __init__(self, in_planes, out_planes, share_planes=8, nsample=16):super().__init__()self.mid_planes = mid_planes = out_planes // 1self.out_planes = out_planesself.share_planes = share_planesself.nsample = nsampleself.linear_q = nn.Linear(in_planes, mid_planes)self.linear_k = nn.Linear(in_planes, mid_planes)self.linear_v = nn.Linear(in_planes, out_planes)self.linear_p = nn.Sequential(nn.Linear(3, 3), nn.BatchNorm1d(3), nn.ReLU(inplace=True),nn.Linear(3, out_planes))self.linear_w = nn.Sequential(nn.BatchNorm1d(mid_planes), nn.ReLU(inplace=True),nn.Linear(mid_planes, mid_planes // share_planes),nn.BatchNorm1d(mid_planes // share_planes), nn.ReLU(inplace=True),nn.Linear(out_planes // share_planes, out_planes // share_planes))self.softmax = nn.Softmax(dim=1)# 不会减少点数,只是会对每个点,计算其邻域的self-attentiondef forward(self, pxo) -> torch.Tensor:p, x, o = pxo  # (n, 3), (n, c), (b)# 点特征分别经过三个线性层,获得q,k,vx_q, x_k, x_v = self.linear_q(x), self.linear_k(x), self.linear_v(x)  # (n, c)# 查找最近邻x_k = pointops.queryandgroup(self.nsample, p, p, x_k, None, o, o, use_xyz=True)  # (n, nsample, 3+c)x_v = pointops.queryandgroup(self.nsample, p, p, x_v, None, o, o, use_xyz=False)  # (n, nsample, c)p_r, x_k = x_k[:, :, 0:3], x_k[:, :, 3:]for i, layer in enumerate(self.linear_p): p_r = layer(p_r.transpose(1, 2).contiguous()).transpose(1,2).contiguous() if i == 1 else layer(p_r)  # (n, nsample, c)w = x_k - x_q.unsqueeze(1) + p_r.view(p_r.shape[0], p_r.shape[1], self.out_planes // self.mid_planes,self.mid_planes).sum(2)  # (n, nsample, c)for i, layer in enumerate(self.linear_w): w = layer(w.transpose(1, 2).contiguous()).transpose(1,2).contiguous() if i % 3 == 0 else layer(w)w = self.softmax(w)  # (n, nsample, c)n, nsample, c = x_v.shapes = self.share_planes# w.unsqueeze(2)广播机制x = ((x_v + p_r).view(n, nsample, s, c // s) * w.unsqueeze(2)).sum(1).view(n, c)  # (n, out_planes)return x

由上述开源代码可以看出来,TransitionDown是对输入点集进行最远点采样,分组,逐点特征提取以及组内最大池化后输出各个邻域的特征。
而PointTransformerLayer是对输入的点集中的每一个点查找k近邻,然后对每个邻域做自注意力,获得每个点的聚合特征,并不会减少点的数量。(自注意力机制的核心是 “同一组数据内部元素之间的注意力交互”(即查询、键、值均来自同一组输入)。)

PTV2

PTV3

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

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

相关文章

训练后数据集后部署PaddleOCR转trt流程

训练后的模型部署,首先要进行训练 0.训练流程见文章 PaddleOCR字符识别,训练自己的数据集全流程(环境、标注、训练、推理)-CSDN博客文章浏览阅读1.6k次,点赞53次,收藏23次。PaddleOCR是基于百度飞桨框架的…

《MLB美职棒》美国国球是橄榄球还是棒球·棒球5号位

USAs National Sport Showdown: MLB⚾️ vs NFL Ultimate Guide!从商业价值到文化基因,360解析美国体育王座之争!添加图片注释,不超过 140 字(可选)️ 历史定位 Historical Roots⚾️ MLB:The "Classi…

常见 Linux 网络命令梳理

在日常运维和排障工作中,网络相关命令是最常用的一类工具。无论是检查网络连通性,还是定位路由问题,又或是分析端口和服务占用,熟悉这些命令都能让我们更高效地解决问题。本文将从几个常见的维度来梳理 Linux 下的网络命令&#x…

Docker 搭建 Gitlab 实现自动部署Vue项目

1、配置要求: 硬件要求: CPU:双核或以上 内存:4GB或以上 软件要求:Centos6 或更高版本 2、gitlab镜像: # 中文版仓库 #docker pull twang2218/gitlab-ce-zh docker pull gitlab/gitlab-ce 3、gitlab部署目录 说明:为了跟其他容器区分,gitlab相关容…

如何解决机器翻译的“幻觉“问题(Hallucination)?

更多内容请见: 机器翻译修炼-专栏介绍和目录 文章目录 一、数据层面优化 二、模型架构改进 三、训练策略调整 四、评估与迭代 五、前沿方向与挑战 六、案例:WMT2023幻觉缓解方案 机器翻译中的“幻觉”(Hallucination)指模型生成与源文本语义无关、逻辑矛盾或事实错误的翻译…

基于STM32+NBIOT设计的宿舍安防控制系统_264

文章目录 1.1 项目介绍 【1】开发背景 【2】实现需求 【3】项目硬件模块组成 【4】设计意义 【5】国内外研究现状 【6】摘要 1.2 系统总体设计 【1】系统功能需求分析 【2】系统总体方案设计 【3】系统工作原理 1.3 系统框架图 1.4 系统功能总结 1.5 系统原理图 1.6 实物图 1.7…

SLAM文献之-Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping

一、简介 该论《Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping》是日本先进工业科学技术研究所(AIST)的Koide等人于2022年在IEEE国际机器人与自动化会议(ICRA)上发表的一篇论文。该研究提出了一种基于全局…

【STM32】HAL库中的实现(七):DMA(直接存储器访问)

DMA 是什么? DMA(Direct Memory Access)是 外设直接和内存之间数据搬运的机制,不需要 CPU 参与。 ✅ 举个例子:传统方式: ADC → CPU → RAM 使用 DMA:ADC → DMA → RAM(CPU 不需干…

【LeetCode热题100道笔记+动画】字母异位词分组

题目描述 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 示例 1: 输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]] 解释: 在 strs 中没有字符串可…

【Kafka】常见简单八股总结

为什么使用消息队列? 解耦: 我以我的一段开发经验举例: 【Kafka】登录日志处理的三次阶梯式优化实践:从同步写入到Kafka多分区批处理 我做过一个登录日志逻辑,就是在登录逻辑末尾,加一段写进数据库登录日志…

微信小程序连接到阿里云物联网平台

目录准备阶段阿里云配置下载mqtt.min.js文件小程序实现注意小程序配置服务器域名概述:介绍使用微信小程序连接到阿里云平台的快捷方法和完整过程。 阿里云平台建立设备,提供mqtt连接参数,小程序借助mqtt.min.js,也就是基于Github下…

2-3〔O҉S҉C҉P҉ ◈ 研记〕❘ 漏洞扫描▸AppScan(WEB扫描)

郑重声明: 本文所有安全知识与技术,仅用于探讨、研究及学习,严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任,本人不承担任何责任。 如需转载,请注明出处且不得用于商业盈利。 …

LeetCode 刷题【47. 全排列 II】

47. 全排列 II 自己做 解1&#xff1a;检查重复 class Solution { public:void circle(vector<int> nums, vector<vector<int>> &res,int start){int len nums.size();if(start len - 1){ //到头了//检查重复bool is_exist fa…

Https之(一)TLS介绍及握手过程详解

文章目录简介 TLSTLS第一次握手1.Client HelloTLS第二次握手2.Server Hello3.Certificate4.Server Hello DoneTLS第三次握手5.Client Key Exchange6.Change Cipher Spec7.Encrypted Handshake MessageTLS第四次握手8.New Session Ticket9.Change Cipher Spec10.Encrypted Hands…

【WEB 】从零实现一个交互轮播图(附源码)

文章目录 一、轮播图整体功能规划二、HTML结构深度解析三、CSS样式实现细节1. 定位系统详解2. 显示/隐藏机制3. 按钮交互效果实现4. 纯CSS箭头实现5. 指示器&#xff1a;当前位置可视化 四、JavaScript逻辑深入解析1. 核心变量与DOM获取2. 图片切换函数&#xff08;核心逻辑&am…

机器学习--PCA降维

一核心部分 1解决的问题&#xff1a;应对高维数据带来的计算量大、冗余信息多、易出现过拟合等问题&#xff0c;在减少数据维度的同时尽可能保留原始数据的关键信息。2核心思想&#xff1a…

leetcode 1277. 统计全为 1 的正方形子矩阵 中等

给你一个 m * n 的矩阵&#xff0c;矩阵中的元素不是 0 就是 1&#xff0c;请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。示例 1&#xff1a;输入&#xff1a;matrix [[0,1,1,1],[1,1,1,1],[0,1,1,1] ] 输出&#xff1a;15 解释&#xff1a; 边长为 1 的正方形有…

知识蒸馏 - 各类概率分布

知识蒸馏 - 各类概率分布 flyfish一、离散概率分布 离散分布描述的是取值为离散值&#xff08;如0,1,2,…&#xff09;的随机变量的概率规律&#xff0c;通常用概率质量函数&#xff08;PMF&#xff09; 表示某一取值的概率。 1. 伯努利分布&#xff08;Bernoulli Distribution…

软件测试-Selenium学习笔记

""" 目标&#xff1a; driver.find_element() 需求&#xff1a; 1. 使用driver.find_element()方法 2. 输入用户名&#xff1a;admin 3. 输入密码&#xff1a;123456 """ # 导包 from selenium import webdriver from time import …

知微传感3D相机上位机DkamViewer使用:给相机升级固件

写在前面 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有&#xff1a; 1、便利他人应用相机&#xff0c;本系列文章包含公司所出售相机的SDK的使用例程及详细注释&#xff1b;2、促进行业发展及交流。 知微传感Dkam系列3D相机可以应用于定位分拣、焊接焊缝提取、…