RTX3080复现基于VoteNet的焊接平板识别网络PanelNet


前言

    由于毕设还有横向的需要,在导师的推荐下开始复现这篇基于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


二、操作步骤

1.简要介绍

    VoteNet在2019年于论文“Deep Hough Voting for 3D Object Detection in Point Clouds“中提出,由于之前的方法受2D目标检测影响很大,但是三维点云和图片原始感知到的数据形式是不同的,所以该方法回归第一性原则解决问题。PanelNet对VoteNet进行改进,用于焊接平板的识别

论文链接

2.环境配置

2.1GPU环境配置

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安装

2.2 VoteNet虚拟环境配置

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 <module>
    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])

        运行后得到如下结果:

2.3PanelNet测试

        下面开始测试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的配置,实现了在复杂环境中分割焊接平板点云。

猜你喜欢

转载自blog.csdn.net/astruggler/article/details/128134746
RTX
RTX