如何对已有的3D白膜生成纹理(即进行上色)是计算机视觉领域一个重要的领域,主要效果就如下图所示:

3D Mesh上色示意图(原图来自论文TEXTure)

这项技术能够帮助我们对同一个mesh生成不同风格/色调的"外衣",对于扩充mesh的丰富性和可用性具有重要意义,这里就简单介绍一下最近读的4篇mesh上色的工作。

【1】TEXTure: Text-Guided Texturing of 3D Shapes

项目主页】【论文】【代码

先贴上论文中给出的算法流程吧:

TEXTure算法流程
  • 算法流程: 该算法借助当前在2D图像领域大火的Diffusion技术,在视角空间对mesh前景生成纹理,然后通过可微分渲染的方式的方式将视角空间的纹理一点点"贴"回mesh

  • 算法细节:

    • 首先要知道的是:该算法没有任何需要训练的网络结构,它最需要更新的参数就是我们最终需要的"Texture Img"(其实在其代码中还有一个"Meta Texture Img"是用于辅助效果优化的,最终我们不会用到),其通过一个初始化的方式将初始化为纯色的"Texture Img"不断更新其中的纹理。

    • 使用Stable Diffusion下depth-based的Inpainting模型,从depth图和mask图生成视角空间下的纹理,然后转动mesh得到另一个视角图,再对新视角下没有上色的区域进行"补全"。

    • 使用可微分渲染并配合MSE损失将生成的已经上色的视角图像一点点"贴"回mesh上

    • 提出了Tripmap的概念,在对新视角进行纹理"补全"的时候,将补全的区域分成了三个部分: "Keep"保留在之前视角就已经上色过的区域; "Generate"对在当前视角下第一次出现的区域进行纹理生成; "Refine"使用法向进行过滤得到需要精修额区域(一般是边缘部分)

  • 算法应用:基于text的纹理生成、纹理迁移、纹理编辑

  • 算法优势和劣势:

    该算法因为我实际跑过并且针对性地做过一些优化,所以这里我可以稍微总结以下其优点和存在的问题

    • 优势:
      • 算法简单有效,不需要太多的3D知识,借助丰富强大的2D图像生成技术进行纹理生成
      • 直接对最终的目标-Texture Img进行更新优化,没有需要训练的网络参数
    • 劣势:
      • 需要使用Diffusion技术对每个视角进行渲染,碍于Diffusion的速度问题,所以也会导致该算法运行速度较慢(论文中提到了在8个视角和每次可微渲染200步的情况下需要5分钟左右)
      • 可微渲染带来的问题:这里使用可微渲染不断迭代更新"Texture Img",首先速度是一个问题上面提过就不多说,其次其效果也是一个大问题,其无法将上色后的视角图百分百地"贴"回mesh上,即存在重建误差。其次可微渲染会带来一些数值溢出的问题导致最终生成的结果存在比较明显的"绿点",这在其Issue中也被提到过。
      • 其计算新视角中没被上色过的区域是有问题的,导致最终最终结果会保留Texture Img的初始色-这里是紫色,这个问题也在Issue中也被提到过。
      针对上面的劣势,我通过优化贴图方式不仅使得性能有15倍的提升,而且能够很好解决"绿点"和"紫色"的伪影问题!!

【2】Text2Tex: Text-driven Texture Synthesis via Diffusion Models

项目主页】【论文】【代码(未开源)

