学习报告(week 6)

学习报告(week 6)


SMPLify Demo Test 2

在上次运行 demo 的基础上,我们这次将尝试运行自己的测试样例,而不是 SMPLify 提供的 LSP dataset。

上次测试的时候,我们还留有一个问题尚未解决:在 SMPLify 上对 LSP dataset 进行测试后无法获得对应的 pkl 文件。在仔细研究了源代码后,我发现这个问题是 Python2 与 Python3 在读写文件上有差别所导致的。为了解决这个问题,我们需要先定位到 ‘fit_3d.py’ 中的:

with open(out_path, 'wb+') as outf:
    pickle.dump(params, outf)


我们把这两行代码改成如下形式,即可获得保存关节点数据的 pkl 文件了:

with open(out_path, 'w+') as tmp:
    tmp.write(params.__str__())

接下来,我们要尝试使用 SMPLify 测试我们自己的输入图片。

首先,我们需要获取输入图片的 DeepCut 预测关节点,经由 DeepCut 获得的 14 个关节点与 SMPLify 关节点的对应关系如下:

index joint name corresponding SMPL joint ids
0 Right ankle 8
1 Right knee 5
2 Right hip 2
3 Left hip 1
4 Left knee 4
5 Left ankle 7
6 Right wrist 21
7 Right elbow 19
8 Right shoulder 17
9 Left shoulder 16
10 Left elbow 18
11 Left wrist 20
12 Neck -
13 Head top vertex 411 (see line 233:fit_3d.py)


而 DeepCut 关节点的输出格式如下:

The pose in 5x14 layout. The first axis is along per-joint information,
the second the joints. Information is:
  1. position x,
  2. position y,
  3. CNN confidence,
  4. CNN offset vector x,
  5. CNN offset vector y.


在此,我们需要用到的 DeepCut 关节点数据为其输出的前三维,即:x 坐标、y 坐标、预测 confidence。

在尝试安装 DeepCut 的依赖库 Caffe 时,我遇到了不少的问题,最终耗费了不少时间才成功运行 DeepCut。因此,我先简单描述一下 DeepCut 的环境配置操作。

最开始的时候,我分别尝试了在 macOS 与 Ubuntu 16.04 上安装 Caffe,具体教程可以参照以下网址。但是,Caffe 框架使用到了很多依赖库,我们简单地通过 pip3 安装这些依赖库的话,会出现各个依赖库间版本不兼容的问题,即在终端执行如下命令无法正确安装 Caffe 的依赖库:

$ pip install -r requirements.txt 


为了解决这个问题,我尝试去安装一些过时了的版本的依赖库,希望能借此解决不兼容的问题。但是,有些库的资源已经不太好找到了,因此,我最后使用了一种操作上比较简单的方法解决了这个问题。我们需要先安装一个 Ubuntu 18.04 系统,然后在终端执行如下命令:

$ sudo apt install caffe-cpu


然后,我们从 DeepCut 的官方 Github 上下载它的源代码。我们根据 README 中的教程,在终端依次执行如下命令:

$ pip3 install click
$ cd models/deepercut
$ ./download_models.sh


而在 run demo 时,我们不能完全依照教程中的步骤来执行。由于我们安装的是 cpu 版本的 Caffe,我们要在终端执行如下命令以运行 DeepCut demo:

$ cd python/pose
$ python3 ./pose_demo.py image.png --out_name=prediction --use_cpu


DeepCut 的关节点将储存在 ‘prediction.npz’ 文件中。接下来,我们要运行 SMPLify 的 ‘fit_3d.py’ 来测试我们的输入图片。

首先,我们可以留意到 ‘fit_3d.py’ 中有如下代码:

with open(join(data_dir, 'lsp_gender.csv')) as f:
    genders = f.readlines()


我们可以看到 SMPLify 需要读入一个保存测试图片性别的 csv 文件,因此,我们需要先为我们的测试图片创建一个这样的文件。

然后,SMPLify 需要读入 ‘est_joints.npz’ 文件,这个文件是一个 3x14xN 的 np 数组,其中,N 为测试图片的数目。在此,我们需要对如下代码进行一点修改:

est = np.load(join(data_dir, 'est_joints.npz'))['est_joints']


在 ‘prediction.npz’ 中,关节点被存放在 dict == ‘pose’ 中,我们要把代码修改成如下形式:

est = np.load(join(data_dir, 'prediction.npz'))['pose']


且外,由于我们的 prediction.npz 是 5x14 的 np 数组,我们还需要对其进行 reshape 才可以适用于 SMPLify 中:

est = est[0:3]
est = np.reshape(est, (-1, 14, 1))


至此,我们只需运行 ‘fit_3d.py’ 即可获得测试图片相对应的 SMPLify 预测结果:

显然,这个结果是存在明显的误差的,我们接下来需要定位误差产生的原因。

我们尝试使用 DeepCut 对 LSP dataset 的第一张图片进行预测:

然后将 DeepCut 的结果输入到 SMPLify(左图为自己运行 DeepCut 后得到的结果,右图为使用官方提供的 DeepCut 数据得到的结果):

我们发现即便使用 LSP dataset,我们也无法获得与 SMPLify 官方一样的结果。因此,我将自己运行 DeepCut 的输出与官方提供的 DeepCut 输出分别打印出来(上图为自己运行的结果,下图为官方提供的结果):

我们可以明显发现两者有较大的差别,因此,我们可以大胆推测目前阶段误差出现的原因是 DeepCut 的问题。

为了解决这个问题,需要先研究清楚 DeepCut 的论文,故目前还需要一点时间才能完成这个工作。我会在给课程期末项目收尾后,尽快完成这部分的工作。