论文复现:“DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation“

2 篇文章 4 订阅
1 篇文章 0 订阅

一、 数据集生成

(一)环境配置说明

这篇博文主要讲解“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和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/

(三)安装CLI11

从这里开始,要安装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的文件夹。

(四)安装Eigen3

这个库不是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

如果没有报错则说明安装好了。

(五)安装Pangolin

在安装这个之前首先需要安装一些依赖库。在命令行中运行如下语句:

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

没有再报错,安装完成。

(六)安装nanoflann

这个库文件跟CLI11的安装方法类似,也不太会碰到多余的问题。首先从github上将这个目录克隆下来:

git clone https://github.com/jlblancoc/nanoflann

然后编译安装:

cd nanoflann
mkdir build
cd build
cmake ..
make
sudo make install

如果过程中没有报错则说明安装好了。

(七)编译SDF

在上面四个库都安装完成后,就可以安装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目录下产生两个可执行文件,分别是PreprocessMeshSampleVisibleMeshSurface,如果有这两个文件则说明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数据浅析

生成的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

  • 44
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 100
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 100
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值