基于沙漏 Tokenizer 的高效三维人体姿态估计框架HoT

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 摘要
  • Abstract
  • 文献阅读:基于沙漏 Tokenizer 的高效三维人体姿态估计框架HoT
    • 1、研究背景
    • 2、提出方法
    • 3、模块详细
      • 3.1、什么是HoT
      • 3.2、HoT 框架
      • 3.3、Token 剪枝聚类模块
      • 3.4、Token 恢复注意力模块
      • 3.5、模块应用
    • 4、实验
      • 4.1、消融实验
      • 4.2、与SOTA对比
    • 5、总结
  • 简单Transformer的实现
  • 总结


摘要

本周主要阅读了CVPR文章,Hourglass Tokenizer for Effcient Transformer-Based 3D Human Pose Estimation。这是一种即插即用的 Token 剪枝和恢复框架,用于从视频中高效地进行基于 Transformer 的 3D 人体姿势估计。大量实验验证了本方法的高度兼容性和广泛适用性。它可以轻松集成至各种常见的 VPT 模型中,不论是基于 seq2seq 还是 seq2frame 的 VPT,并且能够有效地适应多种 Token 剪枝与恢复策略,展示出其巨大潜力。除此之外,还学习学习了简单的Transformer代码的学习。

Abstract

This week, I mainly read the CVPR article, Hourglass Tokenizer for Effcient Transformer-Based 3D Human Pose Estimation. This is a plug-and-play Token pruning and recovery framework for efficient Transformer-based 3D human pose estimation from video. A large number of experiments have verified the high compatibility and wide applicability of this method. It can be easily integrated into various common VPT models, whether based on seq2seq or seq2frame VPT, and can effectively adapt to multiple Token pruning and recovery strategies, demonstrating its great potential. In addition, I also learned how to write simple Transformer code.


文献阅读:基于沙漏 Tokenizer 的高效三维人体姿态估计框架HoT

Title: Hourglass Tokenizer for Effcient Transformer-Based 3D Human Pose Estimation
Author:Wenhao Li , Mengyuan Liu, Hong Liu,Pichao Wang,Jialun Cail Nicu Sebet
From:2024 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)

1、研究背景

在 VPT 模型中,通常每一帧视频都被处理成一个独立的 Pose Token,通过处理长达数百帧的视频序列(通常是 243 帧乃至 351 帧)来实现卓越的性能表现,并且在 Transformer 的所有层中维持全长的序列表示。然而,由于 VPT 中自注意力机制的计算复杂度与 Token 数量(即视频帧数)的平方成正比关系,当处理具有较高时序分辨率的视频输入时,这些模型不可避免地带来了巨大的计算开销,使得它们难以被广泛部署到计算资源有限的实际应用中。此外,这种对整个序列的处理方式没有有效考虑到视频序列内部帧之间的冗余性,尤其是在视觉变化不明显的连续帧中。这种信息的重复不仅增加了不必要的计算负担,而且在很大程度上并没有对模型性能的提升做出实质性的贡献。

2、提出方法

作者提出了一种基于沙漏 Tokenizer 的高效三维人体姿态估计框架HoT,用来解决现有视频姿态 Transformer(Video Pose Transformer,VPT)高计算需求的问题。基于对实现高效VPT要解决时间感受野要打、视频冗余得去除的问题,作者提出对深层 Transformer 的 Pose Token 进行剪枝,以减少视频帧的冗余性,同时提高 VPT 的整体效率。该框架可以即插即用无缝地集成到 MHFormer,MixSTE,MotionBERT 等模型中,降低模型近 40% 的计算量而不损失精度。

3、模块详细

3.1、什么是HoT

HoT是第一个基于 Transformer 的高效三维人体姿态估计的即插即用框架。如下图所示,传统的 VPT 采用了一个 “矩形” 的范式,即在模型的所有层中维持完整长度的 Pose Token,这带来了高昂的计算成本及特征冗余。与传统的 VPT 不同,HoT 先剪枝去除冗余的 Token,再恢复整个序列的 Token(看起来像一个 “沙漏”),使得 Transformer 的中间层中仅保留少量的 Token,从而有效地提升了模型的效率。HoT 还展现了极高的通用性,它不仅可以无缝集成到常规的 VPT 模型中,不论是基于 seq2seq 还是 seq2frame 的 VPT,同时也能够适配各种 Token 剪枝和恢复策略。
在这里插入图片描述

