首页 > 其他分享 >深度学习3D网格分割网络---MeshCNN

深度学习3D网格分割网络---MeshCNN

时间:2024-01-14 10:55:06浏览次数:33  
标签:obj 相邻 卷积 --- 特征 https MeshCNN 3D

MeshCNN是2019年提出的直接在3D Mesh上进行分类和分割的网络,MeshCNN在3D网格上定义了定义了卷积和池化层,依据三维模型边的连通关系将其转换为一个图来研究。最终能够在来自SHREC 11数据集的30个类上达到98.6%的精度,并且在部件和人体数据集上有很好的分割性能。
论文主页:https://ranahanocka.github.io/MeshCNN/
原文链接:https://bit.ly/meshcnn
代码:https://github.com/ranahanocka/MeshCNN/

一、网络结构

其网络结构大体如下所示,其结构类似于UNet的编码器-解码器形式,输入的是每条边的几何特征,论文中是5维,输出是每条边的类别信息,注意这里面的Conv、Pooling、UnPooling操作是在Mesh上进行的,具体细节见后续分析。

实现上可以参考:network.py

二、关键点

2.1 输入特征

考虑每条边相邻的两个面,也就是考虑该边的一邻域,共提取以下5个几何特征,这些几何特征不会随着模型的旋转平移而改变。

  • 两个面组成的二面角 * 1
  • 两个面和该边分别对应的内角 * 2
  • 该边边长与相邻面垂线(图中虚线)长度的比率 * 2

2.2 边卷积

考虑边的一邻域,如下图所示,对于当前边e,按逆时针方向考虑其相邻边的特征 a,b,c,d。

定义边的卷积为:

即取当前边以及相邻边的特征加权和,ej表示第j条相邻边的特征。

存在问题
按照先前提到的逆时针选取相邻边的顺序,则依赖于先选择哪个面,所以会有(a,b,c,d)和(c,d,a,b)两种情形,这对于同一条边来讲其实是一样的,但是直接进行边卷积顺序不同则会产生不同点值。

解决方法
为了消除顺序不同带来的影响,对四条相邻边的特征进行了如下变换。

具体实现
这里自定义的边卷积和普通卷积不一样,所以在实现上进行了处理,即把边特征创建成虚拟的图,在采用卷积核为(1, 5)普通卷积,这里的图的大小为Batch x Channels x Edges x 5,Batch指批处理大小,Channels指特征的维度,Edges表示边的个数,5表示一领域4条边以及本身,代码可以参考create_GeMM函数。

2.3 边池化

边的池化操作包括Pooling和UnPooling两个操作

  • Pooling

    如上图所示边的池化操作有点类似于边塌缩的减面算法(采用QEM方法,可参考参考链接中给出的参考文献),这里操作比较简单,直接对邻面边进行求平均即:

  • UnPooling
    UnPooling与Pooling操作相反,需要恢复出两个面,先计算出边长,再指定两个面的其他边。

细节点
Q: 那池化过程中具体如何确定哪一条边进行坍缩呢?
A: 具体坍缩哪一条边由网络自动进行学习,会依据任务的不同选择保留不同的边(如下图所示)

在具体实现上,简单的按照特征的平方和大小进行排序,直到达到指定的边数为止,代码可以参考mesh_pooling.py

三、实现效果

MeshCNN在分类和分割上都取得了较好的效果

  • 分类

  • 分割

四、数据处理

4.1 处理步骤

参考:https://github.com/ranahanocka/MeshCNN/wiki/Data-Processing
主要分为以下三步

如果输入是其他格式模型,可以借助Meshlab对其进行格式转换

meshlabserver -i /path/to/model.off -o /path/to/model.obj
  • 模型简化
    由于有些模型面片数量相差较大,所以先将其简化成相同面片数的Mesh,会更加便于训练。
    减面可以参考:blender_process.py
/opt/blender/blender --background --python blender_process.py /path/to/input_mesh.obj num_faces /path/to/outputmesh.obj
  • 非流形输入数据
    MeshCNN支持流形网格(简单可以理解成一条边对于两个面),对于有些非流形数据,额可以借助Manifold进行处理。

  • 数据集
    经过处理后得到的数据集如下所示

    seg: 保存每条边的类别信息
    sseg: 保存每条边及邻边得到的类别信息(概率值)
    train: 保存训练的obj模型
    val: 保存验证的obj模型

4.2 数据流

中间主要有以下方法

  • fill_mesh()
    给mesh赋值 包括vs,edges,gemm_edges,features等

  • get_mesh_path()
    获取对应obj文件对应的npz文件
    存在obj对应的npz文件则直接解析
    不存在则执行from_scratch()

  • from_scratch()

    • fill_from_file()
      解析obj文件获取vs,faces

    • remove_non_manifolds()
      移除非正常的faces

    • augmentation()
      数据增强

    • build_gemm()
      获取相邻边

    • extract_feature()
      提取特征

