siMLPe:Human Motion Prediction
Back to MLP: A Simple Baseline for Human Motion Prediction解析
- 摘要
- 1. 简介
- 2. Related Work
- 2.1 基于RNN的人体运动预测
- 2.2 基于GCN的人体运动预测
- 2.3 基于 Attention 的人类运动预测
- 2.4 总结
- 3. siMLPe
- 3.1 离散余弦变换(Discrete Cosine Transform (DCT))
- 3.2 网络架构
- 3.3 Losses
- 目标函数
- 4. 实验
- 4.1 数据集
- 4.2 评价指标
论文地址:Back to MLP: A Simple Baseline for Human Motion Prediction
论文代码:https://github.com/dulucas/simlpe
论文出处:IEEE/CVF Winter Conference on Applications of Computer Vision (WACV),2023
论文单位:Grenoble INP,France
摘要
- 本文解决了人体运动预测的问题,包括从历史上观察到的序列预测未来的身体姿势。
- 然而,最先进的方法提供了良好的结果,它们依赖于任意复杂性的深度学习架构,例如RNN,Transformers或GCN,通常需要多个训练阶段和超过200万个参数。
- 在本文中,我们表明,结合一系列标准实践,如应用离散余弦变换(DCT),预测关节的残余位移和优化速度作为辅助损失,基于多层感知器(mlp)的轻量级网络只有14万个参数可以超越最先进的性能。
- 对Human3.6M、AMASS和3DPW数据集进行了验证,显示了我们的方法(siMLPe)始终优于所有其他方法。
- 我们希望我们的简单方法可以为社区提供一个强有力的基线,并允许重新思考人体运动预测问题。
1. 简介
- 给定一个三维人体姿态序列,人体运动预测任务的目的是预测姿态序列的后续动作。
- 预测未来人体运动是许多应用的核心,包括自动驾驶中的事故预防、跟踪人或人机交互。
- 由于人体运动的时空性质,文献中常见的趋势是设计能够融合时空信息的模型。
- 传统方法主要依赖于隐马尔可夫模型或高斯过程潜变量模型。
- 然而,虽然这些方法在简单和周期性运动模式下表现良好,但在复杂运动下却明显失败。
- 近年来,随着深度学习的成功,基于不同类型的神经网络开发了各种能够处理序列数据的方法。
- 例如,一些工作使用 RNN 来建模人体运动,一些工作基于 GCN,一些工作基于Transformers,融合跨越人体关节和时间的运动序列的时空信息。
- 然而,这些新方法的体系结构通常并不简单,其中一些方法需要额外的先验,这使得它们的网络难以分析和修改。
- 因此,一个问题自然出现了:“我们可以用一个简单的网络来解决人类运动预测问题吗?”
- 为了回答这个问题,我们首先尝试了一个简单的解决方案,即重复最后一个输入姿势并将其用作输出预测。 如图1所示,这种朴素的解决方案已经可以获得合理的结果,这意味着最后一个输入姿势与未来的姿势“接近” (Repeating Last-Frame)。

- 受此启发,我们进一步只训练一个全连接层来预测未来姿势和最后一个输入姿势之间的残差,并获得更好的性能,这显示了建立在像全连接层这样的基础层上的简单网络用于人体运动预测的潜力 (One-FC)。
- 基于上述观察,我们回到多层感知器(MLPs),并构建一个简单而有效的网络,称为siMLPe,只有三个组成部分: fully connected layers, layer normalization, and transpose operations. 网络体系结构如图2所示。