3.2、HoT 框架

提出的 HoT 整体框架如下图所示。为了更有效地执行 Token 的剪枝和恢复,本文提出了 Token 剪枝聚类(Token Pruning Cluster,TPC)和 Token 恢复注意力(Token Recovering Attention,TRA)两个模块。其中,TPC 模块动态地选择少量具有高语义多样性的代表性 Token,同时减轻视频帧的冗余。TRA 模块根据所选的 Token 来恢复详细的时空信息,从而将网络输出扩展到原始的全长时序分辨率,以进行快速推理。
在这里插入图片描述

3.3、Token 剪枝聚类模块

Token 剪枝聚类(Token Pruning Cluster,TPC)模块的核心在于鉴别并去除掉那些在语义上贡献较小的 Token,并聚焦于那些能够为最终的三维人体姿态估计提供关键信息的 Token。通过采用聚类算法,TPC 动态地选择聚类中心作为代表性 Token,借此利用聚类中心的特性来保留原始数据的丰富语义。TPC 的结构如下图所示,它先对输入的 Pose Token 在空间维度上进行池化处理,随后利用池化后 Token 的特征相似性对输入 Token 进行聚类,并选取聚类中心作为代表性 Token。
在这里插入图片描述

3.4、Token 恢复注意力模块

Token 恢复注意力(Token Recovering Attention,TRA)模块,它能够基于选定的 Token 恢复详细的时空信息。通过这种方式,由剪枝操作引起的低时间分辨率得到了有效扩展,达到了原始完整序列的时间分辨率,使得网络能够一次性估计出所有帧的三维人体姿态序列,从而实现 seq2seq 的快速推理。TRA 模块的结构如下图所示,其利用最后一层 Transformer 中的代表性 Token 和初始化为零的可学习 Token,通过一个简单的交叉注意力机制来恢复完整的 Token 序列。
在这里插入图片描述

3.5、模块应用

VPT 架构主要由三个组成部分构成:一个姿态嵌入模块用于编码姿态序列的空间与时间信息,多层 Transformer 用于学习全局时空表征,以及一个回归头模块用于回归输出三维人体姿态结果。根据输出的帧数不同,现有的 VPT 可分为两种推理流程:seq2frame 和 seq2seq。在 seq2seq 流程中,输出是输入视频的所有帧,因此需要恢复原始的全长时序分辨率。如 HoT 框架图所示的,TPC 和 TRA 两个模块都被嵌入到 VPT 中。在 seq2frame 流程中,输出是视频中心帧的三维姿态。因此,在该流程下,TRA 模块是不必要的,只需在 VPT 中集成 TPC 模块即可。其框架如下图所示。
在这里插入图片描述

4、实验

4.1、消融实验

在下表,论文给出了在 seq2seq(*)和 seq2frame(†)推理流程下的对比。结果表明,通过在现有 VPT 上应用所提出的方法,本方法能够在保持模型参数量几乎不变的同时,显著减少 FLOPs,并且大幅提高了 FPS。此外,相比原始模型,所提出的方法在性能上基本持平或者能取得更好的性能。
在这里插入图片描述

4.2、与SOTA对比

当前,在 Human3.6M 数据集上,三维人体姿态估计的领先方法均采用了基于 Transformer 的架构。为了验证本方法的有效性,作者将其应用于三个最新的 VPT 模型:MHForme,MixSTE 和 MotionBERT,并与它们在参数量、FLOPs 和 MPJPE 上进行了比较。如下表所示,本方法在保持原有精度的前提下,显著降低了 SOTA VPT 模型的计算量。这些结果不仅验证了本方法的有效性和高效率,还揭示了现有 VPT 模型中存在着计算冗余,并且这些冗余对最终的估计性能贡献甚小,甚至可能导致性能下降。此外,本方法可以剔除掉这些不必要的计算量,同时达到了高度竞争力甚至更优的性能。
在这里插入图片描述

5、总结

