0 前言
本机:RTX3070,cuda-11.0
官方github:https://github.com/PRBonn/lidar-bonnetal
论文:RangeNet++: Fast and Accurate LiDAR Semantic Segmentation



0.1 KITTI语义分割数据集—SemanticKITTI
链接:SemanticKITTI - A Dataset for LiDAR-based Semantic Scene Understanding
进入上述页面后,点击download



1 安装
1.1 python环境

这里选择anaconda创建python=3.6的环境:rangenetpy36
下载代码:

git clone https://github.com/PRBonn/lidar-bonnetal.git
cd lidar-bonnetal

修改lidar-bonnetal/requirements.txt 和 /lidar-bonnetal/train/requirements.txt,均将numpy版本修改为4.15.5,如下:



reqiurements.txt为:

# first apt install python3-tk
#numpy==1.14.0  #hxz
numpy==1.14.5  #hxz
torchvision==0.2.2.post3
matplotlib==2.2.3
tensorflow==1.13.1
scipy==0.19.1
torch==1.1.0
vispy==0.5.3
opencv_python==4.1.0.25
opencv_contrib_python==4.1.0.25
Pillow==6.1.0
PyYAML==5.1.1

numpy版本报错—————————————————————————————————————
不修改的话,scipy、opencv-python可能无法安装

  ----------------------------------------
  Failed building wheel for scipy
  Running setup.py clean for scipy
  Complete output from command /home/meng/anaconda3/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-4faf_n37/scipy/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" clean --all:

  `setup.py clean` is not supported, use one of the following instead:

    - `git clean -xdf` (cleans all files)
    - `git clean -Xdf` (cleans all versioned files, doesn't touch
                        files that aren't checked into the git repo)

  Add `--force` to your command to use it anyway if you must (unsupported).


  ----------------------------------------
  Failed cleaning build dir for scipy
  Running setup.py bdist_wheel for vispy ... done
  Stored in directory: /home/meng/.cache/pip/wheels/78/4a/81/db541db6561a36f679953cc76037a743923e9862ab5516d227
  Running setup.py bdist_wheel for PyYAML ... done
  Stored in directory: /home/meng/.cache/pip/wheels/16/27/a1/775c62ddea7bfa62324fd1f65847ed31c55dadb6051481ba3f
Successfully built vispy PyYAML
Failed to build numpy scipy
opencv-python 4.1.0.25 has requirement numpy>=1.14.5, but you'll have numpy 1.14.0 which is incompatible.
opencv-contrib-python 4.1.0.25 has requirement numpy>=1.14.5, but you'll have numpy 1.14.0 which is incompatible. 


同时需要修改torch、torchvision的版本, 参考下面4.1的“报错与解决” ,选择适合电脑(cuda)版本的torch和torchvision版本 . 我这里修改两个requirements.txt 如下:(如果担心报错,此处可不修改,留到后面4.1部分再修改)

#numpy==1.14.0
numpy==1.14.5
scipy==0.19.1
#torch==1.1.0
tensorflow==1.13.1
vispy==0.5.3
#torchvision==0.2.2.post3
torch==1.7.1+cu110  #根据自己的电脑/cuda版本
torchvision==0.8.2+cu110  #根据自己的电脑/cuda版本
torchaudio==0.7.2 #根据自己的电脑/cuda版本
opencv_contrib_python==4.1.0.25
matplotlib==2.2.3
Pillow==6.1.0
PyYAML==5.1.1

然后安装dependency

pip install -r requirements.txt
cd train
pip install -r requirements.txt

1.2 安装pyqt
PyQt_是Qt v_的Python版本,功能强大复杂,提供QT Designer设计UI ;这里安装pyqt5即可。

pip install PyQt5
pip install pyqt5-tools

不安装的话,运行程序可视化时会报错,如下:

RuntimeError: Could not import any of the backends. You need to install any of ['PyQt4', 'PyQt5', 'PySide', 'Pyglet', 'Glfw', 'SDL2', 'wx', 'EGL', 'osmesa']. We recommend PyQt

2 配置kitti数据集目录

如下图所示,在/lidar-bonnetal/train/tasks/semantic/dataset/目录下有两个目录,其中kitti文件夹是github程序自带的kitti数据集配置文件,sequences文件夹是新建的文件夹,需要将下载的kitti数据下载到里面。
将0.1图中框选的数据下载下来,箭头所指的压缩包的数据需要使用



对于data_odometry_velodyne.zip,解压出下面的文件



对于data_odometry_labels.zip,解压出下面的文件。其中序号00-10里面有两个文件/文件夹,11-21有一个文件





并将每个序号(00~21)文件夹进行合并,并拷贝到/lidar-bonnetal/train/tasks/semantic/dataset/sequences,如下所示。其中00-10文件夹里面有三个文件/文件夹,数据集工作者进行了较多的标注工作,11-21有两个文件/文件夹,可以用作测试。







3 可视化kitti数据集
3.1 可视化kitti数据集数据

进入/lidar-bonnetal/train/tasks/semantic/目录

#进入python环境
#命令中00可以更换为其他序列
./visualize.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset -s 00

效果如下,可以使用键盘输入b—上一次扫描数据、n—下一次扫描数据、q—终止程序




3.2 可视化预测效果-no-knn
github参考命令为:

./visualize.py -d /path/to/dataset/ -p /path/to/predictions/ -s 00

下载官方github的预测数据(官方根据他们的模型预测出来的效果),这里下载了不带带knn后处理和带knn后处理的文件并解压。



任意放一个地方,这里是:




输入命令:

./visualize.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset/ -p /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/predictions_from_models/no_post_processing/darknet21 -s 00
#-d 数据集
#-p 对数据集进行的预测
#-s 选中数据集的序列

从下图可以看出,使用了预测集的labels;3.1可视化时使用的是真实标注的数据




从下面的点云分割图可以看出:地面被分割出来;但单从scan0看,分割效果貌似和3.1的标注效果差不多。

scan 0




其他scan



3.3 可视化预测效果-with-knn
在3.2中已经下载了用knn处理的数据,这里输入命令:

./visualize.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset/ -p /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/predictions_from_models/k-nn_processing/darknet21-knn -s 00


注意观察一些区域的边界部分,knn处理就是为了解决点云分割时边界点云类别label出错的情况。
一个知乎博主对knn的说明:



3.4 对比no-knn与with-knn——giao我找到了
下图左侧no-knn,右侧with-knn,我不能够直观看出。



放大看看:
no-knn的区域:



相应的with-knn则减少了这种分割错误:(左图消除,右图还有,右图可能不能够算的上是边界了。。。)



4 训练网络
训练脚本为:/lidar-bonnetal/train/tasks/semantic/train.py

4.1 从头开始训练网络
官方参考命令为:

./train.py -d /path/to/dataset -ac /config/arch/CHOICE.yaml -l /path/to/log


在这里新建一个log文件夹:



配置文件在这里:/lidar-bonnetal/train/tasks/semantic/config/arch



终端输入:(直接用了绝对路径,相对路径还没试)

./train.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset -ac /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/config/arch/darknet21.yaml -l /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/log


/lidar-bonnetal/train/tasks/semantic/config/arch/darknet21.yaml参数如下



报错与解决———————————————————————————————————————————
error: 出现报错,应该是pytorch版本不对

THCudaCheck FAIL file=/pytorch/aten/src/THC/THCGeneral.cpp line=383 error=8 : invalid device function

RuntimeError: cuDNN error: CUDNN_STATUS_EXECUTION_FAILED



在pytorch官方网站上找到合适版本的pytorch(本机为cuda-11.0)

Previous PyTorch Versions | PyTorch


# CUDA 11.0
pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html

训练过程如下,对gpu消耗比较高,比较耗时间


一个epoch训练结束,终端输出如下:达到了最好的平均iou. 终端输出可以看出,平均iou为0.237,距离1很远,还有部分class更接近0,应该是训练一次epoch,效果不好.

Best mean iou in training set so far, save model!
********************************************************************************
Validation set:
Time avg per batch 0.112
Loss avg 1.4078
Acc avg 0.672
IoU avg 0.237
IoU class 0 [unlabeled] = 0.000
IoU class 1 [car] = 0.699
IoU class 2 [bicycle] = 0.050
IoU class 3 [motorcycle] = 0.037
IoU class 4 [truck] = 0.011
IoU class 5 [other-vehicle] = 0.021
IoU class 6 [person] = 0.051
IoU class 7 [bicyclist] = 0.017
IoU class 8 [motorcyclist] = 0.005
IoU class 9 [road] = 0.817
IoU class 10 [parking] = 0.114
IoU class 11 [sidewalk] = 0.512
IoU class 12 [other-ground] = 0.001
IoU class 13 [building] = 0.496
IoU class 14 [fence] = 0.120
IoU class 15 [vegetation] = 0.488
IoU class 16 [trunk] = 0.246
IoU class 17 [terrain] = 0.601
IoU class 18 [pole] = 0.163
IoU class 19 [traffic-sign] = 0.047
Best mean iou in validation so far, save model!
********************************************************************************
********************************************************************************


训练文件保存目录如下:



将整个log文件夹进行压缩备份,名称为log+time .
之后在终端按下Ctrl+C结束训练,因为训练太耗时了,epoch0用时约70分钟,在/lidar-bonnetal/train/tasks/semantic/config/arch/darknet21.yaml设计为epoch=150。。。。

4.2 预训练模型训练网络
官方参考命令:

./train.py -d /path/to/dataset -ac /config/arch/CHOICE.yaml -dc /config/labels/CHOICE.yaml -l /path/to/log -p /path/to/pretrained

下载预训练模型从:https://github.com/PRBonn/lidar-bonnetal


在这里下载darknet21,链接为:http://www.ipb.uni-bonn.de/html/projects/bonnetal/lidar/semantic/models/darknet21.tar.gz
任意新建一个目录,存放预训练模型:




对比上面这张图和4.1的最后一张图,发现4.1仅仅训练一个epoch就结束不能够得到有效的模型文件。
这里结合文件目录,输入命令为:

./train.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset -ac /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/config/arch/darknet21.yaml -dc /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/config/labels/semantic-kitti.yaml -l /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/log -p /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/pre_trained_model/darknet21
#-d dataset
#-ac 模型结构配置文件
#-dc kitti数据集labels配置文件
#-l log文件夹地址
#-p 预训练模型的地址

可以进行训练,和4.1同样训练比较耗时,一个epoch大概70分钟。
但由于从预训练模型开始训练:
IoU avg=0.357>4.1的0.237
Acc avg=0.834>4.1的0.627
Loss avg=0.9446‹4.1的1.4078

********************************************************************************
Validation set:
Time avg per batch 0.112
Loss avg 0.9446
Acc avg 0.834
IoU avg 0.357
IoU class 0 [unlabeled] = 0.000
IoU class 1 [car] = 0.828
IoU class 2 [bicycle] = 0.054
IoU class 3 [motorcycle] = 0.125
IoU class 4 [truck] = 0.059
IoU class 5 [other-vehicle] = 0.076
IoU class 6 [person] = 0.204
IoU class 7 [bicyclist] = 0.137
IoU class 8 [motorcyclist] = 0.000
IoU class 9 [road] = 0.909
IoU class 10 [parking] = 0.378
IoU class 11 [sidewalk] = 0.755
IoU class 12 [other-ground] = 0.002
IoU class 13 [building] = 0.734
IoU class 14 [fence] = 0.351
IoU class 15 [vegetation] = 0.723
IoU class 16 [trunk] = 0.271
IoU class 17 [terrain] = 0.738
IoU class 18 [pole] = 0.284
IoU class 19 [traffic-sign] = 0.148
Best mean iou in validation so far, save model!
********************************************************************************
********************************************************************************


一个epoch结束得到的中间文件如下(不是有效模型文件)



4.3 从预训练模型训练网络—修改epoch为1



注意空格部分不要用tab键,可以用空格键,使用tab键会被程序识别出错误:
found character ‘\t’ that cannot start any token

Opening arch config file /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/config/arch/darknet21.yaml
while scanning for the next token
found character '\t' that cannot start any token
  in "/home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/config/arch/darknet21.yaml", line 6, column 16
Error opening arch yaml file.

结合文件目录,输入命令为:

./train.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset -ac /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/config/arch/darknet21.yaml -dc /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/config/labels/semantic-kitti.yaml -l /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/log -p /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/pre_trained_model/darknet21
#-d dataset
#-ac 模型结构配置文件
#-dc kitti数据集labels配置文件
#-l log文件夹地址
#-p 预训练模型的地址

一个epoch训练完,训练结束



IoU avg=0.343‹4.2的0.357
Acc avg=0.7883‹4.2的0.834
Loss avg=0.93013‹4.2的0.9446
交并比IoU和损失函数Loss相差不大;准确度acc降低的比较明显,但不应该是训练epoch设为1的缘故啊(不清楚),也可能是epoch设为1的缘故

4.4 从预训练模型训练网络—在darknet21.yaml中使用knn
在4.3的基础上 (和4.3一样,将epoch设为1);同时修改/lidar-bonnetal/train/tasks/semantic/config/arch/darknet21.yaml文件,使用knn



结合文件目录,输入命令为:

./train.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset -ac /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/config/arch/darknet21.yaml -dc /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/config/labels/semantic-kitti.yaml -l /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/log -p /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/pre_trained_model/darknet21

一个epoch训练完,训练结束:

IoU avg=0.289‹4.3的0.343
Acc avg=0.693‹4.3的0.788
Loss avg=0.9799›4.3的0.9301
感觉是在说明加入点云后处理post_processing使训练效果变差?

4.5 从预训练模型训练网络—在arch_cfg.yaml中使用knn
在4.3的基础上 (和4.3一样,将epoch设为1);同时修改/lidar-bonnetal/train/tasks/semantic/pre_trained_model/darknet21/arch_cfg.yaml文件,使用knn



而且官网也说是要修改预训练模型的arch_cfg.yaml文件。只是在进行4.4训练时,一直觉得darknet21.yaml文件和arch_cfg.yaml文件内容一样,不知道该修改哪一个,以及是否都修改。。。。。。



注:为控制变量,将4.4中对/lidar-bonnetal/train/tasks/semantic/config/arch/darknet21.yaml文件的修改改回去



IoU avg=0.332‹4.3的0.343
Acc avg=0.788=4.3的0.788
Loss avg=0.9740›4.3的0.9301
结合上面三个参数,说明之进行一次epoch时,加入knn可能会降低模型训练效果,但降低不明显;当然这也取决于训练的次数epoch,这里只进行了一次.
和4.4对比,说明的确应该在arch_cfg.yaml里面加入knn
IoU avg=0.332>4.4的0.289
Acc avg=0.788>4.4的0.693
Loss avg=0.9740›4.4的0.9799

5 评估预测效果
5.1 评估整体点云的IoU

github参考命令:

./evaluate_iou.py -d /path/to/dataset -p /path/to/predictions/ --split valid
#-d kitti数据集
#-p 预测结果,下载地址https://github.com/PRBonn/lidar-bonnetal/tree/master/train/tasks/semantic#predictions-from-models

评估darknet21预测效果与kitti数据集标注:
(1)no-knn:

./evaluate_iou.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset -p /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/predictions_from_models/no_post_processing/darknet21 --split valid


(2)with-knn

./evaluate_iou.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset -p /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/predictions_from_models/k-nn_processing/darknet21-knn --split valid



IoU为0.494,比no-knn的0.472高;acc为0.896比no-knn的0.882高。
但为啥终端打印的都用的是08这个序列sequence?

5.2 评估物体边缘点云的交并比IoU
github命令:

./evaluate_biou.py -d /path/to/dataset -p /path/to/predictions/ --split valid --border 1 --conn 4

(1)no-knn

./evaluate_biou.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset -p /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/predictions_from_models/no_post_processing/darknet21 --split valid --border 1 --conn 4

报错:RuntimeError: Subtraction, the - operator, with a bool tensor is not supported. If you are trying to invert a mask, use the ~ or logical_not() operator instead.



原因是pytorch改版之后不允许对bool变量进行“-”操作,如果需要对bool变量进行反转,则使用“~”操作
修改:/home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/postproc/borderMask.py文件如下:(注意对齐)



重新输入命令,结果如下,bIoU为0.349,bAcc为0.703



(2)with-knn

./evaluate_biou.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset -p /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/predictions_from_models/k-nn_processing/darknet21-knn --split valid --border 1 --conn 4

bIoU为0.394,bAcc为0.762,比no-knn均增大。



6 预测
6.1 用自己训练的模型进行预测

在4训练网络中,训练一个epoch得到的文件如下:



创建一个新文件夹(位置任意),将上面箭头指的5个文件拷贝进去:



github参考命令为:

./infer.py -d /path/to/dataset/ -l /path/for/predictions -m /path/to/model
#-d 需要预测的数据集
#-l 存放预测结果的目录,自己创建即可,我这里为/home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/predictions/darknet21_my
#-m 使用的模型

这里输入:

./infer.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset/ -l /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/predictions/darknet21_my -m /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/pre_trained_model/darknet21_my
#-d kitti数据集
#-l 存放预测结果
#-m 自己训练的模型,模型的arch_cfg.yaml文件里面没有使用knn

可以正常运行(尽管只训练了一个epoch)



但会预测-d数据集下面的所有数据——好像比训练省时间好多(约2分钟一个sequence)



在预测结果存放的目录里面,可以看到预测的标签信息



评估预测效果:
(1)整体点云的交并比

./evaluate_iou.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset -p /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/predictions/darknet21_my --split valid
#-d kitti数据集,主要用其label数据
#-p 预测得到的结果,这里自己训练模型得到的结果

Acc为0.773,IoU为0.314



(2)物体边缘点云的交并比

./evaluate_iou.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset -p /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/predictions/darknet21_my --split valid --border 1 --conn 4

Acc为0.536,IoU为0.213



6.2 用官方github训练的模型进行预测

./infer.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset/ -l /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/predictions/darknet21 -m /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/pre_trained_model/darknet21
#-d kitti数据
#-l 存放预测接轨
#-m 官方自己训练的darknet21模型,这次在模型的arch_cfg.yaml文件里面开启了knn


评估预测效果:
(1)整体点云的交并比:

./evaluate_iou.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset -p /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/predictions/darknet21 --split valid

Acc为0.896,IoU为0.494



(2)物体边缘点云的交并比

./evaluate_biou.py -d /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/dataset -p /home/meng/deeplearning/lidar-bonnetal/train/tasks/semantic/predictions/darknet21 --split valid --border 1 --conn 4

Acc为0.762,IoU为0.394



参考链接:
PyQt完整入门教程 - lovesoo - 博客园
深度学习(一):ubuntu18.04配置pytorch框架并进行fcn网络并训练_biter0088的博客-CSDN博客

Pytorch代码遇到THCudaCheck FAIL file=/pytorch/aten/src/THC/THCGeneral.cpp line=405/ error=11_GF小甘的博客-CSDN博客

RangeNet++: 快速精确的雷达数据语义分割(IROS 2019) - 知乎

RuntimeError: Subtraction, the - operator, with a bool tensor is not supported. If you are trying_Mr.Jcak的博客-CSDN博客