- 值得注意的是,我们发现即使是常用的激活层(如ReLU)也不需要,这使得我们的网络除了层归一化之外完全是线性模型。
- 尽管简单,但当与三个简单的做法适当结合时,siMLPe可以实现强大的性能。这三个简单的做法分别为:应用离散余弦变换(DCT),预测关节的残余位移,优化速度作为辅助损失。
- SIMLPE在几个标准数据集上产生了SOAT性能,包括Human3.6M,AMASS,和3DPW。
- 同时,siMLPe是轻量级的,需要的参数比以前最先进的方法少20到60倍。
- SIMLPE和以前的方法的比较可以在图1显示了不同网络在Human3.6M上1000 ms时的平均每个关节位置误差(MPJPE)与网络复杂性的关系。siMLPe以高效率达到最佳性能。
- 综上所述,我们的贡献如下:
(1)我们表明,人类运动预测可以以一种简单的方式建模,而无需明确融合空间和时间信息。作为一个极端的例子,单个全连接层已经可以达到合理的性能。
(2)我们提出siMLPe,一个简单而有效的人体运动预测网络,只有三个组成部分: 全连接层、层归一化和转置操作,在多个基准测试(如Human3.6M,AMASS和3DPW数据集)上,以远少于现有方法的参数实现了最先进的性能。
2. Related Work
- 人体运动预测是一种序列到序列的任务,将过去观察到的运动作为预测未来运动序列的输入。
- 传统的运动预测方法都是非线性的,如马尔可夫模型、高斯过程动力学模型,和受限玻尔兹曼机。
- 这些方法已被证明可以有效地预测简单的运动,但最终难以预测复杂和长期的运动。
- 随着深度学习时代的到来,使用深度网络进行人体运动预测取得了巨大的成功,其中包括递归神经网络(Recurrent Neural networks, RNN),图卷积网络(Graph Convolutional networks, GCNs)和Transformers,这是本节的主要重点。
2.1 基于RNN的人体运动预测
- 由于人体运动固有的顺序结构,一些工作解决了三维人体运动预测的循环模型。
- 然而,该类方法受到RNN的多重固有限制。
- 首先,RNN作为一个序列模型,在训练和推理过程中很难并行化。
- 其次,内存约束阻止RNN从更远的帧探索信息。
- 一些研究通过使用RNN变体、滑动窗口、卷积模型或对抗性训练来缓解这一问题。但是它们的网络仍然是复杂的,并且有大量的参数。
2.2 基于GCN的人体运动预测
- 为了更好地编码人体关节的空间连通性,最近的工作通常是构建人体姿态为图(graph),采用图卷积网络(graph Convolutional Networks, GCNs)进行人体运动预测。
2.3 基于 Attention 的人类运动预测
- 随着transformers的发展,一些作品试图用 Attention 机制来处理这一任务。
2.4 总结
- 综上所述,随着近年来人体运动预测的发展,基于RNN/GCN/Transformer 的结构得到了很好的探索,结果得到了显著改善。
- 虽然这些方法提供了良好的效果,但它们的架构变得越来越复杂和难以训练。
- 在本文中,我们坚持简单的架构,并提出了一个基于MLP的网络。
- 我们希望我们的简单方法可以作为一个baseline,让社区重新思考人体运动预测的问题。
3. siMLPe
- 在本节中,我们将阐述问题,并在3.1节中给出DCT变换的公式,在3.2节中给出网络架构的细节,在3.3节中给出我们用于训练的损失。
- 给定过去的3D人体姿势序列,我们的目标是预测未来的姿势序列。
- 我们将观察到的三维人体姿势表示为 x_1:T ∈ RT×C,由 T 个连续的人体姿势组成,其中第 t 帧 x_t 处的姿势用 C 维向量表示,即:x_t∈ RC。
- 在本工作中,与之前的工作相似,x_t 为第 t 帧节点的三维坐标,C = 3 × K,其中 K 为节点个数。
- 我们的任务是预测未来 N 个运动帧: x_T +1:T +N ∈RN×C。
3.1 离散余弦变换(Discrete Cosine Transform (DCT))
- 我们采用DCT变换对时间信息进行编码。
- 更精确地说,给定 T 帧的输入运动序列,DCT矩阵 D∈RT×T可以计算为:

其中δ_i,j表示Kronecker函数, δ_i,j 为:

- 离散余弦变换后的输入是:D(x_1:T) = Dx_1:T。
- 我们应用**反向离散余弦变换(IDCT)**将网络的输出转换回原始姿态表示,表示为D-1和D的逆。
3.2 网络架构
- 图2显示了我们网络的体系结构。我们的网络只包含三个组成部分: 全连接层、转置操作、层归一化。
- 对于所有的全连通层,它们的输入维数等于输出维数。
- 形式上,给定一个三维人体姿势的输入序列 x_1:T ∈RT×C,我们的网络预测一个未来的姿势序列x_T+1:T+N ∈ RN×C:

F 表示我们的网络。 - DCT变换后,我们应用一个全连接层,只对变换后的运动序列 D(x_1:T)∈RT×C的空间维度进行操作:

其中z0∈RT×C为全连通层的输出。W0∈RC×C, b0∈RC表示全连通层的可学习参数。 - 在实践中,这相当于对一个全连接层应用转置操作,然后将输出特征转置回去,如图2所示。
- 然后,引入一系列 m 块,仅在时间维度上操作,即仅跨帧合并信息。
- 每个块由一个全连接层组成,然后进行层规范化,表示为:

