MP : Human Motion 人体运动的MLP方法

news/2024/5/10 15:06:06

Back to MLP: A Simple Baseline for Human Motion Prediction

conda install -c conda-forge easydict

简介

papercode
https://arxiv.org/abs/2207.01567v2https://github.com/dulucas/siMLPe

在这里插入图片描述

       Back to MLP是一个仅使用MLP的新baseline,效果SOTA。本文解决了人类运动预测的问题,包括从历史观测的序列中预测未来的身体姿势。本文表明,结合离散余弦变换(DCT)、预测关节残余位移、优化速度作为辅助损失等一系列标准实践,基于多层感知器(MLP)且参数仅为14万的轻量级网络可以超越最先进的性能。对Human3.6M(注:这个数据集实际大小是100多M),AMASS和3DPW数据集的详尽评估表明,我们名为siMLPe的方法始终优于所有其他方法。我们希望我们的简单方法可以作为社区的强大基线,并允许重新思考人类运动预测问题。

  • 训练时引入Ground Truth,获得其隐藏表示作为中间目标指导姿态预测?

有关模型

  • 函数入口为 **/myproject/siMLPe/exps/baseline_h36m/train.py

DCT & IDCT

  • dct_m,idct_m = get_dct_matrix(config.motion.h36m_input_length_dct)
  • N=50,即参数config.motion.h36m_input_length_dct=50,在**/myproject/siMLPe/exps/baseline_h36m/config.py的51行C.motion.h36m_input_length_dct = 50

在这里插入图片描述

模型的设置

  • 以main中的两句话为入口,模型的设置只需要
model = Model(config)# from model import siMLPe as Model
model.train()
{'seed': 304, 'abs_dir': '/home/fly100/myproject/siMLPe/exps/baseline_h36m', 'this_dir': 'baseline_h36m', 'repo_name': 'siMLPe', 'root_dir': '/home/fly100/myproject/siMLPe', 'log_dir': '/home/fly100/myproject/siMLPe/exps/baseline_h36m/log', 'snapshot_dir': '/home/fly100/myproject/siMLPe/exps/baseline_h36m/log/snapshot', 'log_file': '/home/fly100/myproject/siMLPe/exps/baseline_h36m/log/log_2022_10_18_20_47_09.log', 'link_log_file': '/home/fly100/myproject/siMLPe/exps/baseline_h36m/log/log_last.log', 'val_log_file': '/home/fly100/myproject/siMLPe/exps/baseline_h36m/log/val_2022_10_18_20_47_09.log', 'link_val_log_file': '/home/fly100/myproject/siMLPe/exps/baseline_h36m/log/val_last.log', 'h36m_anno_dir': '/home/fly100/myproject/siMLPe/data/h36m/', 'motion': {'h36m_input_length': 50, 'h36m_input_length_dct': 50, 'h36m_target_length_train': 10, 'h36m_target_length_eval': 25, 'dim': 66}, 'data_aug': True, 'deriv_input': True, 'deriv_output': True, 'use_relative_loss': True, 'pre_dct': False, 'post_dct': False, 'motion_mlp': {'hidden_dim': 66, 'seq_len': 50, 'num_layers': 64, 'with_normalization': False, 'spatial_fc_only': False, 'norm_axis': 'spatial'}, 'motion_fc_in': {'in_features': 66, 'out_features': 66, 'with_norm': False, 'activation': 'relu', 'init_w_trunc_normal': False, 'temporal_fc': False}, 'motion_fc_out': {'in_features': 66, 'out_features': 66, 'with_norm': False, 'activation': 'relu', 'init_w_trunc_normal': True, 'temporal_fc': False}, 'batch_size': 256, 'num_workers': 8, 'cos_lr_max': 1e-05, 'cos_lr_min': 5e-08, 'cos_lr_total_iters': 40000, 'weight_decay': 0.0001, 'model_pth': None, 'shift_step': 1, 'print_every': 100, 'save_every': 5000}

siMLPe初始化

