SMPL 是一种3D人体建模方法,现在几乎所有的元宇宙人体建模都是基于此类方法,包括但不限于元宇宙,自动驾驶等领域。
它能估计出比较准确的人体3D姿态,得益于海量数据训练的人体3D先验。不仅仅是人体,包括手部,人脸,甚至是动物都能用此类方法进行建模。尤其是人脸,在此基础之上有了 MANO, FLAME等方法。
但这类方法问题也比较多,最令人头秃的莫过于3D pose的可视化,最大的问题在于很多人摸不着头脑,尤其是对于3D 图形学不是很了解的刚入门者,很多人都不知道我预测出来的pose,要怎么给他可视化。
很多人此时就会给你推荐pyrender等上古库,这是一种极其不跨平台,而且非常不友好,依赖繁多,很多库都是给你 == 1.0.1 限定极速款强行写死的依赖,你不用看你还不知道,一用绝对想跳楼。
另外的问题就是你会需要下载很多各种各样的SMPL模型,有的是npz,有的是pkl,然后还需要一些依赖库来跑得起来。
我平生最怕的就是麻烦,今天要传授的就是告诉你,可视化,别跟我讲什么pyrender,你如果跟我讲pyrender,我一定会认为你是一个固守陈规,毫无创新之辈。能用5行代码解决的事情,我绝对不会用100行。
现在假如你有一个非常牛逼的模型,预测出了一个非常准确的Pose,不知道可视化怎么办呢?怎么直接运行这么几行代码:
import collections
import onnxruntime as rt
import torch
import numpy as np
from nosmpl.vis.vis_o3d import vis_mesh_o3d, Open3DVisualizer
from nosmpl.utils import rot_mat_to_euler
def gen():
sess = rt.InferenceSession("smplh_sim.onnx")
for i in range(5):
body_pose = (
torch.randn([1, 63], dtype=torch.float32).clamp(0, 0.4).cpu().numpy()
)
left_hand_pose = (
torch.randn([1, 45], dtype=torch.float32).clamp(0, 0.4).cpu().numpy()
)
right_hand_pose = (
torch.randn([1, 45], dtype=torch.float32).clamp(0, 0.4).cpu().numpy()
)
outputs = sess.run(
None, {"body": body_pose, "lhand": left_hand_pose, "rhand": right_hand_pose}
)
vertices, joints, faces = outputs
vertices = vertices[0].squeeze()
joints = joints[0].squeeze()
faces = faces.astype(np.int32)
vis_mesh_o3d(vertices, faces)
然后,你就可以i见证奇迹:

让我解释一下这里发生了什么:
首先,你没有下载SMPL把?我没有让你下载smpl把?你需要的只是一个onnx;
其次,我没有让你用任何SMPL的库把?这里面只有onnxruntime,nosmpl是可视化的。
所以说,我们几行简单的代码,完成了一个 SMPL mesh的生成!
这个mesh怎么来的呢?模型预测出来的!
以后可视化3d pose,比跟我说我没有告诉你10行代码就能搞定,另外,这个东西你可以在任何语言实现,因为它本质上输入就是你的pose,输出给你一个mesh。无我其他任何依赖。