由于毕设还有横向的需要,在导师的推荐下开始复现这篇基于VoteNet的焊接平板识别网络PanelNet,这个网络主要解决的问题是采用VoteNet网络根据三维点云对焊接过程中的焊接平板进行识别
。由于实验室的显卡是RTX3080,最低只能装CUDA11和pytorch1.7,所以在搭建VoteNet和PanelNet过程中有各种bug,也比较麻烦,特开此文记录。
github链接:
GitHub - ikh-innovation/roboweldar-weld-seam-detection: Proposal of candidate weld seams from 3D models of welding panel configurations
VoteNet在2019年于论文“Deep Hough Voting for 3D Object Detection in Point Clouds“中提出,由于之前的方法受2D目标检测影响很大,但是三维点云和图片原始感知到的数据形式是不同的,所以该方法回归第一性原则解决问题。PanelNet对VoteNet进行改进,用于焊接平板的识别
。
论文链接
Anaconda 环境配置(五)——Linux下 anaconda 安装与python环境配置_微知girl的博客-CSDN博客
Nvidia Driver
ubuntu18.04 安装mx250显卡驱动(超详细) - 灰信网(软件开发博客聚合)
这里多提一嘴,ubuntu20.04 RTX 3080 显卡安装建议选择“软件和更新”里“附加驱动”的“使用NVIDIA driver metapackage 来自 nvidia-driver-515(专有)” 安装,简单快捷,安装官网的驱动可能会黑屏。
CUDA(这里选择CUDA11.0)
CUDA Toolkit 11.0 Update 2 Downloads | NVIDIA Developer
安装cuDNN8.0.5:
ubuntu18.04卸载cuda和cudnn, 重装10.2版本cuda和cudnn_太阳下大黄花的博客-CSDN博客_ubuntu卸载cudnn
Ubuntu20.04下CUDA、cuDNN的详细安装与配置过程,亲测试可用(图文)_这个昵称叫什么好呢的博客-CSDN博客_ubuntu cuda安装
conda create -n ikh_weldrobot python=3.6
conda activate ikh_weldrobot
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
重点是要用pip安装,不要用conda安装!因为用conda安装会安装ninja并且卸载不掉。
RTX3080算力太高,和cuda11.0不匹配,需要修改一下:
sudo gedit ~/.bashrc
添加如下命令:
export TORCH_CUDA_ARCH_LIST="8.0"
VoteNet是PointNet类方法的延续,简单高效,直接处理点云,所以为了实现VoteNet需要首先实现PointNet2。
由于PointNet2原始搭建环境在低版本pytorch,因此在pytorch1.7复现需要修改一些函数的用法,参照下文:
pointnet2.pytorch(pointnet++)运行 python setup.py install 相关报错解决办法:_张无忌忌的博客-CSDN博客
进入votenet文件夹下的pointnet2文件夹,运行如下命令:
python setup.py install
pip install -r requirements
pip install matplotlib opencv-python plyfile 'trimesh>=2.35.39,<2.35.40' 'networkx>=2.2,<2.3'
下面这个应该不需要
# pip install numpy>=1.18.5 open3d>=0.10.0.0 trimesh>=2.35.39 matplotlib>=2.2.5 plyfile>=0.7.2 scipy>=1.4.1 tensorflow==2.2.0 opencv-python>=4.3.0.36 setuptools>=49.2.0 pillow>=6.2.2
至此,VoteNet的相关依赖已经基本配置完成,运行下列代码可以测试配置是否成功。
cd ..
python models/votenet.py
成功输出的前几行应该是这样的:
Dataset has not been prepared. Use a random sample.
sa1_inds tensor([[ 0, 18378, 2760, ..., 10087, 9941, 6935]], device='cuda:0',
dtype=torch.int32)
sa1_xyz tensor([[[0.5433, 0.9419, 0.0351],
[0.0507, 0.0205, 0.9666],
[0.9723, 0.5971, 0.9659],
...,
[0.2278, 0.0654, 0.2796],
[0.2423, 0.6431, 0.5632],
[0.7706, 0.7663, 0.7406]]], device='cuda:0')
下载预训练模型和样例点云放在votenet文件夹(/votenet/demo_files),并运行demo:
python demo.py
这里会报错
Traceback (most recent call last):
File "demo.py", line 100, in
pred_map_cls = parse_predictions(end_points, eval_config_dict)
File "/home/lin/welding_robot/ikh-innovation/roboweldar-weld-seam-detection-master/votenet/models/ap_helper.py", line 103, in parse_predictions
if len(pc_in_box) < config_dict['min_points_2b_empty']:
KeyError: 'min_points_2b_empty'
翻了一下代码,发现config_dict这个字典变量压根就没定义过min_points_2b_empty这个键,于是翻了翻github其它votenet的代码,解决方案如下:
if len(pc_in_box) < config_dict['min_points_2b_empty']:
改成:
if len(pc_in_box) < 5:
这样就可以运行了,原作者可能没改掉这个bug,虽然我也懒得留在github留issues了,原谅my poor English。
点云分割结果存储在demo_files/sunrgbd_results文件夹下,新建一个python文件visualization.py用Open3d进行可视化,写入如下代码(记得修改路径,最好是绝对路径):
import open3d as o3d
import numpy as np
pcd=o3d.io.read_point_cloud("/path/to/project/demo_files/sunrgbd_results/0000_pc.ply",format='ply')
ppoints=np.asarray(pcd.points)
pcolors=np.asarray(pcd.colors)
o3d.visualization.draw_geometries([pcd])
运行后得到如下结果:
下面开始测试PanelNet效果,在测试之前要改个bug,
打开votenet/panelnet/panel_data.py
文件:
mesh, labelboxes = generate_welding_area(panels_num=np.random.randint(2, 5), hpanels_num=np.random.randint(1, 3))
改成:
pcd, mesh, labelboxes = generate_welding_area(panels_num=np.random.randint(2, 5), hpanels_num=np.random.randint(1, 3))
在votenet文件夹下运行如下代码对焊接环境进行三维点云分割:
python inference_old.py --checkpoint_dir=weights_checkpoint
# inference.py 有个变量未定义,可以自己手动输入,不得不说这个作者心很大。
分割结果生成在votenet/panelnet_inference_results文件夹下,利用visualization.py文件修改文件路径进行可视化(目标结果为0000_pc.ply)。
原图:
分割结果:
至此,PanelNet的复现基本完成了,之后进一步的操作就是下载训练集以及自己制作训练集进行训练,这里就跳过了,毕竟数据集采集有点麻烦。
本文基本介绍了焊接平板识别网络PanelNet的配置,主要包括VoteNet和PointNet的配置,实现了在复杂环境中分割焊接平板点云。