Pytorch:复现PointNet

文章目录

  • 一、【点云分类】和【部件分割】:
      • 1.1 复现结果展示
      • 1.2 复现过程
      • 1.3 复现过程中遇到的问题
        • 1.3.1 分类遇到的问题
        • 1.3.2 分类可视化(检验)遇到的问题
        • 1.3.3 部件分割遇到的问题
        • 1.3.4 部件分割可视化(检验)遇到的问题
        • 1.3.5 思考
  • 二、室内场景点云语义分割
      • 2.1 复现结果展示
      • 2.2 复现过程


一、【点云分类】和【部件分割】:

1.1 复现结果展示

Pytorch:复现PointNet_第1张图片

1.2 复现过程

1.1.1 复现过程参考博客:https://blog.csdn.net/BIT_HXZ/article/details/123521410
1.1.2 代码下载:https://github.com/fxia22/pointnet.pytorch
1.1.3 作者论文:https://arxiv.org/abs/1612.00593
1.1.4 PointNet算法解读:3D点云物体检测(唐宇迪)
1.1.5 数据集:shapenetcore_partanno_segmentation_benchmark_v0

# 查看数据集中seg格式文件保存的标签数据,该文件保存了一行类别标签。
import numpy as np
fn = "D:\\PointNet\\pointnet.pytorch-master\\shapenetcore_partanno_segmentation_benchmark_v0\\02691156\points_label\\1a04e3eab45ca15dd86060f189eb133.seg"
seg = np.loadtxt(fn).astype(np.int64)
print(seg.shape, seg[0:199])

1.1.6 环境配置:跟着李沐大神配置 CUDA 和 GPU 版本的 torch

GPU 版本的 torch 配置注意事项:①,要先安装NVIDIA驱动。②,安装GPU版本的torch要在base环境。③,安装过程中不要科学上网。

1.3 复现过程中遇到的问题

1.3.1 分类遇到的问题

用编译器直接复现,要加一行

if __name__ == "__main__":

用 CPU 不用 GPU 的要在 if name == “main”: 后面加如下一行

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 把全部的 .cuda() 换成 .to(device)

然后把全部的 .cuda() 换成 .to(device)。如图所示,

Pytorch:复现PointNet_第2张图片

参数设置和代码修改如下图所示:

Pytorch:复现PointNet_第3张图片

1.3.2 分类可视化(检验)遇到的问题

待补充…

1.3.3 部件分割遇到的问题

分割修改的代码如下图所示,

Pytorch:复现PointNet_第4张图片

用 CPU 的可以和分类的操作一样,把全部的 .cuda() 换成 .to(device)

1.3.4 部件分割可视化(检验)遇到的问题

①、【dll = np.ctypeslib.load_library(‘render_balls_so’, ‘.’) OSError: no file with expected extension:】
点击链接下载【https://download.csdn.net/download/qq_35591253/86507242】(0积分下载)下载 render_balls_so.dll 替换 pointnet.pytorch-master\utils 文件夹下的 render_balls_so.dll。

1.3.5 思考

①、 代码中为什么有时候用 Conv1d 升维,有时候用 Conv1d 降维。有时候用 Linear() 降维。在查了其他人的博客以后,我发现当作用于一维数据的时候,一维卷积 Conv1d() 和 Linear() 的效果是一模一样的,那为什么 Pointnet 里面不全用 Conv1d() 或者全用 Linear() 呢?
首先我找到了下图的规律,如图所示。从下图可以看出,黄框部分,有好多点(n行)同时通过 MLP 的时候,就用 conv1d() ;绿框部分,有一行通过 MLP 的时候,用的是 Linear() 。


已经有人比较了在相同输入数据的条件下两者之间的区别:(1)Linear() 比 conv1d() 的计算速度快;(2)Conv1d() 的精度比 Linear() 的高;(3)在反向传播更新梯度的时候,数值有差异。
那么为什么这么设计呢?查了大量资料以后,我觉得这个答案最靠谱。当你必须保留语义分割中的空间信息时,使用卷积 Conv1d() 。当你不需要做任何与空间信息相关的事情时,比如在基本分类(mnist、猫狗分类器)中,使用线性层 Linear() 。

②、 感谢网友 Liu1998121 的提醒,CPU 运行精度明显低于 GPU 运行的精度的原因,可能是 CPU 和 GPU 默认的数据类型不一样。


二、室内场景点云语义分割

2.1 复现结果展示

用meshlab打开:
Pytorch:复现PointNet_第5张图片
用paraview打开:

图例如下表所示,

类名 ceiling floor wall beam column window door table chair sofa bookcase board clutter
标签label 1 2 3 4 5 6 7 8 9 10 11 12 13

2.2 复现过程

2.2.1 复现过程参考博客:https://blog.csdn.net/weixin_42371376/article/details/118142529
2.2.2 复现代码:https://github.com/hetao255/Pointnet_Pointnet2_pytorch
2.2.3 数据集:S3DIS

你可能感兴趣的:(python,深度学习,笔记,pytorch,深度学习,python)