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,生成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模型也很能打。
最后是推理時間的分析,在A100上。兩個模型的時間分別是,Lite:≈ 10 s,Std:≈ 25 s。這是純推理的時間,如果加上后處理(UV展開+貼圖烘焙):額外 +15 s(可選)。