目录
0 前言
0.1 KITTI语义分割数据集--SemanticKITTI
1 安装
1.1 python环境
numpy版本报错--------------------------------------------------------------------------
1.2 安装pyqt
2 配置kitti数据集目录
3 可视化kitti数据集
3.1 可视化kitti数据集数据
3.2 可视化预测效果-no-knn
3.3 可视化预测效果-with-knn
3.4 对比no-knn与with-knn----giao我找到了
4 训练网络
4.1 从头开始训练网络
报错与解决--------------------------------------------------------------------------------------
4.2 预训练模型训练网络
4.3 从预训练模型训练网络--修改epoch为1
4.4 从预训练模型训练网络--在darknet21.yaml中使用knn
4.5 从预训练模型训练网络--在arch_cfg.yaml中使用knn
5 评估预测效果
5.1 评估整体点云的IoU
5.2 评估物体边缘点云的交并比IoU
6 预测
6.1 用自己训练的模型进行预测
6.2 用官方github训练的模型进行预测
参考链接:
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-knngithub参考命令为:
./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.788<4.2的0.834
Loss avg=0.9301<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 评估整体点云的IoUgithub参考命令:
./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 评估物体边缘点云的交并比IoUgithub命令:
./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博客
@meng
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)