class siMLPe(nn.Module):def __init__(self, config):self.config = copy.deepcopy(config)super(siMLPe, self).__init__()self.motion_mlp = build_mlps(self.config.motion_mlp)# 堆叠多层的MLPself.motion_fc_in = nn.Linear(self.config.motion.dim, self.config.motion.dim)# 66->66self.motion_fc_out = nn.Linear(self.config.motion.dim, self.config.motion.dim)# 66->66self.reset_parameters()# 权重->xavier,偏置->0self.config.motion_mlp.seq_len # 50self.arr0 = Rearrange('b n d -> b d n')self.arr1 = Rearrange('b d n -> b n d')
堆叠多层的MLP
class TransMLP(nn.Module):def __init__(self, dim, seq, use_norm, use_spatial_fc, num_layers, layernorm_axis):super().__init__()self.mlps = nn.Sequential(*[MLPblock(dim, seq, use_norm, use_spatial_fc, layernorm_axis)for i in range(num_layers)])def forward(self, x):x = self.mlps(x)return x

在这里插入图片描述
在这里插入图片描述

其中的Temporal_FC或Spatial_FC

class Temporal_FC(nn.Module):def __init__(self, dim):super(Temporal_FC, self).__init__()self.fc = nn.Linear(dim, dim)# 类似序列长度到序列长度的,下边的Spatial_FC是转置了的def forward(self, x):x = self.fc(x)return x
class Spatial_FC(nn.Module):def __init__(self, dim):super(Spatial_FC, self).__init__()self.fc = nn.Linear(dim, dim)self.arr0 = Rearrange('b n d -> b d n')self.arr1 = Rearrange('b d n -> b n d')def forward(self, x):x = self.arr0(x)x = self.fc(x)x = self.arr1(x)return x

作者自己实现了LN

在这里插入图片描述
在这里插入图片描述

然后就是传播过程了

    def forward(self, x):x_ = self.fc0(x)x_ = self.norm0(x_)x = x + x_return x

模型的训练

在这里插入图片描述

siMLPe((arr0): Rearrange('b n d -> b d n')(arr1): Rearrange('b d n -> b n d')(motion_mlp): TransMLP((mlps): Sequential((0): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(1): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(2): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(3): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(4): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(5): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(6): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(7): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(8): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(9): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(10): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(11): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(12): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(13): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(14): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(15): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(16): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(17): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(18): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(19): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(20): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(21): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(22): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(23): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(24): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(25): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(26): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(27): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(28): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(29): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(30): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(31): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(32): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(33): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(34): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(35): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(36): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(37): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(38): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(39): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(40): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(41): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(42): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(43): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(44): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(45): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(46): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(47): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(48): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(49): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(50): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(51): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(52): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(53): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(54): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(55): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(56): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(57): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(58): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(59): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(60): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(61): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(62): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())(63): MLPblock((fc0): Temporal_FC((fc): Linear(in_features=50, out_features=50, bias=True))(norm0): Identity())))(motion_fc_in): Linear(in_features=66, out_features=66, bias=True)(motion_fc_out): Linear(in_features=66, out_features=66, bias=True)
)

代码

环境准备

conda create -n simpmlp python=3.8
conda activate simpmlp
conda install pytorch==1.9.0 torchvision==0.10.0 torchaudio==0.9.0 cpuonly -c pytorch
- PyTorch >= 1.5
- Numpy
- CUDA >= 10.1
- Easydict  conda install -c conda-forge easydict 
- pickle   安装python后已包含pickle库,不需要单独再安装
- einops 
- pip install 
- six
- pip install tb-nightly https://blog.csdn.net/weixin_47166887/article/details/121384701
-                        https://blog.csdn.net/weixin_46133643/article/details/125344874

数据准备

  • 解压数据
(base) ┌──(fly100㉿kali)-[~/myproject/siMLPe-main/data]
└─$ unzip h3.6m\ \(1\).zip

在这里插入图片描述

  • 将文件夹名称3.6 改为36