式中,zi∈RT×C, i∈[1,…, m] 表示第 i 个MLP块的输出。
LN表示层归一化操作。
Wi∈RT×T和 bi∈RT是第 i 个MLP块中全连通层的可学习参数。 - 最后,与第一个全连接层类似,我们在MLP块之后再添加一个全连接层,只对特征的空间维度进行操作,然后应用IDCT变换得到预测结果:

其中W_m+1和 b_m+1是最后一个全连接层的可学习参数。 - 注意长度 T 和 N 不需要相等。当T > N时,我们只取预测的N个前帧,在T < N的情况下,我们可以通过重复最后一帧将输入序列填充到N。
3.3 Losses
- 正如第1节中提到的,如图1所示,最后一个输入姿势与未来的姿势 “接近”。
- 通过这种观察,我们让网络预测未来姿态 x_T+t 和最后输入姿态 x_T 之间的残差,而不是从头开始预测绝对3D姿态。 这简化了学习并提高了性能。
目标函数
- 我们的目标函数 L 包括两项 Lre 和 Lv:

- Lre的目标是最小化预测运动 x_T+1:T+N 和真实运动x_T+1:T+N 之间的 L2 范数:

- Lv 的目的是最小化预测运动速度 v_T+1:T+N 与地面真实速度 vT+1:T+N之间的 L2 范数:

