这篇博文主要讲解“DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation”这篇paper复现过程中的环境配置工作。由于DeepSDF并没有直接给出训练数据集,只是给出了从原始ShapeNet数据集转SDF数据集的前处理代码,所以需要花费大量的工作来配置数据集处理所需的环境。
强烈建议这一部分在本地完成,不要在远程服务器上进行。 因为远程服务器上一般来说没有管理员权限,没有办法运行sudo apt install
指令,因此没有办法把依赖包下载到/usr目录。
针对上面的问题,一种解决办法是把需要的软件包源码下载到自己的用户目录,然后手动编译,再在~/.bashrc中编辑环境变量,把动态链接库指向自己用户目录下的库文件。但这样会带来各种各样的问题,因为有一些库文件并不能直接下载源码&编译,有一些库文件还需要用到其它系统库文件的依赖,往往解决了一个bug还会出现另一个bug。我一开始打算这样在服务器上配置环境,但后来因为各种难以解决的bug而放弃了。
另一种解决办法是在本地的linux环境中配置,因为这一阶段不涉及到训练,只是生成数据集。我们完全可以在本地生成数据集,之后传到服务器上进行训练。本地的linux环境可以考虑在windows上的双系统,或者使用虚拟机。这篇博文主要讲解这种方法,我最后也是使用这种方法配置成功的。我使用的linux系统为Ubuntu16.04.
首先要保证系统中有cmake和make。在命令行里输入
cmake --version
make --version
可以查看cmake和make是否安装,如果显示如下说明已经有cmake和make。
如果提示“找不到make指令”或“找不到cmake指令”,就需要下载。
下载make命令可以直接使用
sudo apt install make
下载cmake命令如果直接使用sudo apt install cmake
会下载最新版本的cmake(现在是3.5.1版本),但SDF这个项目编译使用的cmake是低版本的,如果直接使用最新的cmake,在后面的编译过程会报错。建议使用3.14版本。下载旧版本cmake的方法参考下面这篇文章:查看gcc版本并安装cmake3.14.1。具体操作步骤为:
# 源码包下载到本地
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
# 安装
sudo make install
# 如果需要移除旧版本的cmake
yum remove cmake -y
ln -s /usr/local/bin/cmake /usr/bin/
从这里开始,要安装SDF处理数据集所需要的四个C++库文件,这在它的README里面也提到了。第一个是CLI11,这个库的github地址是https://github.com/CLIUtils/CLI11 ,在命令行里面运行
git clone https://github.com/CLIUtils/CLI11 --recursive
将这个项目克隆到本地。注意因为这个项目引用了别的项目,所以git
后面要加--recursive
参数。
接下来编译和安装:
cd CLI11
mkdir build
cd build
cmake ..
make
sudo make install
如果过程中没有报错则说明安装好了。在 /usr/local/lib/cmake 下可以找到名为CLI的文件夹。
这个库不是github项目,需要下载源代码然后编译安装。首先将源码包下载下来:
wget https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz
然后解压:
tar xvf eigen-3.3.9.tar.gz
之后就像前面一样,编译并安装:
cd eigen-3.3.9
mkdir build
cd build
cmake ..
make
sudo make install
如果没有报错则说明安装好了。
在安装这个之前首先需要安装一些依赖库。在命令行中运行如下语句:
sudo apt install libgl1-mesa-dev
sudo apt install libglew-dev
sudo apt install libpython2.7-dev
sudo apt install pkg-config
然后将github上的Pangolin项目克隆到本地:
git clone https://github.com/stevenlovegrove/Pangolin --recursive
然后和之前一样,进行编译和安装:
cd Pangolin
mkdir build
cd build
cmake ..
make
sudo 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
,具体步骤如下:
# 源码包下载到本地
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可执行文件,可以输入ls /usr/bin/python* -l
查看:
其中,/usr/bin/python
和/usr/bin/python2
都是指向/usr/bin/python2.7
的软链接。此时应该删除这两个软链接,并把它们重新指向我们新下载好的python,具体操作如下:
# 删掉之前的软链接
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
之后删掉Pangolin/
目录下的build
文件夹,重新进行上述步骤:
mkdir build
cd build
cmake ..
make
sudo make install
没有再报错,安装完成。
这个库文件跟CLI11的安装方法类似,也不太会碰到多余的问题。首先从github上将这个目录克隆下来:
git clone https://github.com/jlblancoc/nanoflann
然后编译安装:
cd nanoflann
mkdir build
cd build
cmake ..
make
sudo make install
如果过程中没有报错则说明安装好了。
在上面四个库都安装完成后,就可以安装SDF了。和之前的操作一样,在DeepSDF
目录下,输入下面的命令:
mkdir build
cd build
cmake ..
make
sudo make install
如果过程中没有报错,则安装成功。
我在cmake过程中碰到了下面的问题:
这是因为cmake缺少zlib库,需要手动下载安装,可以使用如下命令安装:
wget http://www.zlib.net/zlib-1.2.11.tar.gz
tar -xvzf zlib-1.2.11.tar.gz
cd zlib-1.2.8.tar.gz
./configure
make
sudo make install
之后再次运行cmake就没问题了。
此外,我在make过程中碰到了下面的问题:
参考 https://github.com/facebookresearch/DeepSDF/issues/29 的解决方案,到github上把这个文件夹 https://github.com/stevenlovegrove/Pangolin/tree/master/include/mpark 下载下来,放到/usr/local/include/
目录下即可。从github下载单个文件夹可以使用GitZip插件,在http://kinolien.github.io/gitzip/这个网站上直接输入mpark的路径,即可下载这个文件夹而不下载整个git项目。
在make过程中还可能存在下面的问题:
这是因为系统安装nanoflann.hpp时的路径有问题。查看一下/usr/local/include/
目录,现在目录下可能是这个样子的:
解决办法是在该目录下新建一个名为nanoflann
的文件夹,然后把nanoflann.hpp
这个文件移到文件夹中去,具体操作方法和操作之后的文件夹组织如下:
之后再次运行make
命令,可以正常编译了。
在make install
完成后,应该能够在DeepSDF/bin
目录下产生两个可执行文件,分别是PreprocessMesh
和SampleVisibleMeshSurface
,如果有这两个文件则说明SDF的环境都配置成功了。
SDF给出了一个名为"preprocess_data.py"的代码,这个代码能够把ShapeNetV2数据集转换成SDF数据集。在运行这个代码之前,首先要配置好python环境。README里并没有给出python的版本号和requirements.txt,我使用的是python3.6,需要安装的包有以下几个:
pytorch==1.1.0
torchvision==0.3.0
cudatoolkit=10.0
plyfile
scikit-image
trimesh
可以使用anaconda3新建一个python3.6的虚拟环境,然后使用conda install
命令依次下载上面的包。
注意:安装的pytorch版本不能高于1.1.0,因为有一些库不支持高版本的pytorch,会报错。
准备好ShapeNetV2数据集后,转换数据之前还有一步操作。DeepSDF的渲染器代码有语法错误,需要进行修正。在DeepSDF/src/ShaderProgram.cpp
文件中,把第97行删掉,也就是in int gl_PrimitiveID ;
这一句:
@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;
做完这一步,就可以在DeepSDF
目录下运行下面的代码,将ShapeNetV2数据集转换成SDF数据集了(训练数据集)。--source
选项指向ShapeNetCore.v2数据集的存放位置。export MESA_GL_VERSION_OVERRIDE=3.3
这句话是指定代码支持3.3版本的GLSL语法,否则会发生GLSL版本冲突。
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
在这个处理过程中,可能会报Unable to read texture 'texture_4'
和GL Error 500
这两个error,但不用管它们,不影响最后的生成。
上面是运行过程的截图。在代码运行过程中,每个ShapeNet文件会对应生成一个没有内容的空白窗口,不要关闭这些窗口,等代码处理完会自动关闭的。preprocess_data.py
会把数据生成在data/SdfSamples/ShapeNetV2
目录下,每个ShapeNet物体大概需要1分钟左右的时间来生成一个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提供的训练代码:
python train_deep_sdf.py -e examples/sofas
如果前面的环境都配置成功,运行上面的指令应该就可以开始进行网络的训练。代码会自动读取之前生成好的DeepSDF数据集,并进行训练。
生成好的数据集已经上传到网盘,大家可以自行下载,链接见下方~
https://cloud.tsinghua.edu.cn/d/fc0f8f8a63974990a4a5/
密码:20220107