当前位置: 首页 > ds >正文

狗都能看懂的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超分提升细节,不增加显存/计算量。

整个模型和流程如下图所示:

F2.png

第一阶段

输入单张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模型的先验知识。

F6.png

6个视角的生成原则也是参考了Zero-1-to-3++的方法。主要是针对Zero-1-to-3输入单一视角,然后输出其他视角的结果方案缺陷的一个改善。虽然Zero-1-to-3是想通过相机角度来控制生成不同角度的图片。但这样的结果缺乏一致性,即物体的其他角度要么很模糊,要么很没逻辑(比如人有两个头)。后面也有不少工作提出了解决方法,但这边只集中说一下Zero-1-to-3++的改进方法。

F2__.png

我们可以看到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引用了它,总算搞清楚了。

F10.png

所以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的工作,加入了一个三平面的超分模块。

  1. 先常规得到64×64×1024的triplane token
  2. 单层线性映射把每个token扩成4×4=16个高分辨率token
  3. 通道从1024降到120,分辨率64变为256

这样的好处是复杂度O(N),无需在高分辨率上做self-attention,显存友好。而且论文也放出了对比结果,可以看到打开超分后,几何边缘、纹理细节明显锐利。

F3.png

显式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模型也很能打。

F5.png

最后是推理时间的分析,在A100上。两个模型的时间分别是,Lite:≈ 10 s,Std:≈ 25 s。这是纯推理的时间,如果加上后处理(UV展开+贴图烘焙):额外 +15 s(可选)。

http://www.xdnf.cn/news/20245.html

相关文章:

  • 一种基于注解与AOP的Spring Boot接口限流防刷方案
  • C#海康车牌识别实战指南带源码
  • VAE(变分自动编码器)技术解析
  • iOS混淆工具实战 在线教育直播类 App 的课程与互动安全防护
  • FairGuard游戏加固产品常见问题解答
  • 云市场周报 (2025.09.05):解读腾讯云AI安全、阿里数据湖与KubeVela
  • C语言中常见的数据结构及其代码实现
  • 数据传输优化-异步不阻塞处理增强首屏体验
  • 自演化大语言模型的技术背景
  • 心理学家称AI大模型交流正在引发前所未见的精神障碍
  • 手把手教你用CUDA Graph:将你的LLM推理延迟降低一个数量级
  • 51单片机------中断系统
  • 51单片机基础day3
  • 开源混合专家大语言模型(DBRX)
  • Spring WebFlux 流式数据拉取与推送的实现
  • UIViewController生命周期
  • Word封面对齐技巧(自制)
  • UE4 UAT 的六大流程 build cook stage pacakge archive deploy 与UAT的参数
  • 硬件(二) 中断、定时器、PWM
  • 当电力设计遇上AI:良策金宝AI如何重构行业效率边界?
  • Linux2.6内核进程O(1)调度队列
  • 电机控制(三)-电机控制方法基础
  • Java集合---Collection接口和Map接口
  • C++:类和对象(中)
  • 在线测评系统---第n天
  • 执行select * from a where rownum<1;,数据库子进程崩溃,业务中断。
  • LabVIEW--二维数组、三维数组、四维数组
  • Pydantic模型验证测试:你的API数据真的安全吗?
  • Selenium 页面加载超时pageLoadTimeout与 iframe加载关系解析
  • 静态电流Iq 和 ICONT_MAX