Text2Tex算法流程
  • 算法流程: 这篇论文的主要思路和上一篇TEXTure算法的思路整体是比较接近的,总体流程也是借助2D Diffusion对视角图进行上色然后反贴回Mesh,但是其多了一个基于视角自动选择的refine过程

  • 算法细节:

    • 该算法主要分成两个阶段:

      • 生成阶段: 和上篇论文一样,基于Depth-based Inpainting的Diffusion模型并配合ControlNet对视角图进行上色,然后反贴回Texture Img。
      • 微调阶段: 使用自动视角选择来决定下一个需要被上色渲染的视角,然后对生成阶段的结果微调精修
    • 该算法指出使用Inpainting算法的劣势在于其是结果依赖的,即当前的inpainting是依赖于之前生成结果的,这会导致如果之前某一步存在误差(比如在边缘部分存在了拉伸),那么会不断累积到后面的步骤,导致最终的结果很差。这也是提出"自动视角选择"的主要原因。

    • 其针对在每个视角下的区域进行了类似TEXTure算法的划分方法:

      • "New"区域: 没被之前任何一个视角看过,即当前视角下第一次见到,每个像素的denoise强度为1
      •  "Update"区域: 在之前的视角下被看到过,但在当前视角下被"观察地更好",可理解为正对相机方向,denoise强度中等
      • "keep"区域: 在之前的视角下被看到过了,且在当前视角下也不是最佳观察视角,denoise强度为0
      • "Ignore"区域: 背景区域,忽视不予考虑

      (Denoise强度在0~1范围,表明Diffusion生成的结果与原图的关联性,1表示没任何关联,完全从噪声生成,靠近0则表示会借鉴原地图的信息,生成的结果也会与地图有比较大的关联)

    • 视角自动选择:

      • 解决的问题: 生成阶段的结果其实是会存在伪影的,尤其视角边缘在inpainting的时候会出现接缝和拉伸,虽然增加视角数目在一定程度上能缓解该问题,但是其导致的性能下降和各种模型的复杂性也使得其不是一个优雅且真的有效的方法,视角自动选择的出现则就是为了解决该问题出现的。
      • 选择流程: 先预设大量视角集合(远多于生成阶段的视角数目),计算每个视角下的"view heat"并依次选择值最大的那个视角作为下一个渲染上色的视角,其中"view heat"可以理解为当前视角下所有前景元素的denoise强度的和。其实简单理解就是:在生成阶段肯定没办法保证mesh的每个部分都被渲染到,那么就优先选择那些“未被上色区域”占比较大的视角进行refine。
      • 具体参数: 在生成阶段使用了6个视角,在微调阶段使用了36个预设视角。

【3】Texturify: Generating Textures on 3D Shape Surfaces

项目主页】【论文】【代码

Texturify算法流程

这篇算法是属于GAN时代的3D白膜上色方案,和前两个算法完全不同。

  • 算法流程: 直接使用latent code和3D mesh作为输入送入到一个Encoder-StyleGAN的网络结构,然后生成一个上色好的mesh,在通过可微渲染得到一些视角图像,再利用两个判别器对生成的视角图像和真实图像进行对抗,优化全局和局部细节。
  • 算法细节:
    • 该方法只需要2D图像作为监督,但是这些图像必须是同一类的(如都是桌子或者都是椅子等,这可能是受限于StyleGAN吧),直接在3D mesh表面生成纹理(具体是顶点着色还是纹理上色这里没太搞懂~)。
    • 作者觉得不在UV空间生成纹理,主要因为两方面原因:1.mesh上相邻区域在UV空间不一定相邻. 2.可能会导致接缝
    • 使用4-RoSy(4-way rotationally symmetric)方法将mesh的三角面片变成4角面片,4面片有利于在保证相邻性和最大程度减少mesh信息丢失情况下,能够支持Face Conv(下面会介绍)
    • Face Conv: 作者提出的一个直接对3D mesh进行卷积的操作,其对当前面片加上周围8个面片进行加权平均作为本次卷积结果。
    • 在四面片mesh上进行卷积和池化,能够提供不同细粒度的特征(表现在mesh上就是不同粗细的面片)
    • 两个判别器:
      • 全局判别器:直接对整张图进行判别,提升问题整体的真实性
      • 局部判别器:对局部crop出来的区域进行判别,有助于提升局部纹理的一致性
  • 算法优劣:
    • 优势:一次性直接在mesh上生成纹理(不会想上面两个方法一样一步步将视角"贴"回UV),能减少边缘处的拉伸和缝隙
    • 劣势:一个模型只能对一类mesh进行上色

【4】Learning Texture Generators for 3D Shape Collections from Internet Photo Sets

项目主页(无)】【论文】【代码

TexGAN算法流程

