论文:SparseFlex: High-Resolution and Arbitrary-Topology 3D Shape Modeling
arXiv:2503.21732
项目主页:https://github.com/VAST-AI-Research/TripoSF
Conclusion
用“稀疏等值面 + 视锥裁剪”,可以在不做 watertight 预处理的情况下,用渲染监督训练出超高分辨率、支持任意拓扑(开口+内部)的高质量 3D mesh
所以这篇论文是在解决什么呢,在论文的第一句话就提到了,是要做”high-fidelity 3D meshes with arbitrary topology”。
methods
稀疏等值面
从FlexCubes(使mesh可微,这是SparseFlex的前提,所以不用别的Marching cubes)出发,把密集体素网格改为了稀疏体素网格
稀疏等值面指只在surface附近存和算mesh,0人care空的地方
看到这里觉得和MeshFormer有点像,但是仔细探索了一下发现MeshFormer的sparse主要是用来省特征计算
SparseFlex就要激进一些,几何表示本身就是稀疏体素几何,只在表面附近存SDF/参数,当然,等值面提取也是在表面附近
视锥裁剪
视锥裁剪指 已知相机,只激活相机看到的体素,其他的0care,只激活视锥里的那部分体素做等值面提取+渲染,裁掉了几何计算本身
本质上算是分块训练,每一步训练的是一块3D空间,得靠多视角和多步来覆盖全体。不止是单纯加速技巧,更算是高分辨率渲染监督能跑起来的必要条件了
如果把相机放进物体内的话,就能用渲染监督到内部结构,这也是为什么论文提到生成的mesh可以照顾到内部结构
VAE
论文提到作者他们训练了一个SparseFlex VAE:
输入为包括normal的点云,voxelize得到结构
编码通过PointNet(请自行了解下另外一篇专门讲这个的论文哈,大概就是把点转化为几何描述)和稀疏transformer将输入转化成latent
解码靠transformer和线性层输出 SDF、插值权重等参数
不够VAE的目的并不是压缩3D,是在latent层面保留可还原为high-resolution mesh的结构化信息,所以decoder输出的是SparseFlex参数
自剪枝上采样
分辨率变高的同时,自动把没用的细分体素删掉
两级upsampling把体素细分到1024^3
损失
主要是以渲染监督为主,渲染监督不需要watertight,还挺合适的
Pipeline
training样本3D mesh(采样)
surface 点云 + Normal (体素化)
Sparse Voxel(PointNet/MLP)
Sparse Voxel+体素特征集合(稀疏transformer编码器)
latent code(transformer解码器)
SparseFlex参数(upsampling)
high-resolution voxel(视锥分块激活)
视锥内的Voxel(等值面提取FlexiCubes)
局部mesh(可微渲染)
深度图、法线图、mask等(计算loss并backward)
L_render,L_KL,L_prune,L_flex(progressive)
先训 256,再 512,再 1024 这种逐级升分辨率
idea
最近看的几篇mesh生成有关的paper,和以前的传统路径对比了一下,都比较看重把mesh当mesh处理,而不是当作比如NeRF这种路线,3D会更像是体渲染出来的产物
但是这里问题来了,用的是渲染监督这种2D观测的loss方法,但是3D里的很多东西在2D中是不唯一的,所以我觉得可能会有歧义(所有基于2D观测的3D学习方法应该都有这个问题),但是这种方式专门针对视觉表现,我觉得视觉的表现上应该不会有多大问题,那么有问题的地方就会是mesh的结构,如果需要一个全局体一致性的mesh,我觉得SparseFlex不够好(虽然也不是为了这方面设计的)。反过来看的话,在“看”这方面出彩,在游戏/电影/特效上应该会有更好的发挥。
这种取舍并没有让SparseFlex变成一种三流方法,而是更多的保障了可见正确性,算是更符合视觉资产生成任务的需求吧。