源码链接:liruihui/Dis-PU: Point Cloud Upsampling via Disentangled Refinement, CVPR, 2021 (github.com)
一、安装CUDA和cudnn
Dis-PU用的cuda版本是10.2
- 下载cuda需要注册,注册之后可以直接下载。
- 安装路径为/home/lyl/cuda/cuda-10.2
- 注意安装过程中不要勾选安装驱动,否则会安装失败。
- 可以通过nvcc -V查看安装的cuda版本,目前没有找到可行的查看cudnn版本的指令,但是依照教程安装不会有问题。
二、安装TensorFlow
首先激活虚拟环境(这步可根据个人情况省略)
我安装的是GPU的版本(之前先装了cpu版本但是报错了,因为服务器是用gpu跑的)
作者github上写的是1.11.1版本,但是我去查了根本没有这个版本,于是装了1.13.1。
conda install tensorflow-gpu==1.13.1
注:用conda安装会顺便装一些别的依赖包,用pip就不会,所以推荐conda。
三、配置编译环境
1. 修改tf_ops/compile_ops.sh
由于是在非root用户下安装的cuda,所以要更改编译文件中的cuda路径。
#/bin/bash
TF_CFLAGS=$(python -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_compile_flags()))')
TF_LFLAGS=$(python -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_link_flags()))')
CUDA_ROOT=/home/lyl/cuda/cuda-10.2 #改这个就可以
g++ -std=c++11 -shared ./interpolation/tf_interpolate.cpp -o ./interpolation/tf_interpolate_so.so -I $CUDA_ROOT/include -lcudart -L $CUDA_ROOT/lib64/ -fPIC ${TF_CFLAGS} ${TF_LFLAGS} -O2
$CUDA_ROOT/bin/nvcc ./grouping/tf_grouping_g.cu -o ./grouping/tf_grouping_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC
g++ -std=c++11 -shared ./grouping/tf_grouping.cpp ./grouping/tf_grouping_g.cu.o -o ./grouping/tf_grouping_so.so -I $CUDA_ROOT/include -L $CUDA_ROOT/lib64/ -fPIC ${TF_CFLAGS} ${TF_LFLAGS} -O2
$CUDA_ROOT/bin/nvcc ./sampling/tf_sampling_g.cu -o ./sampling/tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC
g++ -std=c++11 -shared ./sampling/tf_sampling.cpp ./sampling/tf_sampling_g.cu.o -o ./sampling/tf_sampling_so.so -I $CUDA_ROOT/include -L $CUDA_ROOT/lib64/ -fPIC ${TF_CFLAGS} ${TF_LFLAGS} -O2
$CUDA_ROOT/bin/nvcc ./approxmatch/tf_approxmatch_g.cu -o ./approxmatch/tf_approxmatch_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC
g++ -std=c++11 -shared ./approxmatch/tf_approxmatch.cpp ./approxmatch/tf_approxmatch_g.cu.o -o ./approxmatch/tf_approxmatch_so.so -I $CUDA_ROOT/include -L $CUDA_ROOT/lib64/ -fPIC ${TF_CFLAGS} ${TF_LFLAGS} -O2
$CUDA_ROOT/bin/nvcc ./nn_distance/tf_nndistance_g.cu -o ./nn_distance/tf_nndistance_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC
g++ -std=c++11 -shared ./nn_distance/tf_nndistance.cpp ./nn_distance/tf_nndistance_g.cu.o -o ./nn_distance/tf_nndistance_so.so -I $CUDA_ROOT/include -L $CUDA_ROOT/lib64/ -fPIC ${TF_CFLAGS} ${TF_LFLAGS} -O2
cd ../
2. 修改tf_ops下的其他文件夹的编译文件
主要修改:
① cuda的安装位置
② TensorFlow的安装位置(因为我用了虚拟环境)
贴一下修改后的文件。
tf_sampling_compile.sh
#!/usr/bin/env bash
#/bin/bash
/home/lyl/cuda//cuda-10.2/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC
g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow/include -I /home/lyl/cuda/cuda-10.2/include -I /home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow/include/external/nsync/public -lcudart -L /home/lyl/cuda/cuda-10.2/lib64/ -L/home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=1
tf_grouping_compile.sh
#!/usr/bin/env bash
#/bin/bash
/home/lyl/cuda/cuda-10.2/bin/nvcc tf_grouping_g.cu -o tf_grouping_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC
g++ -std=c++11 tf_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_so.so -shared -fPIC -I /home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow/include -I /home/lyl/cuda/cuda-10.2/include -I /home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow/include/external/nsync/public -lcudart -L/home/lyl/cuda/cuda-10.2/lib64/ -L/home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=1
tf_approxmatch_compile.sh
#!/usr/bin/env bash
#/bin/bash
# TF1.4
/home/lyl/cuda/cuda-10.2/bin/nvcc tf_approxmatch_g.cu -o tf_approxmatch_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC
g++ -std=c++11 tf_approxmatch.cpp tf_approxmatch_g.cu.o -o tf_approxmatch_so.so -shared -fPIC -I /home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow/include -I /home/lyl/cuda/cuda-10.2/include -I /home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow/include/external/nsync/public -lcudart -L /home/lyl/cuda/cuda-10.2/lib64/ -L/home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=1
tf_interpolate_compile.sh
#!/usr/bin/env bash
g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_so.so -shared -fPIC -I /home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow/include -I /home/lyl/cuda/cuda-10.2/include -I /home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow/include/external/nsync/public -lcudart -L /home/lyl/cuda/cuda-10.2/lib64/ -L/home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=1
tf_nndistance_compile.sh
#!/usr/bin/env bash
/home/lyl/cuda/cuda-10.2/bin/nvcc tf_nndistance_g.cu -o tf_nndistance_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC
g++ -std=c++11 tf_nndistance.cpp tf_nndistance_g.cu.o -o tf_nndistance_so.so -shared -fPIC -I /home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow/include -I /home/lyl/cuda/cuda-10.2/include -I /home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow/include/external/nsync/public -lcudart -L /home/lyl/cuda/cuda-10.2/lib64/ -L/home/lyl/.conda/envs/dispu/lib/python3.6/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=1
注:如果不改第③个,报错信息是:TensorFlow undefined symbol: __cudaPushCallConfiguration
3. 运行修改后的编译文件
运行:tf_sampling_compile.sh、tf_grouping_compile.sh、tf_approxmatch_compile.sh、tf_interpolate_compile.sh、tf_nndistance_compile.sh。例如:
sh tf_nndistance_compile.sh
运行Dis-PU文件夹下的compile_op.sh
sh compile_op.sh
三、训练
编译完成后执行训练操作。
首先从 Google Drive 下载 HDF5 格式的训练补丁,并将其放入文件夹 data 中。
PUGAN_poisson_256_poisson_1024.h5 - Google 云端硬盘
执行训练语句
python dis-pu.py --phase train
注:执行训练语句时可能会出现缺少包的情况,根据报错pip install就好了。
四、测试
首先从 Google Drive 下载预训练模型,将其解压缩并放入文件夹“model”中。
执行测试语句:
python dis-pu.py --phase test
五、评估
1. P2F
安装CGAL,教程:Linux(Ubuntu)安装CGAL(非root)_Yilien10的博客-CSDN博客
cd evaluation_code
cmake .
make
./evaluation fandisk.off fandisk.xyz
./evaluation Icosahedron.off Icosahedron.xyz
可以得到P2F的评估数据。
2. CD HD
evaluate.py。
把这一行的注释取消掉:
parser.add_argument("--save_path", type=str, required=True, help="path to save the result")
把预测数据和地面真值放到对应的文件夹下,注意要让文件名保持完全一致。
运行evaluate.py:
python evaluate.py --pred /home/lyl/pu/Dis-PU/data/test/output/ --gt /home/lyl/pu/Dis-PU/data/test/gt/ --save_path /home/lyl/pu/Dis-PU/data/eval/