跳至主要內容

GRNET实验复现

fatSheep大约 7 分钟

GRNET实验复现

项目介绍

GRNet: 用于稠密点云补全的网格化残差网络

由于传感器本身的分辨率限制或物体的遮挡,现实场景中采集的点云往往不完整,而完整的点云对于点云理解有很大帮助。因此,点云补全在现实应用中有着非常重要的意义。

早期的工作(如3D-EPN [1])将该问题转换为体素的补全问题,然而转换为体素时会引入量化误差,从而丢失物体的细节。近几年的方法(如PCN[2]、TopNet [3]和Cascade Point Completion [4]等)直接使用多层感知机回归点云的坐标值。但由于点云的无序性,多层感知机无法很好地获得点云的几何结构和相邻点的上下文信息。

反观近几年点云分割的方法(如SPLATNet [5]和InterpConv [6]),它们在Permutohedral Lattice和3D Grid中进行卷积操作,从而考虑点云的空间结构和上下文信息。然而这两个方法假定点云中点的坐标和数量在输入输出时保持不变,因此无法直接用于点云补全。

为了解决上述问题,本文提出了**Gridding Residual Network(GRNet)**将无序的点云规则化至3D Grid,从而在点云补全中考虑了点云的空间结构和上下文信息,最终在点云补全任务中取得了更好的效果。

项目相关

Paper :[2006.03761] GRNet: Gridding Residual Network for Dense Point Cloud Completionopen in new window

Github :GitHub - hzxie/GRNet: The official implementation of "GRNet: Gridding Residual Network for Dense Point Cloud Completion". (Xie et al., ECCV 2020)open in new window

环境要求

  • GPU: 3080
  • CUDA Version: 11.7
  • python: 3.7.16

autoDL创建环境

根据GPU的版本选择合适的镜像,例如3080按照CUDA版本对应,应当选用11.7版本的镜像,否则后面会因为机器的算力不匹配,从而导致无法使用GPU加速

1713241336287.png

终端操作

远程连接

ssh -p xxxxx root@region-41.seetacloud.com

输入密码即可登陆

虚拟环境

(可选操作)添加密钥到服务器,后期免密登陆

ssh-copy-id -p xxxxx root@region-41.seetacloud.com

创建虚拟环境

# 使用conda创建python版本3.7的名为 GRNet 的虚拟环境
conda create -n GRNet python=3.7 

激活虚拟环境

conda activate GRNet

在conda中安装jupyter内核

# 在新的conda环境中安装Python内核
conda install ipykernel      
# 配置Jupyter以使用Python内核(注意创建的虚拟环境名称要和自己的一致)
ipython kernel install --user --name=GRNet  

克隆项目

最好先切换目录到autodl的数据盘

cd ~/autodl-tmp
# 下列两指令选一条执行就可以
git clone https://github.com/hzxie/GRNet.git #github地址

git clone https://mirror.ghproxy.com/github.com/hzxie/GRNet.git #国内镜像加速地址

依赖安装

requirements.txt

进入项目目录下(注意上一步项目克隆目录是否与我一致,不一致需要修改)

cd ~/autodl-tmp/GRNet

执行pip3安装依赖

pip3 install -r requirements.txt

PyTorch拓展版本匹配

注意

这一步是因为一开始选择错了,使用3080卡,但是选择了CUDA版本为10.1的镜像,而不是版本11.7的镜像,从而导致无法使用cuda加速,如果版本选择正确,下面的Torch拓展构建可以直接运行成功

查看官网pytorch环境匹配

Previous PyTorch Versions | PyTorchopen in new window

找到官网版本对应

官网指令

# CUDA 10.1
pip install torch==1.8.1+cu101 torchvision==0.9.1+cu101 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html 

修改指令为(官网使用了自己的源,如果用国内镜像源,需要去掉原地址,删除包名后缀)

pip3 install torch==1.8.1 torchvision==0.9.1 torchaudio==0.8.1
构建PyTorch拓展

依次进入4个拓展目录,分别执行下列操作

cd extensions/

执行下面指令

python3 setup.py install --user

注意

有四个拓展,需要都执行一次

