狗都能看懂的HunYuan3D 1.0详解
HunYuan3D 1.0
HunYuan3D 1.0是2024年9月发布的一篇论文。虽然站在现在的时间节点,HunYuan3D系列已经出到2.5了,但是1.0版本的改进思路,和它trick集成的做法,还是很值得学习的。由于文章用到了很多技术,由于篇幅有限,部分技术只会简单讲解,尽可能了解HunYuan3D 1.0的主要技术。
引言
3D生成在CV与CG界一直是热门方向。早期的工作,做“无条件的类别内生成”(例如只生成椅子、只生成车等),受限于3D表征(体素、点云等)和数据规模。近年来,LLM、图像/视频生成通过“规模法则”取得巨大成功,给3D指明了方向。但3D资产非常复杂,且数据稀缺:最大的公开3D数据集Objaverse-xl仅1000万条,远少于文本/图像/视频数据。因此,借助2D生成模型先验(2D prior)成为一条可行捷径。
DreamFusion首次提出用SDS(Score Distillation Sampling)把2D扩散模型的知识蒸馏到NeRF,开创了“2D升3D”路线。但DreamFusion存在颜色过饱和与优化极慢(几十分钟到一小时)的问题。为了提升效率,后续的工作集中在:
- 提升采样效率(如ProlificDreamer);
- 把普通扩散模型微调成“多视角扩散模型”;
- 用更直接的渲染损失替代SDS损失。
然而,上述方法仍属于“逐物体优化”(per-shape optimization),耗时依旧。虽然已有单独研究“多视角扩散”(主要是以Zero-1-to-3为代表)或“稀疏视角重建”(Instant-mesh,Viewfusion这两个没怎么了解过),但缺少统一框架解决两者联合难点。两个比较大的痛点是:
- 多视角扩散模型跨视角不一致+去噪慢;
- 稀疏视角重建模型仅用已知视角RGB,信息不足。
HunYuan3D 1.0,把两者优势融合,最快10秒完成3D生成,在泛化性与质量间找到平衡。
方法
HunYuan3D 1.0是一个二阶段模型。
第一阶段:用多视角扩散模型做“2D升3D”。在大规模2D扩散模型基础上微调,使其具备3D先验。所有视角仰角为0°(水平环绕),最大化视角重叠区域,降低重建难度。
第二阶段:用稀疏视角重建模型从“不完美一致”的多视角图中恢复3D形状。额外把原始条件图(输入图)作为无姿态辅助视角,补全未见区域(这个方法也是Zero-1-to-3++为了弥补Zero-1-to-3的一个缺陷而提出的,后面会展开讲解)用线性unpatchify超分提升细节,不增加显存/计算量。
整个模型和流程如下图所示:
第一阶段
输入单张RGB或者文本/prompt,论文是图片,我们还是用图片讲解。分辨率为512×512(推理时固定)。背景为默认白底,方便后面分割(我感觉这个挺重要的,但没有实际测过不是白底的结果)。
多视角改进
Multi-View Diffusion是多视角扩散模型,通过输入一张RGB图像和噪声,重建为6张图,方位角为{0,60,120,180,240,300},仰角0°。我们看图上绿色的大框,除了输入噪声,还有一个condition。这个是复用Zero-1-to-3++的“大图拼接”思路Reference Attention机制,把条件图(输入图)的K/V注入到U-Net的自注意力层,确保纹理、语义一致。(具体可以看Zero-1-to-3++论文里的参考图)同时把backbone换成3×更大的SD-XL。Condition Image的潜变量充分利用了SD模型的先验知识。
6个视角的生成原则也是参考了Zero-1-to-3++的方法。主要是针对Zero-1-to-3输入单一视角,然后输出其他视角的结果方案缺陷的一个改善。虽然Zero-1-to-3是想通过相机角度来控制生成不同角度的图片。但这样的结果缺乏一致性,即物体的其他角度要么很模糊,要么很没逻辑(比如人有两个头)。后面也有不少工作提出了解决方法,但这边只集中说一下Zero-1-to-3++的改进方法。
我们可以看到Zero-1-to-3++的方法是,针对一个物体生成6个固定角度的决定视角。即垂直方向有30°和-20°(固定的),然后水平角度从30°到330°(可变的)。这里有个关键点,为了生成这个固定角度的绝对视角,我们要知道某个输入图片的相机视角,不然你生成的结果视角是相对的,就会造成结果是模糊甚至完全不对的。所以是需要有一个相机视角的估测模块。那么Zero-1-to-3++也就引用了One-2-3-45的方法。同时One-2-3-45当时也分析了,如果给定一个错误的相机视角去给NeRF渲染,其结果就是完全不对的(第四列/第五列)。即水平方向偏移正负30°,模拟错误估计的情况或没有相机视角估测模块的情况。One-2-3-45之前阅读过,也写了博客总结,但当时没怎么理解清楚,现在看到HunYuan3D 1.0引用了它,总算搞清楚了。
所以HunYuan3D 1.0主要是参考了Zero-1-to-3++的方法,将多视角生成引入了到它们的模型中。它分成两个模型,Lite版输出960×640(3×2网格)。Standard版输出1536×1024,细节更锐利。
自适应CFG
cfg是用来控制结果与条件的相关性的。作者发现,在多视角场景下,cfg系数的大小与结果有个特殊矛盾:
- 小CFG:纹理细节好,但可能出现伪影;
- 大CFG:几何形状好,但纹理过平滑、颜色暗淡;
于是作者深入研究,进一步发现,不同视角对CFG的敏感度不一样:
- 前视角离输入图近,高CFG能保留细节;
- 后视角离输入图远,高CFG反而导致“复制粘贴”前视角内容,出现阴影/过暗;
所以作者提出,“时间+视角”二维方案自适应CFG:
- 前视角/早期time steps:CFG高,细节好;
- 后视角/后期time steps:CFG逐渐降低,避免过度约束,保证多样性;
第二阶段
第二阶段主要负责把稀疏视角的图片转换成可用的3D网格。现有大模型(LRM、TripoSR、Instant3D)只用1~3张已知姿态图。
已知姿态分支:6张生成图带有相机嵌入(position-encoding)。但问题是,0°仰角直接输入到模型,会导致顶部/底部盲区,进而导致重建容易“压扁”或“空洞”。为了解决这个方法,作者再开一条**“无姿态分支”。把原始输入图(条件图)过CNN提特征。在Transformer的cross-attention里,把它的相机嵌入设为全零向量**,告诉网络“这张图没有姿态”。于是网络能区分“有姿态的生成图”和“无姿态的条件图”,并利用后者补全盲区。也即论文中图2蓝色方框里的内容。
混合输入
里面的Condition是原始输入图(无姿态)直接送入DINO编码器,提供顶部/底部盲区信息,无相机姿态。Generation是6张不同视角的输入图(即第一阶段的生成结果)分别过DINO编码器和Pose Embedding,提供已知姿态的稠密视角信息
轻量超分模块
现有transformer重建习惯用64×64三平面(triplane)导致细节不足、锯齿明显。所以常见的方法是直接放大到256×256,但这样会平方级涨显存,不可取。作者参考了Meshlrm和Gs-lrm的工作,加入了一个三平面的超分模块。
- 先常规得到64×64×1024的triplane token
- 用单层线性映射把每个token扩成4×4=16个高分辨率token
- 通道从1024降到120,分辨率64变为256
这样的好处是复杂度O(N),无需在高分辨率上做self-attention,显存友好。而且论文也放出了对比结果,可以看到打开超分后,几何边缘、纹理细节明显锐利。
显式3D表示
作者观点,隐式表示(NeRF、Gaussian Splatting)不是终点,因为需要额外提取网格才能进游戏/影视管线。提取过程可能丢细节、引入伪影。所以采用了SDF表达表面,方便可微渲染训练。但是我这里的吐槽一下,你1.0说Gaussian Splatting不好用,结果2.0直接就用上了Gaussian Splatting,人人都笑阿诺,结果人人都是阿诺。
最后有了SDF的结果,直接用MarchingCubes提取网格,一次性得到带UV的三角面片,生成0-1纹理坐标。最后做一个TextureBaking把6视角颜色投影到UV,生成1024²贴图,就可直接输出.obj
+.mtl
+纹理图了。
实现细节
一般论文我不会去关注实现的细节,但是腾讯毕竟是大公司,除了人才济济,设备/数据也是顶级的。其数据源就已经是独一档的,腾讯内部超大规模 3D 数据集,量级与 Objaverse 相当/更大。他们对数据进行了清洗,删掉“复杂多物体场景”;删掉“无纹理或纹理错误”;删掉“几何畸变严重”。所有物体归一化到 单位球内(半径=1),方便相机参数固定。不过听作者的描述,好像是没开源的数据集。
其训练阶段,采用的是两阶段独立训练(无端到端联合)。多视角扩散 backbone分成了两个版本的模型:
- Lite:SD-2.1(≈0.9 B 参数)
- Standard:SD-XL(≈3.5 B 参数)
条件图训练时随机 256~512,推理固定512。目标图统一缩到 320×320(降低显存)。重建模型 backbone:
- 图像编码: frozen DINOv2(ViT-L)理解能力已经很强了,直接复用;
- 中间表示:tri-plane(三正交特征平面),并且采用两阶段的训练trick。先 256×256 训练,快速收敛。再 512×512 微调,提升细节;
结果对比
作者设计了两种实验进行分析,一个是定量对比,在固定的指标上对比,比如F1和CD,可量化的结果。第二种是定性视觉对比,就找几个有代表性的物体(如箱子,椅子,杯子等)来对比,最后一个是,用户主观研究,找了30个人对20个物体进行5个指标的投票。反正结果看下图,碾压当前所有的SOTA,基本五边形战士,就连Lite模型也很能打。
最后是推理时间的分析,在A100上。两个模型的时间分别是,Lite:≈ 10 s,Std:≈ 25 s。这是纯推理的时间,如果加上后处理(UV展开+贴图烘焙):额外 +15 s(可选)。