HumanML3D; motion-latent-diffusion; DeepPhase 代码介绍

文章详细探讨了DeepPhase项目中关于人体和四足动物运动捕捉数据的处理,包括骨骼旋转、速度计算、逆动力学(IK)算法以及训练特征。重点分析了如何从局部速度计算到全局运动,并介绍了Unity中数据提取和Blender渲染的部分。此外,还涉及了GNN网络的数据制作过程和IK算法的核心实现。

其实仔细看一些代码也是非常有收获的。
DeepPhase 那里基本上跟踪到了输入,输出,和测试时的后处理过程

HumanML3D

目前的疑惑点在系数的全局旋转,是在是搞不清楚。问了问题果然是区别对待的就是为了face Z+ 。存储的global 这个应该是个逆。 然后后面的速度,应该也是局部的速度

raw_pose_processing.py
amass_to_pose: 这个函数主要就是把系数转成了3D关键点,并且对于关键点做一个绕着x轴顺时针90度的旋转
生成文件带有M的,是做了动作的镜像。

motion_representation.py
uniform_skeleton: 这个函数主要就是对齐骨骼,tgt 这个是随便从数据集里面找到一个然后把所有的初始位置都对齐到这里。

# 对齐缩放,也就是平移
scale_rt = tgt_leg_len / src_leg_len
# print(scale_rt)
src_root_pos = positions[:, 0]
tgt_root_pos = src_root_pos * scale_rt
# 之后就是求系数,重新求出 joints

skeleton.py 这个里面是重点
get_offsets_joints: 这个就其实定义了骨架的结构,即偏离父节点的长度和方向(一般都是横平竖直的),前向的时候就是用这个旋转。 (骨骼就是按照横平竖直那样子标准坐标系定义的)
inverse_kinematics_np:
一、这里面先计算人体的朝向,
1)先通过肩膀和胯下,计算向量,这两个向量是直接相加,作为身体’水平方向’
2)竖直方向用 [0,1,0], 叉积算出朝前的方向 forward
【疑问】对于躺下的动作,应该直接就会有问题
二、然后计算出 [0,0,1] 到 forward 的旋转,作为root 旋转
三、接下来该算每一个关节的旋转。
t2m_raw_offsets: 这个其实记录了,后一(子)节点相对于当前节点的标准旋转
当去除掉全局+父旋转时,就是local 旋转。

TIPS: 解释一下这里IK的本质,其实就是当给定标准pose后,稠密点IK的计算方式。因此IK也分多种情况:1)给定稠密点,求出相对标准姿态的骨骼系数 2)给定叶节点,求出相邻跟骨骼的合适位置

quat_params 里面存储的就是各个骨骼旋转的系数。

接下来继续 motion_representation.py
【1】选择一个样本,获得骨骼的长度,进行IK。最终对齐(tgt)骨骼系数,然后得到新的关键点坐标
【2】接着就认为整个序列的最低点在地面上,然后放置在地面上
【3】按照第一帧的XZ坐标,进行对齐
【4】接着算出第一帧旋转的值,然后把人给转正
【5】根据脚的移动速度算出是否接触地面(经验值)
【6】然后计算,速度,和角速度
【7】计算joint相对位置(对齐到x,z),并且转正。然后计算 height,和转正之后骨骼点的位置
【8】一些额外的特征,然后joint velocity 还是有个root 旋转,其实应该就是顺便记录下全局位置
【9】后面的代码展示了回复的步骤

这里面再分析一下速度的计算

'''XZ at origin'''
root_pos_init = positions[0] # pos 只做到步骤[2],这里选择了序列的第一帧
root_pose_init_xz = root_pos_init[0] * np.array([1, 0, 1]) # 这里是记录下第一帧的hip位置
positions = positions - root_pose_init_xz # 以第一帧hip为原点,对齐所有的点

# forward_init 是第一帧朝前的向量
target = np.array([[0, 0, 1]])
root_quat_init = qbetween_np(forward_init, target) # 计算和标准朝向的差距,注意这里本质上一个逆
root_quat_init = np.ones(positions.shape[:-1] + (4,)) * root_quat_init # 扩展一下
positions = qrot_np(root_quat_init, positions) # 其实就是把第一帧给转正了,其他的修正一下

# root_quat = qbetween_np(forward, target) # 最开始是个逆? 转正的旋转
r_rot = quat_params[:, 0].copy() # 因此这个本质上是个逆? 这个非常重要
'''Root Linear Velocity'''
velocity = (positions[1:, 0] - positions[:-1, 0]).copy()
velocity = qrot_np(r_rot[1:], velocity) # 这一步具体意义不明,但结合上面的意义就是转正
# 强行理解就是,让(x,y)位置还能保留角度信息
'''Root Angular Velocity'''
r_velocity = qmul_np(r_rot[1:], qinv_np(r_rot[:-1])) # 就是获得相对旋转

# position:局部坐标 + 转正
ric_data = positions[:, 1:].reshape(len(positions), -1)
local_vel # 其实也是带有旋转的
# root_rot_velocity (B, seq_len, 1)
# root_linear_velocity (B, seq_len, 2)
# root_y (B, seq_len, 1)
# ric_data (B, seq_len, (joint_num - 1)*3)
# rot_data (B, seq_len, (joint_num - 1)*6)
# local_velocity (B, seq_len, joint_num*3)
# foot contact (B, seq_len, 4)