五、参考资料

减面算法:
《Surface Simplification Using Quadric Error Metrics》
《View-Dependent Refinement of Progressive Meshes》
《New Quadric Metric for Simplifying Mesheswith Appearance Attributes》
OBJ格式模型:
https://all3dp.com/1/obj-file-format-3d-printing-cad/

标签:obj,相邻,卷积,---,特征,https,MeshCNN,3D
From: https://www.cnblogs.com/xiaxuexiaoab/p/17896649.html

相关文章

  • 图论 - 某进制分组 - P5304 旅行者
    P5304旅行者\(\mathtt{TAGS}\):多源多汇最短路,二进制分组\(\mathtt{ESTIMATION}\):非常好二进制分组,让我的大脑旋转题意简述给定\(k\)个点和一张有向图,求以这\(k\)个点为起点和终点的最短路中最短的一条的长度。First.怎么求多源多汇最短路solution.1超级源点和超级......
  • JavaImprove--Lesson06--正则表达式
    一.正则表达式的入门正则表达式是一些特定支付组成的,代表一个规则,简化代码,以字符的形式体现规则正则表达式,又称规则表达式,(RegularExpression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。......
  • 图论 - 最短路随记
    顺序有点乱,后续会排一下,然后分板块整理All最短路算法的选择:\(n\le100\):Floyd(一般是较难的图论建模)\(n\le4\times10^5\):dijkstra尽量不用SPFA。神秘IDEA:一个带负权图,绝对最短路定义为,绝对值最小的最短路,求\(s\tot\)的绝对最短路。最短路中,任意......
  • 【公开课-微软RPA】12月23日,RPA 学习天地成功举办基于微软RPA公开课,让更多人用上RPA,用
    12月23日,RPA学习天地成功举办了,基于微软RPA工具(PowerAutomateDesktop)直播公开课,成功地帮助学员们初步了解了微软RPA工具的功能。本次公开课,主要介绍了如何使用微软的RPA工具来实现Boss直聘岗位薪资自动爬取的场   首先:通过查询岗位相关信息并保存到本地,然后进行数据筛......
  • 【scikit-learn基础】--『监督学习』之 均值聚类
    聚类算法属于无监督学习,其中最常见的是均值聚类,scikit-learn中,有两种常用的均值聚类算法:一种是有名的K-means(也就是K-均值)聚类算法,这个算法几乎是学习聚类必会提到的算法;另一个是均值偏移聚类,它与K-means各有千秋,只是针对的应用场景不太一样,但是知名度远不如K-Means。本篇介绍如......
  • 基于协方差矩阵自适应演化策略(CMA-ES)的高效特征选择
    特征选择是指从原始特征集中选择一部分特征,以提高模型性能、减少计算开销或改善模型的解释性。特征选择的目标是找到对目标变量预测最具信息量的特征,同时减少不必要的特征。这有助于防止过拟合、提高模型的泛化能力,并且可以减少训练和推理的计算成本。如果特征N的数量很小,那么穷......
  • Asp.Net怎么上传图片-基础教程
    aspx页面script方法内用于判断用户上传的文件是否为自己要求的格式和展示图片的方法body内定义一个图片框用于预览用户上传的图片一个上传文件的控件一个提交按钮代码如下Script代码:$(function(){$('#uploadImage').on('change',function(){var......
  • 无涯教程-LISP - 数字(Numbers)
    CommonLisp number数据类型包括LISP支持的各种数字。LISP支持的数字类型是-IntegerRatiosFloatComplex下图显示了LISP中可用的数字层次结构和各种数字数据类型-数字类型下表描述了LISP中可用的各种数字类型数据-Sr.No.Datatype&描述1fixnum此数据类型表示......
  • React-hook-form-mui(一):基本使用
    前言在项目开发中,我们选择了React+MUI作为技术栈。在使用MUI构建form表单时,我们发现并没有与antd类似的表单验证功能,于是我们选择了MUI推荐使用的react-hook-form-mui库去进行验证。但是发现网上关于这个库的使用方法和demo比较少且比较简单,并没有复杂的表单验证的demo。因此本文及......
  • quasar <q-page>下面<div>自动计算height的问题
    由于要解决adsense引起的CLSissue,根据https://web.dev/articles/optimize-cls?utm_source=lighthouse&utm_medium=lr给出的建议,在广告的container上加上min-height。<divv-if="$q.platform.is.mobile"class="adsenseunitdetai......