本文针对现有 Video Pose Transforme(VPT)计算成本高的问题,提出了沙漏 Tokenizer(Hourglass Tokenizer,HoT),这是一种即插即用的 Token 剪枝和恢复框架,用于从视频中高效地进行基于 Transformer 的 3D 人体姿势估计。研究发现,在 VPT 中维持全长姿态序列是不必要的,使用少量代表性帧的 Pose Token 即可同时实现高精度和高效率。大量实验验证了本方法的高度兼容性和广泛适用性。它可以轻松集成至各种常见的 VPT 模型中,不论是基于 seq2seq 还是 seq2frame 的 VPT,并且能够有效地适应多种 Token 剪枝与恢复策略,展示出其巨大潜力。作者期望 HoT 能够推动开发更强、更快的 VPT。

简单Transformer的实现

# 定义多头注意力机制模块  
class MultiHeadAttention(nn.Module):  def __init__(self, d_model, num_heads):  super(MultiHeadAttention, self).__init__() # 调用父类(nn.Module)的构造函数  self.num_heads = num_heads  # 设置多头注意力的头数  self.d_model = d_model  # 输入特征的维度  # 确保d_model可以被num_heads整除  assert d_model % self.num_heads == 0  # 计算每个头的维度  self.depth = d_model // self.num_heads  # 定义线性变换层,用于计算查询、键和值的表示  self.wq = nn.Linear(d_model, d_model)  self.wk = nn.Linear(d_model, d_model)  self.wv = nn.Linear(d_model, d_model)  # 定义线性变换层,用于最后的输出变换  self.dense = nn.Linear(d_model, d_model)  # 将输入张量分割成多个头  def split_heads(self, x, batch_size):  # 重塑张量以准备分割  x = x.reshape(batch_size, -1, self.num_heads, self.depth)  # 置换张量的维度,以便后续的矩阵乘法  return x.permute(0, 2, 1, 3)  # 前向传播函数  def forward(self, v, k, q, mask):  batch_size = q.shape[0]  # 获取批次大小  # 通过线性变换层计算查询、键和值的表示  q = self.wq(q)  # 查询(batch_size, seq_len, d_model)  k = self.wk(k)  # 键(batch_size, seq_len, d_model)  v = self.wv(v)  # 值(batch_size, seq_len, d_model)  # 将查询、键和值分割成多个头  q = self.split_heads(q, batch_size)  # (batch_size, num_heads, seq_len_q, depth)  k = self.split_heads(k, batch_size)  # (batch_size, num_heads, seq_len_k, depth)  v = self.split_heads(v, batch_size)  # (batch_size, num_heads, seq_len_v, depth)  # 计算缩放点积注意力  scaled_attention, attention_weights = self.scaled_dot_product_attention(q, k, v, mask)  # 将注意力输出的维度重新排列并合并回原始维度  scaled_attention = scaled_attention.permute(0, 2, 1, 3).contiguous()  new_context_layer_shape = scaled_attention.shape[:-2] + (self.d_model,)  scaled_attention = scaled_attention.reshape(new_context_layer_shape)  # 通过线性变换层得到最终的输出  output = self.dense(scaled_attention)  return output, attention_weights  # 计算缩放点积注意力  def scaled_dot_product_attention(self, q, k, v, mask):  # 计算查询和键的点积  matmul_qk = torch.matmul(q, k.transpose(-2, -1))  # (batch_size, num_heads, seq_len_q, seq_len_k)  dk = torch.tensor(self.depth, dtype=torch.float32).to(q.device)  # 获取每个头的维度  # 缩放点积注意力分数  scaled_attention_logits = matmul_qk / dk  # 如果提供了掩码,则将其应用于注意力分数  if mask is not None:  scaled_attention_logits += (mask * -1e9)  # 将掩码位置的值设置为一个非常小的负数  # 应用softmax函数得到注意力权重  attention_weights = F.softmax(scaled_attention_logits, dim=-1)  # (batch_size, num_heads

总结

