DeepSDF(DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation)是三维表达领域一篇重要的论文,提出了使用神经网络来拟合空间点到三维体表面的公式,从而实现三维体的表达。接下来,我们将通过一系列博客深入分析这篇文章,以期对该方法有更深刻的理解。

由于DeepSDF没有直接给出数据集,只给了生成数据集的代码,加之时日久远,代码运行起来有版本相关的一些问题。因此这一系列文章的第一篇博客,我们主要讲述如何成果运行官方的代码从而获得DeepSDF的数据集,以供神经网络进行训练。之前折腾过复现的老哥应该有同感,这部分可以说是整篇文章最恶心的部分。。。

PS: 这个工作不是必须的,网上有雷锋已经跑了整个流程然后把数据集打包发了出来,如果只是想训练一下可以直接找到文章最后的链接下载。另外,有专门用于生成DeepSDF数据集的python包,叫做mesh-to-sdf,也可以实现生成DeepSDF数据集的功能。自己跑数据集的生成,一方面是为了确保和官方使用的数据集一致(事实上因为数据集的生成代码中有随机表面采样,我们完全无法保证和官方使用的数据一样,艹)。另一方面,则是为了看看官方提供的数据集有没有什么毛病(本人看了官方的代码之后的确发现了一些小问题,下一篇博客再说)。

下面直接进入正题,本文参考了官方github中Issues的相关描述,在Ubuntu24.04中将环境配置了起来并进行数据集生成。(24.04需要将GCC切换为12。如果是老一点的Ubuntu版本,即默认GCC12以下,包括12的版本,则不需要干这件事。

数据集生成

(1)ShapeNet数据集下载

DeepSDF使用的数据集由ShapeNet数据集处理而来,因此第一步要先下载ShapeNet数据集。

下载地址

ShapeNet/ShapeNetCore · Datasets at Hugging Face

这个网站需要梯子才上得去,下载之前需要先申请,我申请两天后拿到权限就可以下载。

下载细节

可以人工一个个点击下载,那样会直接用浏览器的下载器下载。如果只想复现DeepSDF,可以只下载"02691156",“03001627”,“03636649”,“04256520”,"04379243"五个数据包,因此点五下也不是很麻烦,而且还能节省一点空间。

请添加图片描述

如果想下全部数据,则可以使用git clone来下载,不过需要设置代理:

git config --global http.proxy 'http://127.0.0.1:VPN端口号'
git config --global https.proxy 'http://127.0.0.1:VPN端口号'
git config --global http.proxy 'socks5://127.0.0.1:VPN端口号'
git config --global https.proxy 'socks5://127.0.0.1:VPN端口号'

然后在Hugging Face添加SSH & GPG Keys,最后使用如下代码下载即可:

git clone git@hf.co:datasets/ShapeNet/ShapeNetCore

下载下来的数据长下面这个样子:
请添加图片描述

(2)安装所需库

数据集的转换主要用到CLI11、Eigen3、Pangolin和nanoflann四个库,需要挨个编译安装。

CLI11安装

这个库用于处理控制台给到的命令,非常方便,推荐写控制台程序的老哥都装上。

git clone https://github.com/CLIUtils/CLI11 --recursive
mkdir build && cd build
cmake ..
make
sudo make install

Eigen3安装

这个库用于数学矩阵计算,数据集处理中计算三角形的面积,法线已经调整OpenGL的相机位置等都用到了这个库。查了一下,Eigen3最新版本是3.4.0,因此装了这个。

wget https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz
tar xvf eigen-3.4.0.tar.gz
cd eigen-3.4.0
mkdir build && cd build
cmake ..
make
sudo make install

Pangolin安装

这个是OpenGL的封装库,大部分复现的同学主要就是卡在这个库上面,从代码上看感觉完全没必要用这个库,论文的作者可能是自己用这个库用熟了吧。。。

使用最新版本的Pangolin会遇到各种问题(修改对应的源码也能解决,就是麻烦一点),需要改成v0.6版本。然而,ubuntu24.04的默认gcc版本是13,编译v0.6版本会有问题,需要改成12,操作如下:

# 卸载当前版本的g++和gcc
sudo apt remove g++
sudo apt remove gcc
sudo apt install g++-12 # 这将自动安装gcc
# 将gcc和g++的默认版本指定为当前的12版本
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 20
# 注:最后一个数字20是优先级,除非存在多个gcc g++版本,这个数字无需更改

随后下载代码并切换到v0.6版本:

git clone https://github.com/stevenlovegrove/Pangolin.git --recursive
cd Pangolin
git checkout v0.6

因为新的ffmpeg改了很多命名,这个项目又用不到,所以最方便的方法是把它的编译选项关掉(否则需要自己去修改相关的代码,两眼一黑。。。)。

mkdir build && cd build
cmake -DBUILD_PANGOLIN_FFMPEG=OFF .. #因为版本问题,最近的ffmpeg会存在找不到对象的问题,反正也不需要用到,直接关了ffmpeg
cmake --build .
sudo make install

遇见问题

1. python版本问题
error: invalid use of incomplete type ‘PyFrameObject’ {aka ‘struct _frame’}

这个问题和python版本有关,可以通过在虚拟环境中安装3.10来解决。操作之前先把build文件夹清空。

conda create -n DeepSDFNew python=3.10
conda activate DeepSDFNew
cmake -DBUILD_PANGOLIN_FFMPEG=OFF ..
cmake --build .
sudo make install
2. 源码缺失问题
error: ‘numeric_limits’ is not a member of ‘std’

找到"include/pangolin/gl/colour.h"这个文件,在include部分加上#include 。随后再编译即可。这个问题也可以先解决,不然等到报错才整比较麻烦。

nanoflann安装

这个库用于构建不同拓扑。在这份代码中,用这个库构建KD-Tree,以快速搜索空间点附近的表面点,从而计算空间点的SDF值,即与三位体表面的距离。

git clone https://github.com/jlblancoc/nanoflann
cd nanoflann
mkdir build && cd build
cmake ..
make
sudo make install

cd /usr/local/include
sudo mkdir nanoflann
sudo mv nanoflann.hpp nanoflann

(3)DeepSDF代码编译运行

完成上面的工作,接下来就是DeepSDF的代码编译运行了。

git clone https://github.com/facebookresearch/DeepSDF.git
cd DeepSDF/third-party
git clone https://github.com/rogersce/cnpy.git

定位到DeepSDF的ShaderProgram.cpp文件中,把in int gl_PrimitiveID这行注释掉。这句话如果不注释掉虽然编译不会出错,然而等会运行程序的时候着色器会报错。

mkdir build && cd build
cmake -DCMAKE_CXX_STANDARD=17 ..
make
sudo make install

如果没报错应该就OK了。在DeepSDF/bin目录下产生两个可执行文件,分别是PreprocessMeshSampleVisibleMeshSurface,如果有这两个文件则说明SDF的环境都配置成功了。

然后配置下python环境:

conda create -n DeepSDFdata python=3.6
conda activate DeepSDFdata
conda install pytorch==1.1.0 torchvision==0.3.0 cudatoolkit=10.0 -c pytorch
pip install plyfile
pip install scikit-image
pip install trimesh

直接运行preprocess_data.py即可,注意将"[…]/ShapeNetCore.v2/"改为ShapeNet数据集的真实路径。

mkdir data
sudo ldconfig
python preprocess_data.py --data_dir data --source [...]/ShapeNetCore.v2/ --name ShapeNetV2 --split examples/splits/sv2_sofas_train.json --skip

运行过后代码会在data文件夹下生成文件,生成速度大概一个10s左右的样子(AMD 5900x+RTX4090)。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