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.pswp.cn/pingmian/95760.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95760.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95760.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

踏脚迈入奇幻乐园

每天早上上班的路上都会经过一个小花园。它被夹在丁字路口的拐角,面积不大,匆匆而过的行人都不会注意到它。但如果顺着几个不起眼的入口走进去,里面却是别有洞天。清早的街道还没有车水马龙的喧哗,花园里静悄悄的。各式各样的花草…

内存越界引发线程函数调用堆栈回溯异常以及INT 3软中断实战分析案例分享

目录 1、问题说明 2、导出dump文件时只是遇到了INT 3软中断,并没有发生异常崩溃 3、函数中发生了栈内存越界,导致线程的栈回溯出异常,堆栈中只显示一行函数调用记录 3.1、处理Json数据时产生了异常 3.2、函数中发生栈内存越界&#xff0…

LeetCode 240: 搜索二维矩阵 II - 算法详解(秒懂系列

文章目录LeetCode 240: 搜索二维矩阵 II - 算法详解题目描述Java解决方案算法思路核心理念为什么选择右上角?可视化演示过程示例1:查找 target 5示例2:查找 target 20 (不存在)算法分析时间复杂度空间复杂度算法优势关键要点扩展思考LeetCo…

洛谷 B4071 [GESP202412 五级] 武器强化

思考难度低,但是代码难度相对较高的题,故做个记录。首先,题目说了要花费最少的钱,所以我们每次拿最便宜的材料给武器1思想:每次都拿最便宜的材料然后考虑一下这个思想是否正确,找一下反例,每次拿…

SQL工具30年演进史:从Oracle到Navicat、DBeaver,再到Web原生SQLynx

目录 一、1990s:厂商自带的数据库工具时代 二、2000s:Navicat等商业数据库管理工具崛起 三、2010s:DBeaver等开源SQL工具兴起 四、2020s:SQLynx,Web原生数据库管理工具 五、SQL工具30年时间线对比 六、总结&…

C语言制作扫雷游戏(拓展版赋源码)

目录 引言: 三个新功能实现 1.可以选择难度或自定义 实现难点解析 代码实现(附源码) 扫雷.c game.h game.c 2.对选择位置进行标记或取消标记 一.框架 我们先理一下思路 如何构造框架 二.取消标记函数 三.标记函数 四.加入清屏,进…

Python快速入门专业版(十):字符串特殊操作:去除空格、判断类型与编码转换

目录引1.去除空格:清理字符串的实用技巧1.1 三类去空格方法:strip()、lstrip()、rstrip()1.2 实战案例:处理用户输入的空格问题2.判断类型:验证字符串内容的特性2.1 常用类型判断方法2.2 实战案例:验证用户输入的合法性…

Gamma AI:AI演示文稿制作工具,高效解决PPT框架搭建难与排版耗时问题

你做 PPT 的时候是不是也常陷入 “两难”?要么对着空白幻灯片发呆,不知道怎么搭框架 —— 比如要做 “产品季度迭代复盘”,既想放数据又想讲问题,结果页面堆得像乱炖;要么好不容易凑完内容,又花两小时调排版…

【应用案例】AI 给医用过滤器 “找茬”:3 大难点 + 全流程解决方案

【应用案例】AI 给医用过滤器 “找茬”:3 大难点 全流程解决方案🎯医用过滤器进行医疗AI检测🎯先看痛点:医用过滤器检测难在哪?🎯AI检测方案:3步实现“零漏检”1. 硬件定制:让缺陷“…

【数据库相关】TxSQL新增数据库节点步骤

TxSQL新增数据库节点步骤准备工作与注意事项具体操作步骤第 1 步:在主库上创建复制专用账号第 2 步:对主库进行锁表并获取二进制日志坐标第 3 步:备份主库数据并传输到新从库第 4 步:主库解锁第 5 步:在新从库服务器上…

Jmeter快速安装配置全指南

1、JDK安装(Java Development Kit) 1.1.JDK下载 JDK下载址: Java Downloads | Oracle (jdk-8u211-windows-x64.exe) Android 基于 Java 语言开发,所以必须安装Java环境,Java 环境分JDK 和JRE ,JDK提…

设计模式最佳实践 - 模板模式 + 责任链模式

废话不多说,直接切入正题,本篇要讲的是 模板模式 责任链模式 实践。该最佳实践本身就是一种对 责任链模式的增强,模板模式通过 父类 强耦合,预定义好 责任链 next 方法 的前后一些切面行为,优雅简洁。先上示例&#x…

Python快速入门专业版(十一):布尔值与None:Python中的“真假”与“空值”(附逻辑判断案例)

目录引言:为什么“真假”与“空值”是编程的核心逻辑1.布尔值(bool):Python中的“真”与“假”1.1 布尔值的基础特性1.2 布尔运算:and、or、not的逻辑规则代码示例:基础布尔运算进阶特性:短路求…

C++学习知识小结

1. 什么是类?什么是对象?两者之间什么关系? 类是一类事物的共同特征的抽象描述,它定义这类所有的属性和方法 可以理解为模版类本身不占用空间,它只是一种定义,描述了对象一个是什么样子、能做什么 对象是根…

9. Mono项目与Unity的关系

1.Mono项目简介 2.Mono项目与Unity是如何结合的 3.从Mono到IL2CPP演变过程1.Mono项目简介 1).定义Mono是一个自由、开源的项目, 由Xamarin现属于微软主导开发; 它的目标是创建一个一套兼容于微软.NET Framework 的跨平台工具2).核心功能a.C#编译器能将你写的C#代码编译成IL(中间…

谷歌Genie 3:让你的照片变成可以玩的游戏世界

你是否曾凝视着一张完美的旅行照片,想象着如果能走进那个画面,自由探索会是怎样一种体验?或者,你是否曾被一幅画的奇幻氛围所吸引,渴望能在那片色彩斑斓的世界里奔跑跳跃?过去,这只是白日梦。而…

Cursor 提示词探索——如何打造真正懂自己的Agent

最近看到鱼皮的Cursor提示词分享(微信公众平台),刚好之前也在做Agent开发,跟提示词打交道的多,也经常发现 ai 蠢蠢的,一点不会根据提示词设计的来,按鱼皮的分享研究了一下,写了这篇博客。 Curs…

C++ 内存模型:用生活中的例子理解并发编程

C 内存模型:用生活中的例子理解并发编程 文章目录C 内存模型:用生活中的例子理解并发编程引言:为什么需要内存模型?核心概念:改动序列原子类型:不可分割的操作内存次序:不同的同步级别1. 宽松次…

AI急速搭建网站:Gemini、Bolt或Jules、GitHub、Cloudflare Pages实战全流程!

文章目录AI急速搭建网站:Gemini、Bolt或Jules、GitHub、Cloudflare Pages实战全流程!🚀 极速建站新范式:Gemini、Bolt.new、GitHub & Cloudflare Pages 全流程实战!第一步:创意可视化与代码生成 — Goo…

Qwen2.5-VL实现本地GPTQ量化

本文不生产技术,只做技术的搬运工!! 前言 公开的Qwen2.5-VL模型虽然功能非常强大,但有时面对专业垂直领域的问题往往会出现一些莫名其妙的回复,这时候大家一版选择对模型进行微调,而微调后的模型如果直接部署则显存开销过大,这时就需要执行量化,下面将介绍执行本地GPT…