-
Notifications
You must be signed in to change notification settings - Fork 76
Description
I get the npz file of SMPLX,but I only want SMPLH model
`import os
from os import makedirs
import numpy as np
import open3d as o3d
import torch
import json
from tools.utils.build_layer import build_smplh_mesh, Pelvis_norm, create_mesh
import sys
def get_mesh(npz_data):
device = torch.device("cuda:0")
smplh_param = {}
param_data = npz_data
# 转换参数为Tensor
smplh_param['shape'] = torch.tensor(param_data['betas']).unsqueeze(0) # 形状参数 (1, 10)
smplh_param['transl'] = torch.tensor(param_data['transl']).unsqueeze(0) # 平移 (1, 3)
smplh_param['body_pose'] = torch.tensor(param_data['body_pose']).reshape(1, 21, 3, 3) # 身体姿势 (21个关节的旋转矩阵)
smplh_param['left_hand_pose'] = torch.tensor(param_data['left_hand_pose']).reshape(1, 15, 3, 3) # 左手姿势
smplh_param['right_hand_pose'] = torch.tensor(param_data['right_hand_pose']).reshape(1, 15, 3, 3) # 右手姿势
smplh_param['global_orient'] = torch.tensor(param_data['global_orient']).reshape(1, 3, 3) # 全局旋转
# 构建SMPL-H网格(通过外部函数`build_smplh_mesh`)
vertices, face = build_smplh_mesh(smplh_param)
vertices = vertices.to(device)
# 归一化顶点(通过外部函数`Pelvis_norm`)
H, pelvis = Pelvis_norm(vertices, device)
vert = H.detach().cpu().numpy()
# 创建Open3D网格(通过外部函数`create_mesh`)
mesh = create_mesh(vertices=vert[0], faces=face)
return mesh, H[0], face
def visual_contact(npz_data,filename,save_path):
# 加载接触数据(每个顶点是否接触的标记)
colors = np.array([255.0, 255.0, 255.0])[None, :].repeat(6890, axis=0) # 6890个顶点初始为白色
colors = colors / 255.0 # 归一化到[0,1]范围
# 获取SMPL模型网格(通过外部函数`get_mesh`)
smpl, _, _ = get_mesh(npz_data)
ply_save = os.path.join(save_path, filename.replace(".npz",".ply"))
# 应用颜色并保存
smpl.vertex_colors = o3d.utility.Vector3dVector(colors)
o3d.io.write_triangle_mesh(ply_save, smpl)
if name == 'main':
npz_path = "mycreateMesh/Bicycle/pull"
save_path = r"mycreateMesh/Bicycle/pull"
os,makedirs(save_path,exist_ok=True)
for filename in os.listdir(npz_path):
if filename.endswith(".npz"):
npz_path = os.path.join(npz_path, filename)
if not os.path.exists(npz_path):
print(f"not found {npz_path}")
sys.exit(1)
npz_data = np.load(npz_path)
visual_contact(npz_data,filename,save_path)
E:\PyCharm 2025.1.2\plugins\python-ce\helpers\pydev\pydevd_plugins_init_.py:2: UserWarning:
pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
已连接到 pydev 调试器(内部版本号 251.26094.141)print(npz_data["betas"])
PyDev console: using IPython 9.4.0
[[ 0.82817674 0.6526434 0.4085177 -0.2684117 -1.0917997 -0.76369494
-0.09565452 0.14748831 0.04955668 -0.10091463]]
Traceback (most recent call last):
File "E:\PyCharm 2025.1.2\plugins\python-ce\helpers\pydev\pydevd.py", line 1570, in _exec
pydev_imports.execfile(file, globals, locals) # execute the script
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\PyCharm 2025.1.2\plugins\python-ce\helpers\pydev_pydev_imps_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "E:\lemon_3d-main\lemon_3d-main\smpler-x.py", line 70, in
visual_contact(npz_data,filename,save_path)
File "E:\lemon_3d-main\lemon_3d-main\smpler-x.py", line 50, in visual_contact
smpl, _, _ = get_mesh(npz_data)
^^^^^^^^^^^^^^^^^^
File "E:\lemon_3d-main\lemon_3d-main\smpler-x.py", line 23, in get_mesh
smplh_param['body_pose'] = torch.tensor(param_data['body_pose']).reshape(1, 21, 3, 3) # 身体姿势 (21个关节的旋转矩阵)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: shape '[1, 21, 3, 3]' is invalid for input of size 63
python-BaseException
` But I don't know how to use the right smplx params