本周主要阅读了CVPR文章,Hourglass Tokenizer for Effcient Transformer-Based 3D Human Pose Estimation。这是一种即插即用的 Token 剪枝和恢复框架,用于从视频中高效地进行基于 Transformer 的 3D 人体姿势估计。大量实验验证了本方法的高度兼容性和广泛适用性。它可以轻松集成至各种常见的 VPT 模型中,不论是基于 seq2seq 还是 seq2frame 的 VPT,并且能够有效地适应多种 Token 剪枝与恢复策略,展示出其巨大潜力。除此之外,还学习学习了简单的Transformer代码的学习。

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

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

相关文章

SQL语句的编写

##创建用户-建表建库 #创建一个用户名为 feng,允许从任何主机 % 连接,并使用密码 sc123456 进行身份验证的用户。 rootTENNIS 16:33 scmysql>create user feng% identified by sc123456; Query OK, 0 rows affected (0.04 sec) #创建一个名为fen…

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年,35M带宽

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年,35M带宽,配置为:16C64G-450G SSD系统盘-35M带宽-8000G月流量 华北-北京,京东云活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图: 京东云16核64G云服务器…

215 基于matlab的快速跟踪算法

基于matlab的快速跟踪算法,提出一种简单又快速、 鲁棒性的算法,基于贝叶斯框架下,该模型 (即图像强度和从目标位置) 的低级功能及周边地区的统计相关性的时空关系。跟踪问题是通过计算信心地图,并将以最大限…

springboot国际化多语言

1,新建国际化多语言文件 在resources目录下新建 messages.properties 其他语言的文件 编辑messages.properties文件,下方从text切换到Resource Bundle ,即可对照着编辑多语言文件 (如果没有找到Resource Bundle,先在settings->plugins中安装Resource Bundle Editor) 2,配…

Lanelets_ 高效的自动驾驶地图表达方式

Lanelets: 高效的自动驾驶地图表达方式 附赠自动驾驶学习资料和量产经验:链接 LaneLets是自动驾驶领域高精度地图的一种高效表达方式,它以彼此相互连接的LaneLets来描述自动驾驶可行驶区域,不仅可以表达车道几何,也可以完整表述车…

Django之五种中间件定义类型—process_request、process_view、process_response.......

目录 1. 前言 2. 基础中间件 3. 如何自定义中间件 4. 五种自定义中间件类型 4.1 process_request 4.2 process_view 4.3 process_response 4.4 process_exception 4.5 process_template_response 5. 最后 1. 前言 哈喽,大家好,我是小K,今天咋们…

数据可视化-地图可视化-Python

师从黑马程序员 基础地图使用 基础地图演示 视觉映射器 具体颜色对应的代码可以在http://www.ab173.com/中查询RGB颜色查询对照表 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts#准备地图对象 mapMap() #准备数据 data[("北京",…

Flutter开发进阶之错误信息

Flutter开发进阶之错误信息 在Flutter开发中错误信息通常是由Exception和Error表示,Error表示严重且不可恢复的错误,一般会导致程序直接终止,而Exception可以被显式抛出,一般为代码逻辑错误,根据Flutter的解释说Excep…

Golang开发2D小游戏全套教程(已完结)

Golang开发2D小游戏全套教程(已完结) 本套教程将基于ebiten库开发一套2D小游戏。 全套代码:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/game_demo ebiten官网地址:https://github.com/hajimehoshi/ebiten …

单调栈(LeetCode-下一个更大元素)

每日一题 今天刷到了一道用到单调栈来解决的题目,想到自己没有总结过单调栈的知识点,因此想总结一下。 介绍 什么是单调栈? 单调栈的定义其实很简单,所谓单调栈就是指一个单调递增或是单调递减的栈。 那单调栈有什么用呢&#x…

在单交换机局域网中,不同网段的主机通信探秘

在理解局域网中不同网段主机之间的通信之前,我们首先要明白网络的基本组成和工作原理。局域网(LAN)是一个封闭的网络环境,通常由交换机(Switch)作为核心设备连接网络中的各个主机。当我们谈论不同网段的主机…

基于Socket简单的TCP网络程序

⭐小白苦学IT的博客主页 ⭐初学者必看:Linux操作系统入门 ⭐代码仓库:Linux代码仓库 ❤关注我一起讨论和学习Linux系统 TCP单例模式的多线程版本的英汉互译服务器 我们先来认识一下与udp服务器实现的不同的接口: TCP服务器端 socket()&…