式中 v_T+1:T+N ∈RN×C, v_T表示第 t 帧的速度,用时间差计算: v_T = x_t+1−x_t。
4. 实验
4.1 数据集
- Human3.6M:
Human3.6M包含7个演员表演15个动作,每个姿势标记32个关节。
我们遵循测试协议,使用S5作为测试集,S11作为验证集,其他作为训练集。
以前的工作使用了不同的测试采样策略,包括每个动作8个样本,每个动作256个样本或测试集中的所有样本。
由于8个样本太少,取所有的测试样本无法平衡不同序列长度的不同动作,因此我们每个动作取256个样本进行测试,并在22个关节上进行评估。 - AMASS:
AMASS是多个动作捕捉数据集的集合,使用统一的SMPL参数化。
我们使用AMASS- bmlrub作为测试集,并将AMASS数据集的其余部分分成训练集和验证集。
模型在18个关节上进行了验证。 - 3DPW:
3DPW是一个包含室内和室外场景的数据集。
一个姿势由26个关节表示,我们使用在AMASS上训练的模型评估18个关节来评估泛化。
4.2 评价指标
- 本文使用三维关节坐标上的平均关节位置误差(Mean Per Joint Position Error,MPJPE)作为评价指标。这是评估3D姿态误差最广泛使用的指标。
- 该度量计算预测和真实之间不同节点的平均L2 -范数。
- 与之前的工作相似,我们忽略了姿态的全局旋转和平移,保持采样率为 25 FPS 的所有数据集。
相关文章:
siMLPe:Human Motion Prediction
Back to MLP: A Simple Baseline for Human Motion Prediction解析 摘要1. 简介2. Related Work2.1 基于RNN的人体运动预测2.2 基于GCN的人体运动预测2.3 基于 Attention 的人类运动预测2.4 总结 3. siMLPe3.1 离散余弦变换(Discrete Cosine Transform (DCT)&#x…...
详解——JS map()方法
JavaScript是一种广泛使用的编程语言,用于开发Web应用程序。它具有许多内置函数和方法,其中之一是map()方法。map()方法是一个非常有用的函数,它允许我们在数组中的每个元素上执行相同的操作,并返回一个新的数组。 map()方法的语…...
leetcode做题笔记57
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。 思路一:模拟题意 int pushbackInterval(int…...
SAP Fiori 将GUI中的自开发报表添加到Fiori 工作台
1. 首先我们在workbench 中开发一个GUI report 这里我们开发的是一个简单的物料清单报表 2. 分配一个事务代码。 注意这里的SAP GUI for HTML 要打上勾 3. 创建语义对象( Create Semantic Object) 事物代码: path: SAP NetWeaver ->…...
【Docker】配置指定大小的磁盘空间
背景 测试磁盘满时程序的运行情况 问题 如何使用 docker 来模拟磁盘满的情况 解决方法 创建指定大小的数据卷 volumedocker volume create --driver local --opt typetmpfs --opt devicetmpfs --opt osize50M my_volumn创建 docker 时,使用该数据卷docker run …...
使用Spring五大注解来更加简单的存储Bean对象
在使用Spring框架的时候我们如果使用这种方式来存储bean对象的话未免有点太麻烦了 <bean id"xxx" class"xxx"> </bean> 为了简化存储Bean对象的操作,我们可以使用五大类注解来进行存储Bean对象 我们首先要在配置文件配置扫描路径…...
Netty面试题1
计算机网络模型 OSI采用了分层的结构化技术,共分七层, 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 。 Open System Interconnect 简称OSI,是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参…...
水质分析积分球定义和原理
随着社会经济的快速发展,人们对水质的要求不断提升,特别是生活饮用水,检测项目渐趋完善。在工业化大发展的前提下,水资源正遭受着严重的污染,因此确保水质安全,定期开展对饮用水的检测工作已迫在眉睫。环境…...
自然语言处理从入门到应用——LangChain:记忆(Memory)-[基础知识]
分类目录:《自然语言处理从入门到应用》总目录 默认情况下,链(Chains)和代理(Agents)是无状态的,这意味着它们将每个传入的查询视为独立的(底层的LLM和聊天模型也是如此)…...
phpstorm添加vue 标签属性绑定提示和提示vue的方法提示
v-text v-html v-once v-if v-show v-else v-for v-on v-bind v-model v-ref v-el v-pre v-cloak v-on:click v-on:keyup.enter v-on:keyup click change input number debounce transition :is :class把上面这些文字粘贴到点击右下角放大按钮 后的文本框里,然后保存…...
从计算到人类知识:ChatGPT与智能演化
引 言 智能是自然界演化出来的结果,而人工智能则是人类创造的产物。随着人工智能的不断进步,尤其是近期ChatGPT的开放,我们发现人工智能的智能水平似乎已经达到了非常高的水平。然而,对于自然界中生物来说很简单的行为࿰…...
Leetcode每日一题:2681. 英雄的力量(2023.8.1 C++)
目录 2681. 英雄的力量 题目描述: 实现代码与解析: 数学规律 原理思路: 2681. 英雄的力量 题目描述: 给你一个下标从 0 开始的整数数组 nums ,它表示英雄的能力值。如果我们选出一部分英雄,这组英雄的…...
【学习】若依源码(前后端分离版)之 “ 异常处理”
大型纪录片:学习若依源码(前后端分离版)之 “ 异常处理” 前言1、统一返回实体定义2、定义登录异常定义3、基于ControllerAdvice注解的Controller层的全局异常统一处理4、测试访问请求结语 前言 通常一个web框架中,有大量需要处理…...
天花板级,Python接口自动化测试-接口关联封装调用(实例)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 流程相关的接口&a…...
yolov5代码解读之yolo.py【网络结构】
这个文件阿对于做模型修改、模型创新有很好大好处。 首先加载一些python库和模块: 如果要执行这段代码,直接在终端输入python yolo.py. yolov5的模型定义和网络搭建都用到了model这个类(也就是以下图片展示的东西):(以前代码没…...
Docker之jenkins部署harbor在harbor中完成部署
Docker之jenkins部署harbor在harbor中完成部署 1、harbor作用 Harbor允许用户用命令行工具对容器镜像及其他Artifact进行推送和拉取,并提供了图形管理界面帮助用户查阅和删除这些Artifact。在Harbor 2.0版本中,除容器镜像外,Harbor对符合OCI…...
安装Jenkins
一、什么是Jenkins Jenkins是一个开源软件项目,是基于Java开发的。我们可以利用Jenkins来实现持续集成的功能。 因为Jenkins是基于Java开发的,所以在安装Jenkins之前首先需要安装Java的JDK。 二、安装Jenkins 在Windows平台上面安装Jenkins共有两种方式…...
大运空瓶行动,绘就生态文明画卷
随着成都第31届世界大学生夏季运动会赛事的成功举办,为了倡导节约水资源、绿色大运,在此之前成都电视2台《城视民生》栏目面向全市发起“大运空瓶行动”的倡议,呼吁市民杜绝水资源浪费,喝完瓶中水,并鼓励市民积极参与到…...
tomcat7.exe 启动闪退解决
标题tomcat7.exe 启动闪退解决 双击tomcat7.exe启动,但是出现闪退问题,无法启动tomcat 解决: 1.解决 tomcat7.exe 启动闪退解决 第一步:双击打开tomcat7w.exe 文件 如果出现 “指定的服务未安装。 Unable to open the service ‘…...
java修改jar包中的配置文件
方法一 !!!除了以上的方式,其实也可以通过 vim 命令直接修改 jar 包配置文件的内容,然后直接保存即可,不过这种方法必须保证服务器上已经安装了 zip 和 unzip 命令。 方法二 首先需要找出你的配置文件在…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...
