深度学习-ubuntu18.04+RTX3080下安装RandLA-NET踩坑全纪录

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

结果还有不少问题等着我…

  • 首先数据读取路径需要修改
    在这里插入图片描述
  • python3.5版本已经停止使用

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含义

  • batch和batch_size
    假设我们有2000个数据样本,设batch_size = 100,则 batch = 2000/100 = 20.
    注:
    batch_size 一般取32,64,128等2的N次方,batch的计算也是向上取整。
  • step、iteration、epoch
    step和iteration:两者的意思是完全一样,两者都是指参数更新的次数。
    对于epoch: 全部样本训练完算一个epoch.
    样本共2000个,batch_size=100, 所以batch=20。
    epoch=1表示2000个样本全部参与训练一次,那么此时,step=iteration=batch=20,因为step和iteration表示的是参数的次数,而深度学习都是在运行完一个batch_size的数据之后才会进行反向传播,才会更新参数。
    所以,如果epoch=2, 可以推导出step=iteration=20*2=40。
    参考:https://blog.csdn.net/qq_41915623/article/details/124847431

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,会提示如图所示错误
在这里插入图片描述发现是ros_main.py有问题,如图所示修改解释器路经
在这里插入图片描述

至此,launch文件可以正常启动了.

猜你喜欢

转载自blog.csdn.net/weixin_40826634/article/details/127493809