1、首先找到RandLA-NET的github地址
https://github.com/QingyongHu/RandLA-Net
2、查看RandLA-Net安装文档发现,作者测试使用的系统为Ubuntu 16.04,环境配置为Python 3.5+Tensorflow 1.11+CUDA 9.0+cuDNN 7.4.1,于是本人决定也使用Python 3.5+Tensorflow 1.11+CUDA 9.0+cuDNN 7.4.1的环境,但是在下载CUDA 9.0时发现其并不适用于Ubuntu 18.04。
3、总不至于重装系统吧,所以决定安装支持Ubuntu 18.04的环境
如图所示,Python,Tensorflow,CUDA和cuDNN的版本有严格的对应关系,为了和作者测试环境尽量相近,继续使用Tensorflow v1,于是选择了Python 3.5+Tensorflow 1.14+CUDA 10.0+cuDNN 7.4.1。
4、然后开始安装Tensorflow,CUDA和cuDNN。
4.1 CUDA安装
CUDA下载地址
根据官方安装指南开始安装,如图所示,下载安装包,然后执行命令
Run `sudo sh cuda_10.0.130_410.48_linux.run`
在下面选择安装选项时,我都点了y,结果把显卡驱动的cuda版本也修改了,导致重启电脑,发现显卡驱动没了,原来是因为Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?要选择n,这样就不会覆盖显卡驱动的cuda。
Do you accept the previously read EULA? # ctrl+c 可加快速度
accept/decline/quit: accept
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?
(y)es/(n)o/(q)uit: n
Install the CUDA 10.0 Toolkit?
(y)es/(n)o/(q)uit: y
Enter Toolkit Location
[ default is /usr/local/cuda-10.0 ]:
Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: y
Install the CUDA 10.0 Samples?
(y)es/(n)o/(q)uit: y
Enter CUDA Samples Location
[ default is /home/user ]:
于是打算卸载cuda后,重装显卡驱动和cuda。根据https://blog.csdn.net/baidu_37366055/article/details/124299588卸载重启发现电脑黑屏,于是开始解决黑屏问题,见我另外一篇博客https://editor.csdn.net/md/?articleId=127470370。
解决了黑屏问题后,显卡驱动也重新安装了,然后继续安装cuda,这一次Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?选择n。安装结果如下:
- Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-10.0
Samples: Installed in /home/***, but missing recommended libraries
Please make sure that
- PATH includes /usr/local/cuda-10.0/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-10.0/lib64, or, add /usr/local/cuda-10.0/lib64 to /etc/ld.so.conf and run ldconfig as root
To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-10.0/bin
然后添加环境变量
sudo gedit ~/.bashrc
export PATH="/usr/local/cuda-10.0/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-10.0/lib64/:$LD_LIBRARY_PATH"
source ~/.bashrc
最后测试是否安装成功
cd ~/NVIDIA_CUDA-10.0_Samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
显示pass即成功
4.2 然后开始安装cuDNN
cuDNN下载地址
https://blog.csdn.net/fulin9452/article/details/111560913提到了两种安装方式,并且推介ubuntu用户使用deb包,但是我按这种方式安装后发现,测试是失败的。于是改用tgz方式安装。
减压文件
sudo tar -xvf cudnn-10.0-linux-x64-v7.6.5.32.tgz
复制文件
sudo cp cuda/include/* /usr/local/cuda-10.0/include/
sudo cp cuda/lib64/* /usr/local/cuda-10.0/lib64/
最后测试是否安装成功
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2 #查看cudnn的版本
5、然后开始安装Tensorflow
根据网上教程,用conda创建Tensorflow虚拟环境,然后在里面安装了Tensorflow,结果发现在后来创建的randlanet虚拟环境中无法使用,才明白不同虚拟环境之间环境不能互相使用,但是cuda和cudnn是在本地安装的,后来成功的测试表明,虚拟环境可以使用本地的环境。所以Tensorflow安装在本地或者randlanet虚拟环境都可以,弄明白虚拟环境后,本人将Tensorflow安装在了randlanet虚拟环境虚拟环境,当然需要第6步执行完才能安装,安装命令如下。
pip install tensorflow-gpu==1.14.0
测试安装是否成功
在虚拟环境下执行
python
import tensorflow as tf
tf.__version__
tf.test.is_gpu_available()
结果在import tensorflow as tf会报protobuf的版本错误,于是更新protobuf版本
pip install --upgrade "protobuf==3.20.*"
如果能输出版本且不报错,则安装成功
6、接下来终于可以开始安装RandLA-NET
根据官方安装指南,在本地RandLA-NET路径下执行以下四步
conda create -n randlanet python=3.5#创建名为randlanet的虚拟环境,python编译器版本3.5
source activate randlanet#激活虚拟环境,以后只要跑该虚拟环境下的程序,都需要先激活
pip install -r helper_requirements.txt#安装依赖
sh compile_op.sh#编译c++程序
7、然后就开始数据准备
将准备好的数据,按kitti的格式放在路径"/home/用户名/catkin_ws/RandLA-Net/data/semantic_kitti/dataset/sequences"下,文件data_prepare_semantickitti.py中数据读取地址为绝对路径,如图所示,
然后执行python utils/data_prepare_semantickitti.py,数据准备工作比较漫长…
8、然后就可以开始心心念念的训练工作了
执行训练脚本
python main_SemanticKITTI.py --mode train --gpu 0
结果还有不少问题等着我…
9、于是更改python为3.7,使用Python 3.7+Tensorflow 1.14+CUDA 10.0+cuDNN 7.4.1重新开始训练
此时报错open3d无法使用,在挣扎了一番后,灵机一动,既然用不了,作为显示工具,不用不就可以了,注释掉后,顺利解决。然而依然存在一些问题,具体问题忘了,但是查资料后,发现是现在的配置必须使用tf2.0以上才行。
10、于是为了不重装cuda和cudnn,选择了Python 3.7+Tensorflow 2.0+CUDA 10.0+cuDNN 7.4.1。
从tf 1.0换成tf 2.0就是一个大的变化,果然代码报了很多语法错误,经过一番尝试后,只需要稍微做一些修改,就可以解决所有版本切换问题。将
import tensorflow as tf
换成
import tensorflow.compat.v1 as tf
在RandLANET.py的import tensorflow.compat.v1 as tf后加
tf.disable_v2_behavior()
然后还有一个nearest_neighbors的问题,原来这是c++编译的生成文件,刚开始把我吓坏了,这可咋解决,python咋跑出c++来了,经过一番斗争后,发现报错原因是因为在不同版本下编译生成了多个动态库so文件,解决方法是把这些动态库和所有编译生成文件build,lib删除,再重新编译,即可解决。终于进入到正向传播、反向传播训练阶段,没错,并没有如我所愿开始正常训练,cuda报错了,查资料发现30系显卡只支持11以上的cuda。
11、最终重装Python3.7+Tensorflow2.5+CUDA 11.2+cuDNN8.1
终于进入了正常的训练过程,接下来就是漫长的两天训练时间…
12、用tensorboard可视化
RandLA-NET把可视化文件保存在了train_log里,在RandLA-NET路径下输入以下命令
tensorboard --logdir=train_log
将图中输出网址http://localhost:6006在网页中打开即可
13、batch_size,batch,spoch,steps含义
14、完成训练后,开始测试
sh jobs_test_semantickitti.sh
测试会在test文件夹下生成测试集的每一帧预测结果。测试过程并不能同时显示实时分割点云,只能最后利用预测的标签和原始点云进行可视化。
15、离线可视化
但是发现作者可视化用的就是前面我注释掉的open3d,没办法只能重新想办法解决open3d的问题。显示用的是helper_tool.py,
先删除之前安装的
pip uninstall open3d-python
然后用以下命令安装
conda install -c open3d-admin open3d
安装完成后,再根据提示解决一些不同版本语法问题即可。
但是作者并没有提供显示连续多帧预测点云的工具,我通过翻阅资料,写了一个和作者动图一样的可视化效果,代码如下
from helper_tool import Plot
from os.path import join, dirname, abspath
from helper_tool import DataProcessing as DP
import numpy as np
import os
import pickle
import yaml
import open3d as open3d
import time
def get_file_list_test(dataset_path):
seq_list = np.sort(os.listdir(dataset_path))
test_file_list = []
for seq_id in seq_list:
seq_path = join(dataset_path, seq_id)
pc_path = join(seq_path, 'velodyne')
if int(seq_id) >= 11:
for f in np.sort(os.listdir(pc_path)):
test_file_list.append([join(pc_path, f)])
# break
test_file_list = np.concatenate(test_file_list, axis=0)
return test_file_list
def get_test_result_file_list(dataset_path):
seq_list = np.sort(os.listdir(dataset_path))
test_result_file_list = []
for seq_id in seq_list:
seq_path = join(dataset_path, seq_id)
pred_path = join(seq_path, 'predictions')
for f in np.sort(os.listdir(pred_path)):
test_result_file_list.append([join(pred_path, f)])
# break
test_file_list = np.concatenate(test_result_file_list, axis=0)
return test_file_list
if __name__ == '__main__':
dataset_path = '/home/mdj/catkin_ws/RandLA-Net/data/semantic_kitti/dataset/sequences'
predict_path = '/home/mdj/catkin_ws/RandLA-Net/test/sequences'
test_list = get_file_list_test(dataset_path)
test_label_list = get_test_result_file_list(predict_path)
BASE_DIR = dirname(abspath(__file__))
# remap_lut #
data_config = join(BASE_DIR, 'utils', 'semantic-kitti.yaml')
DATA = yaml.safe_load(open(data_config, 'r'))
remap_dict = DATA["learning_map"]
max_key = max(remap_dict.keys())
remap_lut = np.zeros((max_key + 100), dtype=np.int32)
remap_lut[list(remap_dict.keys())] = list(remap_dict.values())
# remap_lut #
plot_colors = Plot.random_colors(21, seed=2)
vis = open3d.visualization.Visualizer()
vis.create_window()
for i in range(len(test_list)):
time.sleep(0.01)
pc_path = test_list[i]
labels_path = test_label_list[i]
points = DP.load_pc_kitti(pc_path)
# 用深蓝色画初始点云 #
# rpoints = np.zeros((points.shape[0],6),dtype=np.int)
# rpoints[:,0:3] = points
# rpoints[:,5] = 1
# Plot.draw_pc(rpoints)
# print("888888888888888888")
# 画对应的预测点云 #
labels = DP.load_label_kitti(labels_path, remap_lut)
Plot.draw_pc_sem_ins(points, labels, vis, plot_colors)
至此就可以完美可视化连续多帧点云了,效果如下:
16、ros-randlanet安装测试
因为ros-randlanet可以继续使用前面建好的虚拟环境,所以将ros-randlanet在randlanet虚拟环境中运行。
首先需要将ros_main.py中的解释器路径改为虚拟环境中Python解释器的路径。
然后需要安装pytorch,因为pytorch和cuda有严格的对应关系,且官网没有cuda11.2对应的pytorch版本,这里https://blog.csdn.net/didadifish/article/details/127487635提供了解决办法,所以我下载安装了这个
成功!!!
最后启动launch,没问题了.