DMTet 阅读笔记

news2024/12/24 21:45:49

介绍

  • 主页 https://nv-tlabs.github.io/DMTet/
  • 论文pdf https://nv-tlabs.github.io/DMTet/assets/dmtet.pdf
  • 视频汇报 https://slideslive.com/38967642/deep-marching-tetrahedra-a-hybrid-representation-for-highresolution-3d-shape-synthesis?ref=homepage
  • 疑似代码 在nvdiffrec项目下的工具代码
  • 用DMTet恢复点云 https://github.com/NVIDIAGameWorks/kaolin/blob/master/examples/tutorial/dmtet_tutorial.ipynb
  • 列表包含两个DMTet的demo https://kaolin.readthedocs.io/en/latest/notes/tutorial_index.html

DMTet的全称为Deep Marching Tetrahedra,是MT(Marching Tetrahedra)算法的深度学习版本。顾名思义,它与MT算法有共通之处,而它又是基于深度学习(Deep)的方法。整个论文的各个步骤都是端到端的、可微的,因而可以被反向梯度重传所训练。

从概览图可知,输入可以使点云或者粗voxel,算法会先细分生成隐式表达SDF,再用MT算法生成显式表达,最后得到模型参数表面(Parametric Surfaces)。

请添加图片描述

利用崭新的混合3D表达方式,DMTet能集合隐式和显式的3D表达。

  • 当前的隐式表达方法的做法,大多是被训练来拟合signed distance values。相比于它们,本论文直接优化重建的表面,从而能够用更少的物体来合成更细微的几何细节
  • 当前的显式表达方法的做法,大多是3D深度生成模型,直接生成显式表达,比如mesh。本论文能够合成有任意拓扑的物体形状。

相关概念

chamfer distance

https://www.cnblogs.com/ariel-dreamland/p/13225299.html

3D点云中的倒角距离
在这里插入图片描述
以上公式的S1,S2分别表示两组3D点云。

  1. 第一项代表S1中任意一点x 到S2 的最小距离之和
  2. 第二项则表示S2 中任意一点y 到S1 的最小距离之和。

如果该距离较大,则说明两组点云区别较大;如果距离较小,则说明重建效果较好。一般来说,该距离用作3D重建网络的损失函数。

DefTet

论文借鉴了DefTet的思路。

深度MT

3D表示

论文使用了以可变形的四面体编码的SDF来表示形状。网格将每个立方体给四面体化,每个单位都是有4个点和边的四面体。

  1. DefTet是用四面体上的occupancy来编码的,而本论文是用四面体各点的SD值来编码的。
  2. 使用SD值而不是occupancy值,可以为底层表面提供更多的灵活性。为了更好的效果,本文还会对表面作细分。
  3. 本文使用MT层,将基于SD的隐式表达转换为三角型的mesh。
  4. 最终mesh会被转换为具有可微细分表面模块的参数表面。

可变性四面体

本文利用了Gao的思路,用一组四面体来表示物体。每个四面体都由4个顶点的坐标来表示。每个顶点 v i v_i vi的SDF值为 s ( v i ) s(v_i) s(vi)。其内部任意一个点的SDF值为4个顶点的重心插值。

物体细分

本文会从粗到细地表示物体形状。本文定义了“表面四面体” T s u r f T_{surf} Tsurf,其判断方式为,看这个四面体的四个顶点是否有不同的SDF符号——如果符号不同,说明这个四面体与物体表面相交。本文细分了 T s u r f T_{surf} Tsurf和它的直接邻居,并通过在每条边上添加中点的方式增加分辨率。

