目录
- 一、 数据集生成
-
- (一)环境配置说明
- (二)cmake和make
- (三)安装CLI11
- (四)安装Pangolin
- (五)安装nanoflann
- (六)安装Eigen3
- (七)编译SDF
- (八)处理数据集
- 二、模型训练
-
- (一)SDF数据浅析
- (二)训练过程
一、 数据集生成
(一)环境配置说明
这篇博文主要讲解“DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation”这篇paper复现过程中的环境配置工作。由于DeepSDF并没有直接给出训练数据集,只是给出了从原始ShapeNet数据集转SDF数据集的前处理代码,所以需要花费大量的工作来配置数据集处理所需的环境。
强烈建议这一部分在本地完成,不要在远程服务器上进行。 因为远程服务器上一般来说没有管理员权限,没有办法运行
针对上面的问题,一种解决办法是把需要的软件包源码下载到自己的用户目录,然后手动编译,再在~/.bashrc中编辑环境变量,把动态链接库指向自己用户目录下的库文件。但这样会带来各种各样的问题,因为有一些库文件并不能直接下载源码&编译,有一些库文件还需要用到其它系统库文件的依赖,往往解决了一个bug还会出现另一个bug。我一开始打算这样在服务器上配置环境,但后来因为各种难以解决的bug而放弃了。
另一种解决办法是在本地的linux环境中配置,因为这一阶段不涉及到训练,只是生成数据集。我们完全可以在本地生成数据集,之后传到服务器上进行训练。本地的linux环境可以考虑在windows上的双系统,或者使用虚拟机。这篇博文主要讲解这种方法,我最后也是使用这种方法配置成功的。我使用的linux系统为Ubuntu16.04.
(二)cmake和make
首先要保证系统中有cmake和make。在命令行里输入
1 2 | cmake --version make --version |
可以查看cmake和make是否安装,如果显示如下说明已经有cmake和make。
如果提示“找不到make指令”或“找不到cmake指令”,就需要下载。
下载make命令可以直接使用
1 | sudo apt install make |
下载cmake命令如果直接使用
1 2 3 4 5 6 7 8 9 10 11 12 | # 源码包下载到本地 wget https://github.com/Kitware/CMake/releases/download/v3.14.1/cmake-3.14.1.tar.gz # 解压 tar xvf cmake-3.14.1.tar.gz cd cmake-3.14.1/ ./bootstrap make # 安装 make install # 如果需要移除旧版本的cmake yum remove cmake -y ln -s /usr/local/bin/cmake /usr/bin/ |
(三)安装CLI11
从这里开始,要安装SDF处理数据集所需要的四个C++库文件,这在它的README里面也提到了。第一个是CLI11,这个库的github地址是https://github.com/CLIUtils/CLI11 ,在命令行里面运行
1 | git clone https://github.com/CLIUtils/CLI11 --recursive |
将这个项目克隆到本地。注意因为这个项目引用了别的项目,所以
接下来编译和安装:
1 2 3 4 5 6 | cd CLI11 mkdir build cd build cmake .. make make install |
如果过程中没有报错则说明安装好了。在 /usr/local/lib/cmake 下可以找到名为CLI的文件夹。
(四)安装Pangolin
在安装这个之前首先需要安装一些依赖库。在命令行中运行如下语句:
1 2 3 4 | sudo apt install libgl1-mesa-dev sudo apt install libglew-dev sudo apt install libpython2.7-dev sudo apt install pkg-config |
然后将github上的Pangolin项目克隆到本地:
1 | git clone https://github.com/stevenlovegrove/Pangolin --recursive |
然后和之前一样,进行编译和安装:
1 2 3 4 5 6 | cd Pangolin mkdir build cd build cmake .. make make install |
如果上诉过程没有报错,则说明安装好了。
我自己安装过程中,在make命令运行到80%时碰到了"undefined reference to ‘PyString_Size’"这个问题,如下:
参考https://github.com/pytorch/pytorch/issues/591,可能是系统里自带的python版本有bug,解决办法是在系统里重新安装一遍python2.7,把系统默认的python替换掉。重新安装python的方法参见:Linux安装python2.7、pip和setuptools
,具体步骤如下:
1 2 3 4 5 6 7 8 9 10 11 | # 源码包下载到本地 wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz # 解压 tar -zxvf Python-2.7.14.tgz # 创建安装文件夹 mkdir /usr/local/python27 # 编译安装 cd Python-2.7.14 ./configure --prefix=/usr/local/python27/ make sudo make install |
安装完成之后,需要替换掉现有系统的python。不需要删除掉,只需要替换掉软链接即可。当前系统的python应该是指向/usr/bin目录下的python可执行文件,可以输入
其中,
1 2 3 4 5 6 | # 删掉之前的软链接 sudo rm /usr/bin/python sudo rm /usr/bin/python2 # 新建软链接 ln -s /usr/local/python27/bin/python2.7 /usr/bin/python ln -s /usr/local/python27/bin/python2.7 /usr/bin/python2 |
之后删掉
1 2 3 4 5 | mkdir build cd build cmake .. make sudo make install |
没有再报错,安装完成。
(五)安装nanoflann
这个库文件跟CLI11的安装方法类似,也不太会碰到多余的问题。首先从github上将这个目录克隆下来:
1 | git clone https://github.com/jlblancoc/nanoflann |
然后编译安装:
1 2 3 4 5 6 | cd nanoflann mkdir build cd build cmake .. make sudo make install |
如果过程中没有报错则说明安装好了。
(六)安装Eigen3
这个库不是github项目,需要下载源代码然后编译安装。首先将源码包下载下来:
1 | wget https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz |
然后解压:
1 | tar xvf eigen-3.3.9.tar.gz |
之后就像前面一样,编译并安装:
1 2 3 4 5 6 | cd eigen-3.3.9 mkdir build cd build cmake .. make sudo make install |
如果没有报错则说明安装好了。
(七)编译SDF
在上面四个库都安装完成后,就可以安装SDF了。和之前的操作一样,在
1 2 3 4 5 | mkdir build cd build cmake .. make make install |
如果过程中没有报错,则安装成功。我在make过程中碰到了下面的问题:
参考 https://github.com/facebookresearch/DeepSDF/issues/29 的解决方案,到github上把这个文件夹 https://github.com/stevenlovegrove/Pangolin/tree/master/include/mpark 下载下来,放到
在
(八)处理数据集
SDF给出了一个名为"preprocess_data.py"的代码,这个代码能够把ShapeNetV2数据集转换成SDF数据集。在运行这个代码之前,首先要配置好python环境。README里并没有给出python的版本号和requirements.txt,我使用的是python3.6,需要安装的包有以下几个:
1 2 3 4 5 6 | pytorch==1.1.0 torchvision==0.3.0 cudatoolkit=10.0 plyfile scikit-image trimesh |
可以使用anaconda3新建一个python3.6的虚拟环境,然后使用
注意:安装的pytorch版本不能高于1.1.0,因为有一些库不支持高版本的pytorch,会报错。
准备好ShapeNetV2数据集后,转换数据之前还有一步操作。DeepSDF的渲染器代码有语法错误,需要进行修正。在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @start fragment #version 330 core in vec3 viewDirection_cam; in vec3 normal_world; in vec3 normal_camera; in vec4 xyz_world; in vec4 xyz_camera; in int gl_PrimitiveID ; //删掉这一行 uniform vec2 slant_thr; varying vec4 ttt; uniform mat4 V; uniform mat4 ToWorld; |
做完这一步,就可以在
1 2 3 | mkdir data export MESA_GL_VERSION_OVERRIDE=3.3 python preprocess_data.py --data_dir data --source [...]/ShapeNetCore.v2/ --name ShapeNetV2 --split examples/splits/sv2_sofas_train.json --skip |
在这个处理过程中,可能会报
上面是运行过程的截图。在代码运行过程中,每个ShapeNet文件会对应生成一个没有内容的空白窗口,不要关闭这些窗口,等代码处理完会自动关闭的。
二、模型训练
(一)SDF数据浅析
生成的SDF数据是一个npz文件,使用numpy可以读取该文件格式。这个数据拥有两个属性’pos’和’neg’,分别是mesh外部和内部的采样点。每一条数据有4个属性,前3个属性值是点的xyz坐标,第4个是SDF值(> 0在mesh外部,< 0在mesh内部),如下:
将一个沙发数据可视化出来的样子如下,这里用颜色标注距离,越接近表面的点颜色越红,越远离的点颜色越绿。从可视化结果能够看出来,SDF是在空间立方体中采了几十万个点,对每个点计算到mesh表面的距离,这个SDF的计算值还是很准确的,从红点处形成的surface是非常接近ground truth sofa的。
(二)训练过程
在获得了SDF训练数据之后,就可以开始训练了。训练方法使用DeepSDF提供的训练代码:
1 | python train_deep_sdf.py -e examples/sofas |
如果前面的环境都配置成功,运行上面的指令应该就可以开始进行网络的训练。代码会自动读取之前生成好的DeepSDF数据集,并进行训练。