学习报告(week 5)
SMPLify Demo Test
为了验证之前提出的毕设方案的可行性,这个星期的主要任务是配置环境运行 SMPLify 的 demo 代码,但这个过程中还是遇到不少问题的。
首先,SMPLify 的依赖库有 numpy、scipy、chumpy、opendr、matplotlib、opencv、openGL、SMPL 等,其中:chumpy、opendr、SMPL 仅支持 Python 2.x 版本。但是,考虑到我们之后可能会用到基于 Python 3.x 的外部库(如 Tensorflow 等),我们要先修改这些依赖库的代码,使它们兼容 Python 3.x。
我们先使用 pip3 install 来安装这些依赖库,但在这个过程中,我发现无法通过 pip3 来安装 opendr 与 SMPL。当我们尝试用 pip3 安装 SMPL 时,会出现 No matching distribution found for SMPL 的报错,而原因也很简单,因为 SMPL 并不是很流行的库,所以很有可能只能手动进行安装。而无法通过 pip3 安装 opendr 是因为 opendr 只支持 Python 2.x,通过 pip3 下载的 opendr 的 whl 会无法正常运行 setup.py。最后,我在 google 上搜寻了很多资料,终于在这个网站上找到了兼容 python3.5 版本的 opendr。我们运行 opendr 文件夹中的 setup.py 文件,依次执行以下两条指令完成安装:python3.5 setup.py build、python3.5 setup.py install。然后,我从 SMPL 的官方网站上下载了 SMPL for Python version 1.0.0 的代码。我们要手动安装的话要先进入 Python 的 site-package 路径,然后新建一个 pth 文件,里面保存 SMPL 的安装目录,将 SMPL 的目录添加到 Python 的检测路径中。
到这一步,我们先尝试运行 SMPL 提供的 demo 代码 – hello_smpl.py。此时,版本不兼容的问题就体现出来了。我遇到的第一个问题是 ImportError: No module named xxxx,它出现的原因是 Python2.x 与 Python3.x 的 import 操作有些许差别。假设在 a 文件夹下有文件 b.py 与 c.py,在 Python2.x 中我们可以在 b.py 中使用 import c 来引用 c.py;在 Python3.x 中,我们要改用 import a.c。这个问题出现在了 chumpy、opendr、SMPL 中的一些列代码文件中,这里就不一一列举了。
遇到的第二个问题是若干系统库的修改,如:在 Python3.x 中 CPickle 与 pickle 被整合成了 pickle;Xrange 与 range 被整合成了 range;NameError: name ‘reduce’ is not defined,reduce 不再存在于 build-in function 中,使用前要先 from functools import reduce;object of type ‘generator’ has no len(),Python3.x 的返回类型与 Python2.x 不一样,要把 generator 先转换为 list;’function’ object has no attribute ‘func_name’,func_name 被更改为 __name__;unsupported operand type(s) for +: ‘range’ and ‘list’,要先把 range 转换为 list。
最后遇到的最麻烦的问题是 SMPL 库的某些操作会引起 unsupported operand type(s) 报错,在排查了一轮之后我发现 Python3.x 的对 __div__ 与 __mul__ 的重载有些不一样了,我们要手动修改部分代码中的运算符。且外,pickle 的读写格式也不再默认支持二进制,我们需要把 mode 设为 rb 或 wb。其实整个过程中还有其他很多问题,但是我没能一一记住,这里就不赘述了。
努力了一番过后,我终于成功运行了 SMPL 的 hello_smpl.py 文件,这里的关节点是 SMPL 给出的测试数据,运行 hello_smpl.py 可以将对应的 pkl 文件转换为 obj 模型。
然而,我们的工作还没结束,我们还需要跑通 SMPLify 的 demo 代码 – fit_3d.py。我们先从官网上下载 SMPLify Code and model。我们用前文提到过的方法配置好路径后,还需要在网上下载 lsp 运动姿势照片 dataset,但是这个 dataset 貌似已经被官网下架了,努力了一番后还是在 github 上找到了照片集。且外,我们也要用到从 DeepCut 提取的 lsp dataset 的二维特征点,但由于时间问题,我没有时间去尝试运行 DeepCut,暂时先使用了现有的已经提取好的特征点。关于 DeepCut 的内容,我会在尽快尝试运行。对 SMPLify 源码进行一系列的修改后,我们终于可以运行 fit_3d.py 了。对于一幅给定的 lsp 图片,fit_3d.py 会生成对应的模型截图与 pkl 文件。
但是,在我尝试使用刚刚得到的 pkl 文件来生成对应的 obj 文件或者其他格式的 mesh 时,我却发现 pkl 无法正常读取。由于目前还有两个课程项目还没来得及完成,一时半刻间我也没办法解决这个问题,所以在这次的周报中暂时保留这个问题,我会争取在这周完成 DeepCut 的测试与读取 pkl 的测试,并尽量使用自己定义的图片来测试 SMPLify 的效果。