下图是一个表面四面体(蓝色),在添加中点后,会被分为8个四面体(红色)。比如图中红色箭头所指的节点 v a c ′ v^{'}_{ac} vac,它的坐标是线段ac的中点,而SDF值为两者的平均值。

Figure 2: 物体细分: 每一个表面四面体,在添加中点后,会被分为8个四面体

将隐式和显式表达转换的MT算法(Marching Tetrahedra)

本文使用MT算法将编码的SDF转换为显式的三角形mesh。给定四面体顶点的SDF值 { s ( v a ) , s ( v b ) , s ( v c ) , s ( v d ) } \{ s(v_a),s(v_b),s(v_c),s(v_d) \} {s(va),s(vb),s(vc),s(vd)},MT会根据 s ( v ) s(v) s(v)的符号决定四面体内部的表面拓扑形状,如下图所示。

  1. 4个顶点的SDF符号组合有2^4=16种情况,如果考虑旋转对称性,它们都属于3种类别
  2. 当表面拓扑确定时,其表面的节点坐标就被计算出来了,坐落于四面体边上按线性插值取零界值的点。

如何理解第一句?比如下图:

  1. 第一种情况,4个节点的SDF符号都相同,都为正或者负,共2种情况。在这种情况下,物体表面并没有与该四面体相交,所以不需要提取mesh了。
  2. 第二种情况,4个节点的SDF符号有两个正和两个负,符合这个类别的符号情况有6种(四面体有6条边,每条边上的两个顶点都为负,视为一种情况,有6条边就有6种情况)。
  3. 第三种情况,符合这个类别的符号情况有8种(3正1负有4种,3负1正也有4种)
    ·
    三种情况加起来是2+6+8=16种情况。

如何理解第二句?我们看到,第一种情况下没有物体表面需要提取。第二、三种情况下,本文会猜测紫色的表面是那个物体表面,该表面的顶点都坐落在四面体边上。

以第三种情况为例, v a v_a va v b v_b vb的SDF符号相反,我们假设两点之间的SDF值是线性变化的,而mesh表面的SDF值都为0,所以我们猜测边ab的零界点 v a b ′ v_{ab}^{'} vab应该也位于mesh表面。

所以,第三种情况的3个零值点生成一个mesh表面,第二种情况的4个零值点会组成两个mesh表面。

零界点的意思如下图所示,一个曲线与0值线的相交点成为零界点,其wiki为Zero crossing。

零值点 v a b ′ v_{ab}^{'} vab是如何计算出来的?首先v_a和v_b的SDF值为 s ( v a ) s(v_a) s(va) s ( v b ) s(v_b) s(vb)
那么线段ab上任意一点 v c v_c vc的SDF值为 s ( v c ) s(v_c) s(vc),有 s ( v c ) = α s ( v a ) + ( 1 − α ) s ( v b ) s(v_c)=\alpha s(v_a) + (1-\alpha ) s(v_b) s(vc)=αs(va)+(1α)s(vb)
其中 α \alpha α v c v_c vc v a v_a va的距离比例,参考线性插值法 ,它也同时等于在x、y、z轴上映射的比例。

s ( v c ) = 0 s(v_c)=0 s(vc)=0,带入上式可得:

0 = α ( s ( v a ) − s ( v b ) ) + s ( v b ) α = s ( v b ) s ( v b ) − s ( v a ) , 1 − α = − s ( v a ) s ( v b ) − s ( v a ) \begin{aligned} 0 &= \alpha(s(v_a)-s(v_b)) + s(v_b) \\ \alpha &= \frac{s(v_b)}{s(v_b)-s(v_a)}, 1-\alpha = \frac{-s(v_a)}{s(v_b)-s(v_a)} \end{aligned} 0α=α(s(va)s(vb))+s(vb)=s(vb)s(va)s(vb),1α=s(vb)s(va)s(va)

α \alpha α取值带回上文,得到:
v a b ′ = α s ( v a ) + ( 1 − α ) s ( v b ) = s ( v b ) s ( v b ) − s ( v a ) v a + − s ( v a ) s ( v b ) − s ( v a ) v b = s ( v b ) v a − s ( v a ) v b s ( v b ) − s ( v a ) \begin{aligned} v_{ab}^{'}&= \alpha s(v_a) + (1-\alpha ) s(v_b) \\ &= \frac{s(v_b)}{s(v_b)-s(v_a)}v_a+ \frac{-s(v_a)}{s(v_b)-s(v_a)}v_b \\ &= \frac{s(v_b)v_a-s(v_a)v_b}{s(v_b)-s(v_a)} \end{aligned} vab=αs(va)+(1α)s(vb)=s(vb)s(va)s(vb)va+s(vb)s(va)s(va)vb=s(vb)s(va)s(vb)vas(va)vb
计算结果与论文中的公式一致。

有的论文认为当 s ( v a ) = s ( v b ) s(v_a)=s(v_b) s(va)=s(vb)时,会阻止物体面变化。但是本文发现,模型只会在两者不相等时才会计算,所以在训练时,模型能够根据损失计算梯度,回传到节点位置和SDF值。

表面细分

有了mesh后,我们可以使用表面细分模块进一步增强模型的生成能力。Loop Subdivision

Charles Loop. Smooth subdivision surfaces based on triangles。
论文地址 https://charlesloop.com/thesis.pdf

DMTet: 3D生成模型

该网络的输入为 x x x(点云或者粗体素),输出为高分辨率的3D mesh M M M

下图是DMTet的生成器和鉴别器架构。生成器有两部分,一部分使用MLP生成预测,另一部分使用GCN来细化表面。

损失函数

分为3部分,surface对齐损失、对抗损失、正则化损失。

采集点云,计算Chamber DIstance和normal direction loss
后者会找到点p以及相关的点q,以及它们所在mesh的法线,法线长度应当为1,计算它们的夹角cos值。cos越小越好,所以1-cos就是normal损失了。

根据Mesh Normals,在大部分情况下,当提到法线时,其长度都是单位1,因为我们只关心其方向,不关心长度。

The second thing worth mentioning is that n → \overrightarrow{n} n is not unit length. It’s length is proprtional to the area of the triangle. In most applications when we discuss normal vectors we assume that they have been normalized, since it only the direction we care about, not the length. However for what comes next it is useful to keep the length as is.

对抗损失采用LSGAN损失

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【手写 Promise 源码】第十八篇 - EventLoop 简介

theme: fancy 一,前言 近期公司项目比较忙,粘了老博客几篇 Spring 源码来充数,周末腾出时间把 Promise 做个收尾; 在开始 EventLoop 前,我对 Promise 源码部分进行了简单回顾,并更新了【Promise 源码学习…

【链表面试题】解决环形链表和相交链表问题

在力扣上发现这样的几道题,尝试做了一下,也发现了一个关于这类题的一种做法:快慢指针的使用。废话不多说,上例题 目录 一、环形链表 1.定义(概念) 2.如何判断是否为环形链表 1.快慢指针 2.为什么快指针…

限期出国|CSC资助赴世界top50名校英国曼彻斯特大学访学

我们先为J老师40天获得佐治亚理工学院(美国三大理工学院之一)的访问学者邀请函,又成功申报CSC。后因其担心被美国拒签要求重新申请英国名校,10天后拿到跻身世界top50英国曼彻斯特大学的offer,后经ATAS审批、CSC改派、使…

linux基本功系列-help命令实战

文章目录前言🚀🚀🚀一. help命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示某个命令的帮助信息3.2 查看某个命令的简述3.3 以伪man手册格式输出cd信息四. windows中的help总结前言🚀🚀🚀 想要学好Lin…

车载网络 - Autosar网络管理 - 基本概念

Autosar作为当前车载行业使用最为广泛的一种汽车开发系统架构,网上也有很多相关的介绍;不过我看很多有完整的来讲一下这个规范的,一般都是只讲了其中一部分,我这就准备搞出来一套完整版本的Autosar网络管理的规范、测试设计、自动…

新C++(7):多态那些事儿_下

"当人类悬浮到腐朽,有谁愿追随彗星漂流哦~"一、多态原理(1)虚函数表指针(虚表指针)紧接上一篇sizeof(Base)这一小段说起。class Base1 { public:void func(){} private:int _a; };class Base2 { public:virtual void func() {} private:int _a; };我们知道…

【我刚毕业,学习Java开发工程师能学会吗?没有基础?】

对于Java专业来说,学历还是有一定的要求。一般都是本科学历,至少也有个大专,其次就是年龄越年轻越好。现在转行Java的年轻人很多,学历这方面越高越有竞争力一些,尤其是在后期的职业晋升阶段。如果想走管理路线&#xf…

耗时一周整体,这4款黑科技电脑软件,功能强大到离谱

闲话少说,直上狠货。 1、有道云笔记 有道云这是一款国民级的文稿编辑器,俗话说得好,好记性不如烂笔头,强大实用的笔记软件,能让你的工作与学习事半功倍。5大文稿类型,让记录得心应手,随时进行创…

第十四章 集合(Set)

一、Set 接口(P518) 1. Set接口基本介绍 (1)无序(添加和取出的顺序不一致),没有索引 (2)不允许重复元素,所以最多包含一个 null 2. Set接口的常用方法 和 …

SpringBoot中MQ使用

本文记录学习在Spring Boot中使用MQ。一 什么是MQMQ全称(Message Queue)又名消息队列,是一种异步通讯的中间件。它的作用类似于邮局,发信人(生产者)只需要将信(消息)交给邮局,然后由邮局再将信(消息)发送给具体的接收者…

博途1200PLC/1500PLCMODBUS从站通信应用

博途PLC作为MODBUS主站通信请参看下面的文章链接: 博途PLC 1200/1500PLC MODBUS-RTU通讯优化(状态机编程)_博途plc modbus-rtu通信优化_RXXW_Dor的博客-CSDN博客博途PLC 1200/1500PLC MODBUS-RTU通讯_RXXW_Dor的博客-CSDN博客_博图modbus通讯1、1200PLC的modbus通讯,可以参看…

HTTP协议(1)

1)HTTP协议是倾向于相遇业务层次上面的一种协议,传输层协议主要考虑的是端对端之间的一个传输过程,TCP重点进行关注的是可靠传输;咱们的HTTP/1,HTTP/2是基于TCP的,但是咱们的HTTP/3是基于UDP的,但是当下的互…

实战动态代理

代理模式介绍代理模式有点像老大和小弟,也有点像分销商。主要解决的是问题是为某些资源的访问、对象的类的易用操作上提供方便使用的代理服务。而这种设计思想的模式经常会出现在我们的系统中,或者你用到过的组件中,它们都提供给你一种非常简…

【CVPR 2018】PU-Net: Point Cloud Upsampling Network

文章目录PU-Net: Point Cloud Upsampling Network网络架构训练数据生成点特征嵌入Feature ExpansionCfoordinate Reconstruction端到端训练Joint Loss FunctionPU-Net: Point Cloud Upsampling Network 网络架构 PU-Net有四个组件:patch extraction, point feature…

「自定义类型」C语言中的构造数据类型如结构,联合,枚举

​​​​​​​🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀目录 🐰结构 🏡 前言 🌸数据类型的定义 &…

SpringBoot动态导出word文档(完美实整教程 复制即可使用,不能实现你找我)

背景 最近有一个需求是需要动态导出合同、订单等信息,导出一个word文档供客户进行下载查看。 需要导出的word文件,主要可以分为两种类型。 导出固定内容和图片的word文档导出表格内容不固定的word文档 经过对比工具,我实践过两种实现方式…

一文细说引导内存分配器

一、引导内存分配器 1.引导内存分配器的作用 因为内核里面有很多内存结构体,不可能在静态编译阶段就静态初始化所有的这些内存结构体。另外,在系统启动过程中,系统启动后的物理内存分配器本身也需要初始化,如伙伴分配器&#xff…

OD笔试题-空汽水瓶可以换汽水

/*** 某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水&#xff0c;允许向老板借空汽水瓶&#xff08;但是必须要归还&#xff09;。* 小张手上有n个空汽水瓶&#xff0c;她想知道自己最多可以喝到多少瓶汽水。* 数据范围&#xff1a;输入的正整数满足 1≤n≤100* <p>*…

springboot 多环境配置yml

创建多个配置文件 创建文件时注意&#xff0c;一定是 application-文件名称.yml 这种格式 application.yml #主配置文件 application-dev.yml #开发环境的配置 application-prod.yml #生产环境的配置application-prod.yml # 生产环境端口为90 server:port: 90applica…

Python实现将一段话txt生成字幕srt文件

Python实现将一段话txt生成字幕srt文件 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、为什么要将txt转换成字幕 1.1方便到剪辑软件剪辑 有时获取到一段文本&#xff0c;想要直…