人体三维重建SMPL、SMPLX、SMPLifyX学习笔记

本文基本是针对代码运行和Blender插件的使用来记录,原理和论文请自行查阅。

原理

请参考下面的文章(也可以看论文):
SMPL学习笔记
人体捕捉:《SMPL-X》
SMPLify-x 基本讲解

SMPL

SMPL官网:需要注册才能下载模型和代码。

  1. 进入Download,在SMPL for Python Users中选择Download version 1.1.0 for Python 2.7 (female/male/neutral, 300 shape PCs);
  2. 按照README.txt的指导运行代码,可能会有import包的路径问题,把脚本文件拖出来就行;
  3. 运行成功会得到一个hello_smpl_m.obj或hello_smpl_f.obj,可以将obj文件导入到Blender中进行可视化(有可视化代码但因为我是VSCode远程服务器跑的代码不能打开可视化窗口)。
  4. 继续在官网的Download界面找到SMPL for Blender,选择Download SMPL Blender Add-on(20210611,34MB),打开Blender,选择Edit->Preferences->Add-ons->Install an add-on,找到下载的SMPL Blender Add-on进行安装;
  5. 安装成功后在界面右边可以打开SMPL插件,有时候可能被隐藏了,找一下类似‘<’这样的箭头打开就行;
  6. SMPL的Blender插件我只能添加三维模型,加载姿势的相关按键点了没反应。

SMPLX

SMPLX官网:需要注册才能下载模型。
SMPLX源码:https://github.com/vchoutas/smplx

  1. SMPLX的代码我只跑通了examples/demo.py,最后得到没有姿势动作的SMPLX三维模型;
  2. SMPLX里有些包需要注意一下,vposer请在官网下载,如果出现no module xxx,可以先pip install xxx看看有没有,没有就去github搜,搜到克隆下来,将需要的那个文件夹复制到SMPLX代码的文件夹里;
  3. 请看README.md,需要smplx/models文件夹,里面的smplx从官网->Download->SMPL-X Model选择Download SMPLX v1.1 830MB;mano在MANO官网下载;smpl在SMPL官网中的Python代码里就有那三个模型,改成对应名字就行;smplh在MANO官网的Download找到Models & Code,选择Extended SMPL+H model;
  4. 在SMPLX官网找到SMPL-X Blender Add-on,选择Download SMPL-X Blender Add-on (300 shape components, 20220623, 310MB),与SMPL同样在Blender中安装好,右边就会出现插件界面;
  5. 关于SMPLX的Blender插件,官方提供了姿势数据集Agora和动画数据集AMASS,下载好数据集后可以通过插件将动作导入到Blender中展示。

SMPLifyX

SMPLifyX源码:https://github.com/vchoutas/smplify-x
这是SMPLX的一个实现版本,具体要做的就是输入图像和关键点得到mesh模型(.obj)和姿势参数文件(.pkl)。这里官方也提供了一个包含图像和关键点的数据集EHF,可以在SMPLX官网中找到并下载。
如果是处理自己的数据,则需要下载openpose来处理图像得到关键点,smplify-x的代码只能读取openpose格式的关键点。

  1. 准备好输入数据,图像放在data/images,关键点放在data/keypoints,并且图像的命名如果是01_img.png,则关键点的命名必须是01_img_keypoints.json;
  2. 将SMPLX步骤3的模型也放到smplify-x中,下载SMPLX官网里的vposer也放到smplify-x中,可能还需要下载mesh_intersection的包;
  3. 接着修改一下代码,smplify-x/cfg_files/fit_smplx.yaml中interpenetration: False
  4. smplify-x/smplifyx/fit_single_frame.py中将result['body_pose'] = pose_embedding.detach().cpu().numpy()改成result['body_pose'] = vposer.decode(pose_embedding, output_type='aa').detach().cpu().numpy().reshape((1,63))
  5. 运行python smplifyx/main.py --config cfg_files/fit_smplx.yaml --data_folder data --output_folder output --visualize='False' --model_folder models --vposer_ckpt vposer --part_segm_fn smplx_parts_segm.pkl
  6. 运行成功就会在output文件夹里得到三个子文件夹,其中meshes里面的是mesh模型(.obj),results里面的是姿势参数文件(.pkl);
  7. 打开Blender,可以将obj模型import进去可视化看看,然后用SMPL-X插件先Add一个模型,再Load pose,选择在第6步得到的pkl,就能将生成的姿势参数迁移到其他三维模型上。
  8. 如果需要生成动画,建议先看看SMPLX官网上的两个视频。简单的步骤如下:Add model->选择SMPLX-female->选择Pose Mode->在Select box模式下全选模型,使得关键点的毛刺呈蓝色->Load Pose-> 选择,加载->Pose Mode->鼠标右键或I,Insert Keyframe->Location & Rotation->拉到后面的帧->在Pose Mode下重复Load Pose后的操作。
  9. 在将smplifyx生成的pkl导入到Blender时可能会报关于hand_pose维度匹配不上的错,可以通过修改smplify-x/smplifyx/fit_single_frame.py中num_pca_comps: 45来避免报错,但手部动作还是没有正确加载。

暂未解决的问题

目前主要在使用SMPL-X插件和Smplify-x代码,遇到的问题大部分靠查找github上issue的问题来解决,下面是几个暂时还没解决的问题:

  1. 由smplifyx生成的姿势pkl导入到Blender中,模型会旋转180度,root关键点的位置会变化。这个问题发邮件问了作者,作者的回答是Blender的地面坐标系是XY轴,而smplifyx生成的模型地面坐标系是XZ轴,需要我在Load pose之前固定轴,但我感觉不是这个原因,因为由SMPLX插件Add的模型的局部地面坐标也是XZ,而如果导入的pkl是官方提供的Agora数据集则不会有旋转和root位置改变的情况;
  2. 我尝试截取一个视频中的10帧来生成姿势pkl,再导入到Blender中,逐帧打keyframe生成动画,可以看到如果视频的动作较快,截取的图像残影较大,openpose处理的效果就不好,即生成的关键点会出现缺胳膊少腿的情况,那么迁移到三维模型上,模型就会做出一些奇怪的动作;
  3. 并且由于是逐帧生成的姿势参数,只考虑了姿势,没有考虑针对全局空间的位移信息,如果你是往前跑步的动作视频,那么得到的动画不加以处理的话就只能得到原地跑步的动画;
  4. 由smplifyx生成的姿势pkl只能导入躯干的姿势,手的姿势和表情是没有的。

目前找到的解决方法

  1. 关于上面的问题1中root关键点位置不对齐,修改SMPL-X Blender Add-on压缩包里的__init__.py脚本,将set_pose_from_rodrigues(armature, "pelvis", global_orient)改成set_pose_from_rodrigues(armature, "root", global_orient),可以将root关键点放回到胸口差不多的位置,但还是不在最原始的位置。修改完脚本之后要重新安装插件才能修改成功。
  2. 关于问题1,直接将SMPL-X Blender Add-on压缩包里的__init__.py脚本global_orient相关的代码注释掉,旋转和root不对齐问题都能解决。

因为原作者的源码和官网比较多,复现起来比较混乱,有些解决的bug可能没写出来,如果大家有遇到什么问题可以一起讨论一下。

你可能感兴趣的:(学习)