在这里插入图片描述
在这里插入图片描述- 将文件移到外边

在这里插入图片描述

  • 原因在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述

#  H3.6M
cd exps/baseline_h36m/
sh run.sh

在这里插入图片描述

# Baseline 48
CUBLAS_WORKSPACE_CONFIG=:4096:8 python train.py --seed 888 --exp-name baseline.txt --layer-norm-axis spatial --with-normalization --num 48

人类有没有可能是被设计出来的?为什么视网膜贴反了?

细节

数据

  • 在读取数据时的数据增强(50%的几率倒序)
    在这里插入图片描述
  • 在获取数据时一次性获取连续的60个动作数据(60,66),前50个作为input,后10个作为target,一个66纬度的数据例子:

在这里插入图片描述

训练

  • 要训练40000个epoch???
    在这里插入图片描述
    在这里插入图片描述

http://wed.xjx100/news/301233.html

相关文章

通过构造方法使属性初始化

1 问题 如何使属性初始化。 2 方法 在Student类中定义两个构造方法publicStudent(String name)和public Student(String name,int score)。在使用new运算符创建对象,由于实际参数是一个String类型的数据"林冲",因此在实例化时会调用有一个Stri…

使用CloudOS帮助企业落地云原生PaaS平台

PaaS究竟是什么? IaaS、SaaS的定义很清楚,而PaaS的定义就比较宽泛。所以,很多人把PaaS当做一个万能的“框”,什么都往里装,特别像一排垃圾桶中的那个“其他垃圾”桶,当你拎了一袋垃圾,不知道往…

Vue中如何进行颜色选择与调色板

Vue中如何进行颜色选择与调色板 颜色选择和调色板是Web开发中常用的功能,它们可以帮助用户选择或调整颜色。Vue作为一个流行的JavaScript框架,提供了一些工具和库,可以方便地实现颜色选择和调色板功能。本文将介绍如何在Vue中进行颜色选择和…

5.3.2 因特网的路由协议(二)基于距离向量算法的RIP协议

5.3.2 因特网的路由协议(二)基于距离向量算法的RIP协议 一、RIP协议概念 RIP是Routing Information Protocol缩写,又称为路由信息协议,是最先得到应用的内部网关协议,RIP作为一个常在小型互联网中使用的路由信息协议…

C++11学习笔记(3)——通用工具(上)(包含重要特性智能指针Smart pointer)

1.Pair 在C11中&#xff0c;std::pair是一个模板类&#xff0c;用于将两个值组合成一个单元。它可以将两个不同的类型的值配对在一起&#xff0c;并且提供了对这对值的访问和操作。 std::pair的定义 template<class T1, class T2> struct pair{T1 first;T2 second; };…

基于DDD实现的用户注册流程,很优雅!

欢迎回来&#xff0c;我是飘渺。今天继续更新DDD&微服务的系列文章。 在前面的文章中&#xff0c;我们深入探讨了DDD的核心概念。我理解&#xff0c;对于初次接触这些概念的你来说&#xff0c;可能难以一次性完全记住。但别担心&#xff0c;学习DDD并不仅仅是理论的理解&am…

工商业储能解读

工商业储能解读 0、前言1、2022-2023年工商业储能相关利好政策1.1 2022年1月4日1.2 2022年1月18日1.3 2022年2月10日1.4 2022年3月21日1.5 2022年3月22日1.6 2022年3月29日1.7 2022年4月2日1.8 2022年4月13日1.9 2022年4月25日1.10 2022年5月25日1.11 2022年5月30日1.12 2022年…

如何使用ArcGIS制作SketchUp格式三维建筑

GIS数据也可以和传统的三维建模软件进行结合&#xff0c;在很长一段时间内&#xff0c;一直有客户问如何将水经微图中下载的建筑数据转换为SketchUp模型&#xff0c;这里给大家找到了一种解决方案&#xff0c;可以通过插件进行转换&#xff0c;希望能够对你有所帮助。 加载插件…