狗都能看懂的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,生成10242貼圖,就可直接輸出.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…