下面的指令无法直接复制执行,需要根据实际目录修改,如果按照刚刚的操作克隆项目,GRNET_HOME的位置在/root/auto-tmp/GRNet

修改下面第一条指令为 cd /root/auto-tmp/GRNet/extensions/chamfer_dist

以此类推

GRNET_HOME=`pwd`


# Chamfer Distance
cd $GRNET_HOME/extensions/chamfer_dist
python setup.py install --user

# Cubic Feature Sampling
cd $GRNET_HOME/extensions/cubic_feature_sampling
python setup.py install --user

# Gridding & Gridding Reverse
cd $GRNET_HOME/extensions/gridding
python setup.py install --user

# Gridding Loss
cd $GRNET_HOME/extensions/gridding_loss
python setup.py install --user

代码执行过程

1713152754422.png

看到终端有类似以下输出时,拓展安装成功

Installed /root/.local/lib/python3.7/site-packages/gridding_distance-1.0.0-py3.7-linux-x86_64.egg
Processing dependencies for gridding-distance==1.0.0
Finished processing dependencies for gridding-distance==1.0.0

数据集处理

下载预处理数据集

You can download the processed ShapeNet dataset hereopen in new window.

解压数据集

unzip ShapeNetCompletion.zip

执行过程

1713153511005.png

滚屏结束后即为执行成功

修改config.py

需要根据上一步解压位置,修改项目根目录下config.py文件

修改路径中带有ShapeNetCompletion的变量,修改为刚刚解压的目录位置

__C.DATASETS.COMPLETION3D.PARTIAL_POINTS_PATH    = '/path/to/datasets/Completion3D/%s/partial/%s/%s.h5'
__C.DATASETS.COMPLETION3D.COMPLETE_POINTS_PATH   = '/path/to/datasets/Completion3D/%s/gt/%s/%s.h5'
__C.DATASETS.SHAPENET.PARTIAL_POINTS_PATH        = '/path/to/datasets/ShapeNet/ShapeNetCompletion/%s/partial/%s/%s/%02d.pcd'
__C.DATASETS.SHAPENET.COMPLETE_POINTS_PATH       = '/path/to/datasets/ShapeNet/ShapeNetCompletion/%s/complete/%s/%s.pcd'
__C.DATASETS.KITTI.PARTIAL_POINTS_PATH           = '/path/to/datasets/KITTI/cars/%s.pcd'
__C.DATASETS.KITTI.BOUNDING_BOX_FILE_PATH        = '/path/to/datasets/KITTI/bboxes/%s.txt'

# Dataset Options: Completion3D, ShapeNet, ShapeNetCars, KITTI
__C.DATASET.TRAIN_DATASET                        = 'ShapeNet'
__C.DATASET.TEST_DATASET                         = 'ShapeNet'

执行protobuf降级操作

源代码需要protobuf3.20版本及以下

pip3 install protobuf==3.20

建立vnc转发隧道

ssh -CNg -L 6006:127.0.0.1:6006  root@region-41.seetacloud.com -p xxxxx

使用vnc客户端连接 127.0.0.1:6006即可登陆远程桌面

图形化操作

安装VNC

# 安装基本的依赖包
apt update && apt install -y libglu1-mesa-dev mesa-utils xterm xauth x11-xkb-utils xfonts-base xkb-data libxtst6 libxv1

# 安装libjpeg-turbo和turbovnc
export TURBOVNC_VERSION=2.2.5
export LIBJPEG_VERSION=2.0.90
wget http://aivc.ks3-cn-beijing.ksyun.com/packages/libjpeg-turbo/libjpeg-turbo-official_${LIBJPEG_VERSION}_amd64.deb
wget http://aivc.ks3-cn-beijing.ksyun.com/packages/turbovnc/turbovnc_${TURBOVNC_VERSION}_amd64.deb
dpkg -i libjpeg-turbo-official_${LIBJPEG_VERSION}_amd64.deb
dpkg -i turbovnc_${TURBOVNC_VERSION}_amd64.deb
rm -rf *.deb