这也是在GAN时代的一篇白膜上色文章。

  • 算法流程:

    对3D mesh进行UV参数化得到Texture,提取其中纹理区域的轮廓/Mask并对纹理区域直接生成纹理,利用生成后的纹理贴到mesh上并渲染得到各个视角,在视角空间下进行判别和对抗

  • 算法细节:

    • 使用一种比较特殊的纹理展开方法,保证原mesh上相邻的区域尽量在UV中也是相邻的(如上图中将车的前后左右上下视角整体展开,这里可以称UV中每个区域是一个chart)

    • 使用SPADE-In方法和StyleGAN为主要框架,以轮廓图/Mask为条件输入,进行纹理填充/生成

    • 对每一个视角都有一个专门的判别器,并使用相同视角的真实图作为正例进行对抗学习,其中这些视角要有一定的重合区域,不然可能会导致一致性差

    • 对轮廓图做随机背景处理,避免生成器忽视轮廓直接用纯色背景填充轮廓

    • 使用同一份StyleGAN权重生成UV空间下不同的chart(这里指的是上图中的Generated texture),其中不同chart是利用StyleGAN中constant input设定不同的值实现的

    • 代理图像生成(Proxy Image Generation): 使用部分真实图的轮廓配合latent code生成chart,这是为了保证了StyleGAN也具备生成其他角度(非预设)chart图的能力,提升多样性避免模式崩塌。(但是真实推理的时候应该只是会生成前后左右上下这6个方位的chart图)

  • 算法优劣:

    • 优势:使用特殊UV参数化最大程度保证mesh在UV空间的连续性,而且在UV空间上色,还是比较新颖的做法
    • 劣势:一个模型只能生成一类物体mesh,通用性弱;其次需要筛选每个真实图像的角度以送到不同的判别器(这还是比较耗时的)

【其他论文】

✅ 2023.7.17 补充

算法架构 解释
Text2Room
Text2Room-Extracting Textured 3D Meshes from 2D Text-to-Image Models
●在室内场景生成texuture和mesh,通过预训练好的2D text2image 模型生成多视角图像,然后使用预定制好的视角选择策略将这些视角无缝连接在一起。
●从当前渲染图也生成部分depth,并通过对depth补全和对齐,确保接缝处的一致性
●二阶段的视角选择:
○生成阶段: 选择未被观测区域最大的那个轨迹
○补全阶段: 相机专门看向空洞区域,补全空洞
Text-guided High-definition Consistency Texture Model
Text-guided High-definition Consistency Texture Model
总体思路感觉和TEXTure比较接近。作者认为仅仅使用prompt生成不同视角一致性差问题在于prompt的广泛性和模糊性,于是:
●使用textural inversion代替一般prompt指导图像生成
●使用LoRA进一步提升细节一致性
使用局部光照模型保证在rendering时候减少光照影响
耗时过程,每次上色总过程需要20分钟左右
Generating Texture for 3D Human Avatar from a Single Image using Sampling and Refinement Networks
Generating Texture for 3D Human Avatar from a Single Image using Sampling and Refinement Networks
单张图通过先DensePose和Tex2Shape得到SMPL模型的UV坐标映射,然后采用二阶段的纹理生成方式:
●SamplerNet从可见的区域做粗略的纹理填充(L1损失+LPIPS损失)
●RefinerNet对一阶段的“粗”纹理进行微调(L1损失+VGG损失+GAN损失+FM损失)
最终使用一个mask对两个阶段的结果进行blend。同时论文中还是用了"Curriculum Learning"的方法逐步增加训练难度提升生成效果

总结

  • 仅仅对已有mesh进行上色的论文相对较少,通常是结合text-2-3D一起生成mesh和纹理(如Text2MeshZero-1-to-3等),现有基于Diffusion方法进行纹理上色基本思路就是:视角空间上色然后映射反贴到mesh上
  • 基于GAN的方法则相对来说比较繁杂而且会有显示的网络训练过程,而且如果是利用StyleGAN作为生成框架,还会存在单一性的问题,再此外还需要专门设计很多trick。
  • 基于GAN的方法通常会在视角空间进行对抗训练,提升生成纹理的细节质量和一致性