该项目的github原始地址:https://github.com/charlesq34/pointnet2
1.环境配置
1.1 环境展示
官方在ubuntu14.04上进行了测试,所用环境为:
tensorflow-gpu1.2
python2.7
我所使用的设备为2080上的ubuntu18.04,所用的环境为:
anaconda3
tensorflow-gpu 1.8.0
python 3.6
cuda 9.0
cudnn7.6
gcc 5.5
conda list如下:
接下来配置上述环境,并编译tensorflow(编译过程遇到的问题比较多)
1.2 环境配置
创建虚拟环境:conda creat -n pointnet++ python=3.6
启动环境:conda activate pointnet++
安装:tensorflow-gpu:pip install tensorflow-gpu==1.8.0
查看是否安装成功:python -c 'import tensorflow as tf; print(tf.__version__)'
(安装成功:输出1.8.0)
其余环境可以在运行程序报错后依次pip安装
安装与tensorflow-gpu1.8对应的cuda和cudnn,这里需要cuda9.0,cudnn7.6,安装过程参看:ubuntu18.04下cuda9.0-cudnn7.6安装与多版本cuda共存及切换
1.3 下载源码及训练数据集
源码地址:https://github.com/charlesq34/pointnet2
修改代码:由于python2与python3的语法上的不同,需要将代码中的xrange替换为range;print后面的加括号
下载数据集:下载地址
将下载好的数据放置到pointnet2-master/data/目录下并解压,如下tree:
将代码中下载数据集的部分注释掉:在train.py 和train_multi_gpu.py中注释掉第25行的import modelnet_ht_dataset
1.4 编译tf_ops
官网中的指导:
终端输入:
python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())'
输出:/home/gzz/anaconda3/envs/pointnet++/lib/python3.6/site-packages/tensorflow/include
python -c 'import tensorflow as tf; print(tf.sysconfig.get_lib())'
输出:/home/gzz/anaconda3/envs/pointnet++/lib/python3.6/site-packages/tensorflow
cd 到tf_ops文件夹,将3d_interpolation、grouping、sampling中的.sh文件进行修改(以tf_sampling_compile.sh为例):
将下图蓝色部分改为自己的cuda版本,红色部分为上面的第一个输出,灰黑色部分为上面的第二个输出+/
#/bin/bash
/usr/local/cuda-9.0/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC
# TF1.2
#g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0
# TF1.4
g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /home/gzz/anaconda3/envs/pointnet++/lib/python3.6/site-packages/tensorflow/include -I /usr/local/cuda-9.0/include -I /home/gzz/anaconda3/envs/pointnet++/lib/python3.6/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-9.0/lib64/ -L /home/gzz/anaconda3/envs/pointnet++/lib/python3.6/site-packages/tensorflow/ -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0
三个.sh文件操作一样。
这里编译可能会遇到一些问题,我的是按照上述改成功的。
如果失败可以将最后面的-D_GLIBCXX_USE_CXX11_ABI=0
改为-D_GLIBCXX_USE_CXX11_ABI=1
,或者注释掉#-D_GLIBCXX_USE_CXX11_ABI=0
(网上教程gcc版本高于4.0要改为1,这里一开始我是按照网上教程上来直接就改了,但是后面运行train.py文件报错,后面发现0才适合我,如果这里遇到编译失败或者编译成功后train.py报错的话可以把这几种都试试)我的报错如下:
tensorflow.python.framework.errors_impl.NotFoundError: /home/wu/pointnet2-master/tf_ops/sampling/tf_sampling_so.so: undefined symbol: _ZN10tensorflow8internal21CheckOpMessageBuilder9NewStringB5cxx11Ev
关于该问题可以参看:
官网issues48
2. 训练
python train.py
报错:
FileNotFoundError: [Errno 2] No such file or directory: ‘/home/wu/pointnet2-master/data/modelnet40_normal_resampled/shape_names.txt’
将data/modelnet40_normal_resampled/下的modelnet40_shape_names.txt文件改名为shape_names.txt即可
训练数据将保存在log文件夹中的log_train.txt中:
通过:tensorboard --logdir=/home/wu/pointnet2-master/log
可以可视化训练过程,其中–logdir后面是你自己的log文件夹的位置
训练完以后进行验证:
python evaluate.py --num_votes 12