# 启动VNC服务端,这一步可能涉及vnc密码配置(注意不是实例的账户密码)。另外如果出现报错xauth未找到,那么使用apt install xauth再安装一次
rm -rf /tmp/.X1*  # 如果再次启动,删除上一次的临时文件,否则无法正常启动
USER=root /opt/TurboVNC/bin/vncserver :1 -desktop X -auth /root/.Xauthority -geometry 1920x1080 -depth 24 -rfbwait 120000 -rfbauth /root/.vnc/passwd -fp /usr/share/fonts/X11/misc/,/usr/share/fonts -rfbport 6006

# 检查是否启动,如果有vncserver的进程,证明已经启动
ps -ef | grep vnc

退出远程登陆,修改ssh连接为以下形式:(修改域名和端口为连接信息)

ssh -CNg -L 6006:127.0.0.1:6006  root@region-41.seetacloud.com -p xxxxx 

访问浏览器网址

http://127.0.0.1:6006

显示 RFB 003.008 说明 转发成功(edge下会显示返回未知响应之类的,也说明建立成功)

使用vnc在本地打开窗口,可视化检验模型效果

1713176865083.png

JupyterLab

使用AutoDL自带的JupyterLab进行操作

1713151658108.png

运行 torch是否可用 脚本 验证cuda是否可用 ,返回

tensor([0.], device='cuda:0')

时说明torch正常工作

1713170132459.png

模型测试

查看缺失点云模型

ShapeNetCompletion/test/partial是缺失的点云数据

在jupyter中运行代码(注意修改路径)

########################### 查看缺失的点云模型 ######################################
import open3d as o3d
import numpy as np
 
ply = o3d.io.read_point_cloud('/root/autodl-fs/autodl-tmp/ShapeNetCompletion/test/partial/02691156/1169d987dbbce76775f4ea0b85a53249/00.pcd') 
 
o3d.visualization.draw_geometries([ply])

1713255747654.png

查看完整点云模型

ShapeNetCompletion/test/complete是完整版点云数据

(注意修改路径)

########################### 查看补全后的点云模型 ######################################
import open3d as o3d
import numpy as np
 
ply = o3d.io.read_point_cloud('/root/autodl-fs/autodl-tmp/ShapeNetCompletion/test/complete/02691156/1169d987dbbce76775f4ea0b85a53249.pcd') 
 
o3d.visualization.draw_geometries([ply])

效果图

1713256595141.png

使用模型推理点云
使用模型推理点云数据

jupyter中运行以下代码(注意修改路径)

############################ 模型推理 ############################################
%run /root/autodl-fs/autodl-tmp/GRNet/runner.py --inference --weights='/root/autodl-fs/autodl-tmp/GRNet/pretrained/GRNet-ShapeNet.pth'
模型推理结果查看

(注意路径)

############################ 模型推理结果查看 ############################################
import h5py
import open3d as o3d
import numpy as np

# 从.h5文件中读取点云数据
file_path = '/root/autodl-fs/autodl-tmp/GRNet/output/benchmark/02691156/1169d987dbbce76775f4ea0b85a53249.h5'

with h5py.File(file_path, 'r') as f:
    dense_ptcloud_np = np.array(f['data'])
    
print(dense_ptcloud_np)

# 创建一个Open3D点云对象
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(dense_ptcloud_np)

# 可视化点云
o3d.visualization.draw_geometries([pcd])

1713265284089.png

测试数据删改
第一次

备份原文件

jupyter打开文件 autodl-fs/autodl-tmp/ShapeNetCompletion/test/partial/02691156/1169d987dbbce76775f4ea0b85a53249/00.pcd

  1. jupyter直接打开进行删改,第一次删除 601-668行的点位

1713277361724.png

  1. 运行 模型推理 代码

  2. 运行 模型推理结果查看 代码段查看模型补全效果

1713277640701.png

第二次

删除201-300行点位

1713277892221.png

运行 推理,查看结果

1713278162639.png

第三次

删除301-350行的点位

1713278460445.png

运行推理, 查看结果

1713281057913.png

第四次

删除51-100行代码

1713281338622.png

运行 推理,查看结果

1713281631375.png