GRNET实验复现
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 Completion
环境要求
- GPU: 3080
- CUDA Version: 11.7
- python: 3.7.16
autoDL创建环境
根据GPU的版本选择合适的镜像,例如3080按照CUDA版本对应,应当选用11.7
版本的镜像,否则后面会因为机器的算力不匹配,从而导致无法使用GPU加速
终端操作
远程连接
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 | PyTorch
找到官网版本对应
官网指令
# 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
代码执行过程
看到终端有类似以下输出时,拓展安装成功
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 here.
解压数据集
unzip ShapeNetCompletion.zip
执行过程
滚屏结束后即为执行成功
修改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降级操作
源代码需要protobuf
3.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在本地打开窗口,可视化检验模型效果
JupyterLab
使用AutoDL自带的JupyterLab
进行操作
运行 torch
是否可用 脚本 验证cuda是否可用 ,返回
tensor([0.], device='cuda:0')
时说明torch正常工作
模型测试
查看缺失点云模型
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])
查看完整点云模型
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])
效果图
使用模型推理点云
使用模型推理点云数据
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])
测试数据删改
第一次
备份原文件
jupyter打开文件 autodl-fs/autodl-tmp/ShapeNetCompletion/test/partial/02691156/1169d987dbbce76775f4ea0b85a53249/00.pcd
- jupyter直接打开进行删改,第一次删除 601-668行的点位
运行 模型推理 代码
运行 模型推理结果查看 代码段查看模型补全效果
第二次
删除201-300行点位
运行 推理,查看结果
第三次
删除301-350行的点位
运行推理, 查看结果
第四次
删除51-100行代码
运行 推理,查看结果