您当前的位置:首页 > IT编程 > pointnet
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch |

自学教程:理解和跑通pointnet对于三维数据的分类和分割原理

51自学网 2021-01-10 19:35:10
  pointnet
这篇教程理解和跑通pointnet对于三维数据的分类和分割原理写得很实用,希望能帮到您。

第一次进行三维数据的深度学习,都说pointnet是绕不过去的一篇文章,一周时间终于理解和跑通pointnet对于三维数据的分类和分割原理。

数据:

网上可搜到的点云数据很多,但几乎都是未经过整理的,对于pointnet,每个点云的点数量需要一致,因此需要对下载到的数据进行整理。

我对于点云的理解:每个点仅有三个信息,就是它们的坐标,不像图片那样还具有像元值。无论是网格,点云还是其他三维数据,它们归根结底都是只有三个坐标信息,网格也是由对点连接生成线,组成形状,进而成为三维格网。

pointnet可分类也可分割,我对ModelNet40数据进行分类,对ShapeNet数据进行分割,ModelNet40是不能进行分割的,因为它没有针对各个点云部件的标签,它只有针对一整个点云的标签。

模型:

分类:

输入形状为[B,N,3],在进行最后softmax前,形状为[B,K](K为类别数),这里相当于将每个点云整理成了一个值来代替,经过softmax后仍为[B,K],正好对应每个点云的标签。

模型主要就是进行[B,N,3]到[B,K]的变化(其中会多次涉及到维度交换,注意通道对应的维度)

  • 模型中的重要部分T-Net,这是一个矩阵,用来转化输入的点云数据。因为点云的特殊性,点的属性都是一致的,所以随意交换位置对点云本身并无影响,所以这里引入另一个矩阵使点云进行旋转变化,以获得最佳识别状态。points[B,N,3]要与T-Net矩阵相乘,T-Net的形状为[B,3,3],T-Net通过对points卷积,maxpooling,全连接等操作得到,如图模型所示。
  • 得到T-Net再与points相乘,得到了新的points[B,N,3],接着进行mlp,其实就是数个卷积,得到points[B,64,N]。
  • 与第一步相同的操作,再在新的points基础上求出第二个T-Net,与points相乘,得到新的points[B,N,64],
  • 继续对points进行mlp,得到[B,1024,1]
  • maxpooling后points=[B,1024],全连接使之得到分类前的形状[B,K]
  • 最后就是softmax

网上对于pytorch版本的pointnet大致有两个,一个简单易读,但我使用后分类效果不佳,而另一个分类效果极好,他们的不同之处在于以下几个地方:

  1. 较好的分类函数使用了log_softmax,相应的损失函数使用了nll_loss,这两个配套使用,数学中对应softmax+CrossEntropy,效果不好的则使用了后者,针对我的情况,我猜测,因为log_softmax对于大数据具有稳定性,计算速度也快,三维数据就是大量的点,因此配合前者效果明显。
  2. 每个T-Net计算得到后,效果好的代码会给T-Net加上一个形状对应的正交函数,也提升了模型的能力,这个方式我要记录一下,也是个改进模型的可行之策。

分割

相比于分类,只是多了右下角的一部分,可以将feature transform之后的[B,64,64]最终转换为[B,N,K],因为分割与分类的差别就是标签对象,分类标签对应的是整个点云,而分割标签对应的则是每个点。


Pointnet++ _语义分割实践
PointNet简介有代码
51自学网,即我要自学网,自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1