接下来就是如何从 data 数据中恢复骨骼
recover_root_rot_pos:这个就是恢复 root 的位置(r_pos)和y轴旋转。
recover_from_rot:利用 r_pos 和 系数 进行 forward 获得最终的 关键点.
recover_from_ric:之前的 ric 已经转正了,现在需要

Motion Latent Diffusion

先说一下利用blender渲染部分:
主要文件在 mld/render/blender/render.py(joints.py) 中
大概思路就是每一帧都会重新画圆柱和球,并且保存到图片上。 传入的参数 mat 不是矩阵,而是材质

代码的管理主要是通过 OmegaConf 这个库来进行的。优势就是可以随意增加key,v,而且可以$引用(需要load之后resolve)

loss
models/losses/utils.py 这里面应该才是最终用到的loss

感觉核心是看 models/architechtures/modeltype/mld.py
网路结构
文本的:

<think>嗯,用户遇到了“pip不是内部或外部命令”的问题,这通常是因为环境变量没有正确配置。首先,我需要回忆一下常见的解决方法。根据之前的引用资料,用户可能需要将Python和Scripts目录添加到系统环境变量中。首先,我应该检查用户是否正确安装了Python,并且是否在安装时勾选了“Add Pythonto PATH”选项。如果没有勾选,那环境变量里就不会有Python的路径,导致pip无法识别。这时候需要手动添加路径。然后,用户可能安装的是旧版本的Python,比如2.x版本,这些版本可能默认不安装pip。这种情况下,可能需要用户单独安装pip或者升级到Python3.x。另外,有时候用户可能安装了多个Python版本,导致系统找不到正确的pip路径。这时候需要确认环境变量中的路径指向正确的Python安装目录下的Scripts文件夹。还有,用户可能在虚拟环境中使用,但虚拟环境没有正确激活,或者pip只安装在虚拟环境中,而全局环境下没有安装。这时候需要激活虚拟环境或者检查全局安装。 步骤方面,应该先指导用户找到Python的安装路径,然后手动添加环境变量。接着,在命令提示符中验证是否生效。如果还是不行,可能需要重新安装Python并确保勾选添加PATH,或者使用python-mpip来执行命令。还要考虑用户是否以管理员权限运行命令行,或者是否有权限修改环境变量。另外,对于Windows系统,用户可能需要重启命令行或者整个系统使环境变量生效。最后,可能需要提醒用户检查pip是否确实存在于Scripts目录中,如果不存在,可能需要通过ensurepip模块来安装,或者下载get-pip.py脚本进行安装。总结起来,解决步骤应该是:检查Python安装和环境变量配置,手动添加路径,验证安装,处理多版本问题,使用替代命令,以及重新安装pip。同时,给出具体的操作示例,比如如何找到Python路径,如何编辑环境变量等,这样用户能一步步跟着操作。</think>### 如何解决“'pip' 不是内部或外部命令”的问题? #### 一、问题原因分析 该错误通常是由于**系统环境变量未正确配置**导致操作系统无法找到pip的安装路径。常见原因包括: 1. Python安装时未勾选**“Add Python to PATH”** 2. 手动安装Python但未配置Scripts目录路径 3. 多版本Python共存导致路径冲突 4. pip未正确安装或损坏 #### 二、解决方案步骤 ##### 1. 验证Python安装 - 在命令行输入`python --version`和`where python` - 如果显示版本号且路径正确,说明Python已安装 - 若未显示版本号,需重新安装Python[^1] ##### 2. 配置环境变量(Windows) **步骤1:定位Python安装路径** - 默认路径示例:`C:\Users\用户名\AppData\Local\Programs\Python\Python311` - Scripts目录路径示例:`C:\Users\用户名\AppData\Local\Programs\Python\Python311\Scripts` **步骤2:添加系统变量** ```shell 控制面板 > 系统和安全 > 系统 > 高级系统设置 > 环境变量 ``` 在**Path**变量中添加两条路径: ``` Python安装目录(如:C:\Python311) Scripts目录(如:C:\Python311\Scripts) ``` ##### 3. 验证配置效果 ```powershell # 新开命令行窗口执行 echo %PATH% pip --version ``` 正常应显示类似: ``` pip 23.3.1 from C:\Python311\Lib\site-packages\pip (python 3.11) ``` ##### 4. 处理多版本冲突 ```powershell # 明确指定Python版本 python -m pip install [包名] py -3.11 -m pip install [包名] ``` ##### 5. 重新安装pip(极端情况) ```powershell python -m ensurepip --upgrade curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python get-pip.py ``` #### 三、预防措施 - 安装Python时务必勾选**“Add Python to PATH”** - 推荐使用虚拟环境工具(如venv、conda) - 定期执行`python -m pip install --upgrade pip` #### 四、扩展验证方法 ```powershell # 检查所有Python相关路径 where pip where python # 查看环境变量配置 echo %PATH% | findstr "Python" ``` ---
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值