散模型驅(qū)動(dòng)的3D資產(chǎn)生成:三平面表示與可擴(kuò)展實(shí)踐)
做3D資產(chǎn)生成這些年我一直覺得最磨人的不是建模本身而是“怎么用更少的成本把形狀、紋理、細(xì)節(jié)一次做對”。傳統(tǒng)流程里模型師、貼圖師、綁定師各管一段一個(gè)高質(zhì)量資產(chǎn)從零開始往往要按天算。所以當(dāng)我看到“3D-Diffusion: Scalable 3D Asset Generation with Diffusion Models”這個(gè)方向時(shí)第一反應(yīng)是擴(kuò)散模型終于從2D圖像殺到3D資產(chǎn)領(lǐng)域了而且這次不是小打小鬧是奔著“可規(guī)?;比サ?。這篇解析就是想把這個(gè)方向背后的技術(shù)選型、設(shè)計(jì)邏輯和落地路徑講清楚給正在做3D生成、NeRF或者AIGC應(yīng)用的同學(xué)一份可以直接抄作業(yè)的參考。這個(gè)方向適合誰看一類是剛接觸3D生成想搞明白擴(kuò)散模型怎么處理非歐幾里得結(jié)構(gòu)的同學(xué)另一類是在做3D資產(chǎn)生成但苦于效果不穩(wěn)定、訓(xùn)練成本太高想知道這個(gè)方案為什么更穩(wěn)的開發(fā)者。我會把3D表示的選型、擴(kuò)散過程的設(shè)計(jì)、可擴(kuò)展性的來源、以及我在復(fù)現(xiàn)和改造過程中的坑一塊兒拆開講。1. 從一張圖片到整座數(shù)字工廠3D資產(chǎn)生成的痛點(diǎn)和擴(kuò)散模型的切入點(diǎn)1.1 傳統(tǒng)3D流程的瓶頸先說行業(yè)現(xiàn)狀。一個(gè)標(biāo)準(zhǔn)的3D資產(chǎn)生產(chǎn)管線通常是概念設(shè)計(jì)確定風(fēng)格建模師用多邊形網(wǎng)格搭出大體結(jié)構(gòu)拆UV烘焙法線貼圖再交給材質(zhì)師做紋理最后進(jìn)引擎或渲染器驗(yàn)證效果。這串流程里每一步都依賴人工決策而且每一環(huán)節(jié)的錯(cuò)誤都會被后續(xù)環(huán)節(jié)放大。比如基礎(chǔ)模型的比例稍微出了問題后續(xù)的UV、貼圖、綁定都要返工返工成本隨著環(huán)節(jié)靠后指數(shù)上升。如果說靜態(tài)資產(chǎn)還能靠熟練工硬扛那動(dòng)態(tài)資產(chǎn)、大規(guī)模場景、多類別資產(chǎn)生成就是完全另一個(gè)量級的問題。一個(gè)游戲項(xiàng)目動(dòng)輒幾千個(gè)可交互物件一個(gè)影視項(xiàng)目可能需要上百個(gè)角色和載具如果用傳統(tǒng)流程光排期就能把人逼瘋。我見過不少團(tuán)隊(duì)嘗試用程序化生成來緩解壓力但程序化方案的缺陷也很明顯它能做“同類變異”很難做“跨類創(chuàng)造”更不用說在風(fēng)格統(tǒng)一的前提下生成全新結(jié)構(gòu)。所以這個(gè)領(lǐng)域一直在等一個(gè)真正能“從數(shù)據(jù)分布里學(xué)出泛化能力”的生成方案。這也是擴(kuò)散模型被3D研究者盯上的根本原因——它在圖像領(lǐng)域的表現(xiàn)已經(jīng)證明只要數(shù)據(jù)量和模型容量夠它能學(xué)出非常復(fù)雜的條件分布。1.2 為什么偏偏是擴(kuò)散模型有人可能會問GAN不是也可以做生成嗎早期3D生成也確實(shí)有基于GAN的方案比如把體素或點(diǎn)云作為生成對象。但GAN有兩個(gè)繞不開的老毛病訓(xùn)練不穩(wěn)定模式坍縮。對于圖像這種規(guī)則網(wǎng)格數(shù)據(jù)GAN已經(jīng)夠難調(diào)了換到3D這種拓?fù)洳还潭ǖ慕Y(jié)構(gòu)上訓(xùn)練難度會再上一個(gè)臺階。生成質(zhì)量高不高先不說光是“判別器怎么定義真實(shí)感”就是個(gè)哲學(xué)問題。擴(kuò)散模型的思路完全不同。它不靠對抗靠的是“先破壞、再修復(fù)”的概率學(xué)習(xí)。訓(xùn)練時(shí)把真實(shí)3D資產(chǎn)逐漸加噪直到變成純噪聲推理時(shí)從一個(gè)隨機(jī)噪聲開始一步一步去噪最終恢復(fù)成一個(gè)合理的3D結(jié)構(gòu)。這種方式避免了對抗訓(xùn)練的不穩(wěn)定而且每一步去噪都是回歸任務(wù)損失函數(shù)簡單直接。更關(guān)鍵的是擴(kuò)散模型天然支持條件生成只要在去噪過程中輸入類別標(biāo)簽、文本描述或圖片特征就能控制生成方向這一點(diǎn)對資產(chǎn)生成來說太重要了。3D-Diffusion這個(gè)方向正是把這些優(yōu)勢遷移到了3D領(lǐng)域。它不需要像GAN那樣和判別器斗智斗勇也不需要像自回歸模型那樣按固定順序一點(diǎn)點(diǎn)“猜”下一個(gè)token而是把整個(gè)3D對象當(dāng)作一個(gè)整體來去噪。這種“整體生成”的直覺和人看到一團(tuán)亂線時(shí)自動(dòng)腦補(bǔ)出一個(gè)輪廓的過程很像。1.3 標(biāo)題里的“Scalable”到底在說什么標(biāo)題里的“Scalable”不是一個(gè)營銷詞匯它同時(shí)指向三個(gè)層面的擴(kuò)展能力。第一是類別規(guī)模早期3D生成模型往往只能生成單一類別比如只生成椅子或者只生成車而可規(guī)模的方案要能用同一個(gè)模型覆蓋幾百個(gè)類別。第二是數(shù)據(jù)規(guī)模3D數(shù)據(jù)不像圖像那么好獲取公開的3D數(shù)據(jù)集在數(shù)量、標(biāo)注質(zhì)量、類別平衡上都遠(yuǎn)不如2D數(shù)據(jù)可規(guī)模化的前提是能高效利用有限的數(shù)據(jù)。第三是模型和算力規(guī)模如果把擴(kuò)散模型的主干做大訓(xùn)練數(shù)據(jù)增多生成質(zhì)量能不能持續(xù)穩(wěn)定提升而不是一到某個(gè)規(guī)模就崩掉。這三點(diǎn)合在一起才是“Scalable 3D Asset Generation”的真正含義。它不是某一種技巧的堆疊而是一個(gè)系統(tǒng)工程數(shù)據(jù)怎么組織、3D怎么表示、模型怎么訓(xùn)練、推理怎么控制每一環(huán)都要為規(guī)?;O(shè)計(jì)。少了任何一環(huán)規(guī)模上去之后都會出問題。比如數(shù)據(jù)量大了但表示不合理訓(xùn)練成本會爆炸表示合理但模型結(jié)構(gòu)不適合并行擴(kuò)展性也受限。所以后續(xù)所有技術(shù)細(xì)節(jié)都應(yīng)該圍繞“怎么在保證生成質(zhì)量的前提下把模型、數(shù)據(jù)和算力都推到更大規(guī)?!边@條主線來理解。2. 選對“積木”3D表示方法決定了擴(kuò)散模型的成敗2.1 三種主流3D表示的橫向?qū)Ρ葦U(kuò)散模型需要一個(gè)明確的“生成目標(biāo)”也就是說我們需要先決定讓模型輸出什么格式的3D數(shù)據(jù)。這個(gè)選擇直接決定后續(xù)所有設(shè)計(jì)可以說是整個(gè)方向的基石。目前主流的3D表示大概有三類顯式結(jié)構(gòu)化表示、隱式神經(jīng)場表示、以及顯隱混合表示。顯式結(jié)構(gòu)化表示包括體素、點(diǎn)云和多邊形網(wǎng)格。體素就是3D像素結(jié)構(gòu)規(guī)則方便做卷積但分辨率一大內(nèi)存就爆炸點(diǎn)云存儲效率高但缺少拓?fù)湫畔⒛P鸵~外處理點(diǎn)與點(diǎn)之間的連接關(guān)系網(wǎng)格是工業(yè)界的標(biāo)準(zhǔn)格式有面和頂點(diǎn)的關(guān)系但生成網(wǎng)格的拓?fù)浔旧砭褪且粋€(gè)很復(fù)雜的離散問題擴(kuò)散模型處理離散結(jié)構(gòu)并不順手。隱式神經(jīng)場表示的代表是NeRF那一套用神經(jīng)網(wǎng)絡(luò)把空間坐標(biāo)映射成密度和顏色。它的優(yōu)點(diǎn)是能表達(dá)精細(xì)的連續(xù)幾何和紋理內(nèi)存占用固定分辨率只取決于查詢點(diǎn)的數(shù)量缺點(diǎn)也很明顯一個(gè)資產(chǎn)對應(yīng)一個(gè)訓(xùn)練好的MLP很難直接“生成”一個(gè)可以繼續(xù)編輯加工的網(wǎng)格。顯隱混合表示則是兩者取長補(bǔ)短最具代表性的就是三平面tri-plane。它將3D空間投影到三個(gè)正交的2D特征平面上每個(gè)位置的特征由它在三個(gè)平面上的投影拼接而成然后再接一個(gè)小規(guī)模解碼器得到密度和顏色。2D特征平面可以存成普通圖像張量又規(guī)則又緊湊這讓擴(kuò)散模型可以直接復(fù)用2D的U-Net骨干不用為3D重新發(fā)明網(wǎng)絡(luò)架構(gòu)。表示方式規(guī)則性內(nèi)存開銷生成難度工業(yè)可用性體素高高中分辨率受限中點(diǎn)云低低高需處理拓?fù)渲芯W(wǎng)格低低極高離散結(jié)構(gòu)高NeRF/神經(jīng)場中中中需擬合MLP低三平面高低低復(fù)用2D卷積中2.2 三平面表示為什么適合擴(kuò)散三平面之所以在很多3D擴(kuò)散方案中被當(dāng)作默認(rèn)選擇核心原因就是“規(guī)則”。擴(kuò)散模型的骨干網(wǎng)絡(luò)基本都是基于卷積或者注意力機(jī)制設(shè)計(jì)的這些結(jié)構(gòu)對規(guī)則網(wǎng)格數(shù)據(jù)極其友好。體素雖然是規(guī)則三維網(wǎng)格但計(jì)算量是立方級別的三平面把三維相關(guān)性拆成三張二維圖計(jì)算量變成了平面級別大大降低了訓(xùn)練和推理成本。從信息完整性角度看三平面并沒有嚴(yán)重丟信息??臻g里任意一點(diǎn)可以通過它投影到XY、XZ、YZ三個(gè)平面上的位置取出三組特征向量再拼接成一個(gè)總特征。這個(gè)總特征既包含了點(diǎn)的局部位置信息又通過三個(gè)方向的投影攜帶了空間的全局一致性。換句話說三平面是用“三個(gè)方向看的視角”替代了“全空間的稠密存儲”是一種非常聰明的壓縮。而且三平面還有一個(gè)隱性優(yōu)勢它和2D擴(kuò)散模型之間的知識遷移特別順滑。2D圖像擴(kuò)散模型已經(jīng)在海量圖文數(shù)據(jù)上預(yù)訓(xùn)練過了如果3D擴(kuò)散模型也采用類似的2D卷積骨干就能用預(yù)訓(xùn)練權(quán)重做初始化相當(dāng)于把2D空間學(xué)到的先驗(yàn)搬到3D空間來。這個(gè)初始化帶來的收益在訓(xùn)練早期特別明顯能讓模型在數(shù)據(jù)量有限的前提下快速收斂到合理形狀。2.3 表示層面還需要解決的工程細(xì)節(jié)選了三平面不等于萬事大吉還有很多工程細(xì)節(jié)會直接影響生成質(zhì)量。首先是平面分辨率每個(gè)特征平面的尺寸需要和生成精度匹配。分辨率太低細(xì)節(jié)糊成一團(tuán)分辨率太高擴(kuò)散模型的通道數(shù)、顯存占用都跟著漲。我在實(shí)際測試中對于單物體生成任務(wù)平面分辨率128到256之間是比較合理的起步區(qū)間再高就需要考慮分塊訓(xùn)練或者漸進(jìn)式生成。其次是解碼器的設(shè)計(jì)。三平面本身只是特征存儲真正輸出幾何和顏色要靠一個(gè)小MLP解碼器。這個(gè)解碼器雖然輕量但不能太淺否則高頻率細(xì)節(jié)會被直接“抹平”。我傾向于至少用4層帶位置編碼的MLP并在輸入特征之前拼接坐標(biāo)的低頻和高頻編碼這樣能顯著提升幾何細(xì)節(jié)的還原度。還有一個(gè)容易被忽略的是空間范圍的規(guī)范化。3D數(shù)據(jù)集的物體尺度差異很大有的物體只有幾十厘米有的好幾米。如果不做歸一化擴(kuò)散模型會浪費(fèi)大量生成能力在“尺度猜測”上。通常的做法是把所有資產(chǎn)縮放到一個(gè)單位球或單位包圍盒內(nèi)并在訓(xùn)練時(shí)把規(guī)范化的變換矩陣也存下來推理完成后再根據(jù)條件信息恢復(fù)真實(shí)尺度。3. 讓噪聲學(xué)會雕刻3D擴(kuò)散模型的核心機(jī)制拆解3.1 前向過程把3D資產(chǎn)“揉碎”擴(kuò)散模型的訓(xùn)練離不開前向擴(kuò)散過程。對于三平面表示前向過程就是對特征平面逐步加噪。具體來說給定一張來自三平面表示的2D特征圖我們按一個(gè)預(yù)設(shè)的噪聲調(diào)度器在若干步內(nèi)不斷疊加高斯噪聲直到特征圖完全被噪聲淹沒。這個(gè)過程本身不復(fù)雜復(fù)雜的是如何設(shè)計(jì)噪聲調(diào)度。噪聲步數(shù)太少模型學(xué)不到從純噪聲恢復(fù)細(xì)節(jié)的能力步數(shù)太多訓(xùn)練成本成倍增加?,F(xiàn)在一般用的是余弦調(diào)度或者它在3D任務(wù)上的變體讓噪聲增加速度在中期平緩、在兩端陡峭這樣模型在中期能看到更多“處于合理模糊狀態(tài)”的樣本更容易學(xué)到有意義的去噪映射。我在實(shí)踐中還會關(guān)注一個(gè)細(xì)節(jié)噪聲加在哪個(gè)特征圖上。三平面有三個(gè)正交平面如果所有平面加同樣強(qiáng)度的噪聲相當(dāng)于假設(shè)三個(gè)方向的復(fù)雜度一致。但實(shí)際上不同類別的物體在三個(gè)方向上的復(fù)雜度差異很大。比如一把椅子XY平面的結(jié)構(gòu)信息很多XZ平面相對簡單。給三個(gè)平面獨(dú)立設(shè)置噪聲強(qiáng)度甚至讓模型同時(shí)預(yù)測三組噪聲殘差效果往往比統(tǒng)一加噪好。這個(gè)屬于實(shí)現(xiàn)細(xì)節(jié)論文里不會寫但影響非常直接。3.2 逆向過程從噪聲長回形狀逆向過程是擴(kuò)散模型真正干活的階段。推理時(shí)我們從三個(gè)隨機(jī)高斯噪聲平面出發(fā)送入去噪網(wǎng)絡(luò)反復(fù)迭代若干步預(yù)測每一步應(yīng)該減掉的噪聲最終得到“干凈”的三平面特征圖。拿到干凈的三平面之后再用解碼器稠密查詢空間中的點(diǎn)得到密度場和顏色場最后用marching cubes之類的方法提取成網(wǎng)格資產(chǎn)。去噪網(wǎng)絡(luò)一般沿用2D擴(kuò)散模型的主流結(jié)構(gòu)比如帶時(shí)間步嵌入的U-Net或者DiTDiffusion Transformer。U-Net的優(yōu)勢是卷積的局部性強(qiáng)對幾何細(xì)節(jié)敏感DiT的優(yōu)勢是全局建模能力好容易擴(kuò)展到更大的模型和數(shù)據(jù)量。兩種我都試過結(jié)論是如果算力有限先上U-Net效果好、調(diào)參成本低如果目標(biāo)就是跨類別大規(guī)模生成DiT的擴(kuò)展性更值得押注。這里有一個(gè)很多人沒注意到的問題三平面雖然被存成2D圖但它不是普通照片。一個(gè)特征平面的不同區(qū)域之間天然存在三維空間中的連續(xù)性——比如一個(gè)物體表面會在同一平面特征圖上形成連續(xù)的紋理軌跡。因此去噪網(wǎng)絡(luò)不能只按普通圖像處理需要在特征提取的同時(shí)保留這種跨通道、跨平面的對應(yīng)關(guān)系。最簡單的做法是特征融合在每個(gè)去噪block里把三個(gè)平面兩兩組合做一次交叉注意力讓網(wǎng)絡(luò)在去噪時(shí)能看到三視圖之間的關(guān)系。這個(gè)設(shè)計(jì)不算復(fù)雜但對生成形狀的完整性提升很明顯。3.3 條件控制與生成自由度擴(kuò)散模型的另一個(gè)核心優(yōu)勢是條件的靈活注入。在3D資產(chǎn)生成場景里我們最想要的控制方式通常是兩種類別標(biāo)簽控制和條件模態(tài)控制。類別標(biāo)簽控制最簡單直接把類別編碼拼進(jìn)時(shí)間步嵌入里就行條件模態(tài)控制則更進(jìn)一步比如輸入一張參考圖、一段文字描述甚至一個(gè)粗糙的線稿讓模型生成符合這個(gè)條件的3D資產(chǎn)。做條件注入時(shí)classifier-free guidance 幾乎是必選方案。它的做法是訓(xùn)練時(shí)隨機(jī)丟棄一部分條件信息讓模型同時(shí)學(xué)會“有條件下生成”和“無條件生成”推理時(shí)用兩條路徑的預(yù)測結(jié)果做外推從而放大條件信號對生成結(jié)果的影響。這個(gè)技巧在2D圖像生成里是扛把子換到3D同樣適用而且效果提升非常直觀——配合這個(gè)技巧幾何的類別屬性和風(fēng)格一致性都會有顯著增強(qiáng)。控制條件是強(qiáng)化生成可控性的關(guān)鍵但它對訓(xùn)練數(shù)據(jù)的配對要求也更高。公開3D數(shù)據(jù)集里有文本標(biāo)注的子集比例并不高能做到圖文對和3D資產(chǎn)嚴(yán)格對齊的更少。一種妥協(xié)方案是先用無條件的3D擴(kuò)散模型學(xué)幾何分布再在推理時(shí)引入一個(gè)跨模態(tài)對齊網(wǎng)絡(luò)把文本或圖片特征映射為條件向量。這種兩段式設(shè)計(jì)雖然不如端到端優(yōu)雅但解決數(shù)據(jù)缺失問題的效果立竿見影。4. 從單類別到多類別可擴(kuò)展性的工程實(shí)現(xiàn)路徑4.1 數(shù)據(jù)如何組織形狀到什么程度算一個(gè)樣本可擴(kuò)展性的起點(diǎn)是數(shù)據(jù)組織。3D資產(chǎn)和2D圖像最大的不同在于它沒有一個(gè)統(tǒng)一的“分辨率”概念。一個(gè)網(wǎng)格有頂點(diǎn)數(shù)一個(gè)神經(jīng)場有隱層寬度一個(gè)三平面有平面分辨率——這些指標(biāo)彼此不互通。所以第一步要做的是把異構(gòu)數(shù)據(jù)統(tǒng)一成同一種樣本格式。在三平面方案里統(tǒng)一流程大致是對每個(gè)原始3D資產(chǎn)先渲染多視角圖像再從多視角圖反向擬合出對應(yīng)的三平面特征稱為“編碼”階段。每個(gè)資產(chǎn)最終對應(yīng)三張固定分辨率的特征圖這三張圖就是擴(kuò)散模型訓(xùn)練的完整樣本。這一步相當(dāng)于把各種格式的mesh、點(diǎn)云、神經(jīng)場全部壓縮成標(biāo)準(zhǔn)張量之后無論數(shù)據(jù)來自哪個(gè)源模型看到的都是同一空間的數(shù)據(jù)分布。這個(gè)編碼階段的質(zhì)量直接決定擴(kuò)散模型的上限。如果擬合出來的三平面本身就有噪聲或失真后續(xù)擴(kuò)散模型無論如何都學(xué)不出干凈的分布。所以編碼階段不能貪快一般需要足夠的迭代步數(shù)并在損失函數(shù)里加上深度監(jiān)督和正則化確保三平面在幾何上忠實(shí)于原始資產(chǎn)。我見過不少團(tuán)隊(duì)在這里為了省時(shí)間降低迭代步數(shù)結(jié)果擴(kuò)散模型的生成質(zhì)量莫名其妙地下降排查半天才發(fā)現(xiàn)是訓(xùn)練數(shù)據(jù)本身就不干凈。4.2 模型骨架選UNet還是Transformer到了模型規(guī)模這個(gè)層面選擇骨干網(wǎng)絡(luò)就不再是“哪個(gè)更高效”這么簡單了而是要考慮擴(kuò)展曲線。UNet加寬加深到一定程度之后增加參數(shù)帶來的收益會迅速衰減DiT這類Transformer架構(gòu)則比較平滑參數(shù)量級從百萬到十億都能保持近似線性的收益。但這不代表無腦上DiT就是對的。DiT需要用大量的數(shù)據(jù)才能發(fā)揮優(yōu)勢3D數(shù)據(jù)的規(guī)模比圖像小幾個(gè)數(shù)量級數(shù)據(jù)不足時(shí)Transformer更容易過擬合生成結(jié)果會偏向訓(xùn)練集的平均形狀多樣性反而下降。我的建議是分階段走在原型驗(yàn)證階段用UNet快速驗(yàn)證數(shù)據(jù)管道和訓(xùn)練流程當(dāng)數(shù)據(jù)規(guī)模和類別數(shù)都上臺階之后再遷移到DiT做大規(guī)模訓(xùn)練。UNet模型的輸出也可以作為DiT模型的初始化數(shù)據(jù)蒸餾來源實(shí)現(xiàn)模型架構(gòu)的無縫升級。另一個(gè)和骨干網(wǎng)絡(luò)配套的關(guān)鍵設(shè)計(jì)是時(shí)間步嵌入和規(guī)模正則。擴(kuò)散模型的骨干隨著規(guī)模增大對時(shí)間步的感知能力要求也越高。如果時(shí)間步嵌入的維度不足模型會難以區(qū)分“需要大改”和“只需微調(diào)”的階段導(dǎo)致去噪過程中出現(xiàn)結(jié)構(gòu)性的抖動(dòng)。這個(gè)細(xì)節(jié)容易被忽略但當(dāng)你把模型從幾十M參數(shù)漲到幾百M(fèi)參數(shù)時(shí)時(shí)間步嵌入的通道數(shù)基本要翻倍才能維持同等生成質(zhì)量。4.3 兩階段生成與規(guī)模化訓(xùn)練細(xì)節(jié)真正讓3D資產(chǎn)生成做到“內(nèi)容級”可用往往還需要兩階段策略先粗后細(xì)。第一階段用較低分辨率的特征平面生成整體形狀和大致紋理第二階段在條件約束下修復(fù)細(xì)節(jié)補(bǔ)充高頻信息。兩階段的好處是把問題從“一步到位解決所有像素”轉(zhuǎn)化為“逐步逼近目標(biāo)”極大降低單次學(xué)習(xí)的難度。兩階段之間如何銜接也是技術(shù)活。一種方案是讓第二階段的模型以第一階段的輸出作為條件這個(gè)條件可以是特征圖的下采樣版本也可以是局部渲染圖。另一種方案是讓兩個(gè)階段共享同一個(gè)骨干只是在不同分辨率上訓(xùn)練訓(xùn)練過程中先用低分辨率預(yù)訓(xùn)練再在高分辨率上微調(diào)。后者在部署上更有優(yōu)勢因?yàn)樽罱K推理時(shí)只用一個(gè)模型省了一半顯存。規(guī)?;?xùn)練還有幾個(gè)不得不提的工程技巧混合精度訓(xùn)練是必須的但損失縮放需要針對3D特征圖調(diào)整不能用2D圖像任務(wù)的默認(rèn)值直接套。大規(guī)模訓(xùn)練時(shí)的數(shù)據(jù)采樣要按類別做頻率平衡。3D數(shù)據(jù)集里椅子、桌子這類常見品類樣本極多而一些冷門品類樣本極少如果不做平衡模型會嚴(yán)重偏向高頻類別。有條件訓(xùn)練時(shí)的條件丟棄比例不能照搬2D。2D常用的10%丟棄率在3D任務(wù)上容易導(dǎo)致條件信號過弱我測試下來20%到30%之間的表現(xiàn)更穩(wěn)定。這些細(xì)節(jié)單獨(dú)看都不大但疊加在一起就是“可擴(kuò)展”和“只能跑通demo”這兩種結(jié)果之間的差距。5. 實(shí)操視角一個(gè)最小可行3D擴(kuò)散Demo怎么落地5.1 環(huán)境與數(shù)據(jù)準(zhǔn)備如果和我一樣是想先跑通驗(yàn)證流程我建議不要一開始就上完整的多類別大規(guī)模方案而是先做一個(gè)最小可行Demo。目標(biāo)可以定為給定一個(gè)公開3D數(shù)據(jù)集的小規(guī)模子集訓(xùn)練一個(gè)能生成單類別資產(chǎn)的三平面擴(kuò)散模型。環(huán)境方面我用的是一張24G顯存的卡框架選PyTorch。主要依賴包括diffusers庫負(fù)責(zé)擴(kuò)散調(diào)度器和采樣器、以及配套的3D處理庫用于渲染和網(wǎng)格提取。數(shù)據(jù)預(yù)處理流程是從原始網(wǎng)格渲染多視角圖然后用一個(gè)預(yù)訓(xùn)練編碼器把多視角圖擬合為三平面特征。這里不需要自己從零寫編碼器很多開源實(shí)現(xiàn)可以直接復(fù)用但要注意開源實(shí)現(xiàn)里往往有多環(huán)境耦合問題建議在干凈環(huán)境里重建依賴并驗(yàn)證編碼器輸出形狀后再進(jìn)入訓(xùn)練。5.2 一步步搭建并訓(xùn)練我的搭建路徑大致分四步第一步準(zhǔn)備數(shù)據(jù)管線。把原始網(wǎng)格文件讀進(jìn)來做縮放歸一化、去掉重復(fù)頂點(diǎn)、統(tǒng)一朝向然后渲染多視角圖。渲染分辨率不必太高因?yàn)槿矫婢幋a階段本身會做特征壓縮高分辨率渲染只會浪費(fèi)磁盤。第二步生成三平面訓(xùn)練集。用編碼器批量轉(zhuǎn)換多視角渲染圖為三平面特征圖。我通常會把每張?zhí)卣鲌D做一次質(zhì)量檢查可視化三平面的RGB通道和密度通道確認(rèn)幾何輪廓是清晰的而不是一坨模糊色塊。這里發(fā)現(xiàn)問題要比訓(xùn)練完再查省力得多。第三步搭建去噪模型。第一階段用一個(gè)小型U-Net參數(shù)量控制在100M以內(nèi)輸入輸出通道數(shù)對齊三平面特征的通道數(shù)。訓(xùn)練配置可以直接參考2D擴(kuò)散模型但要修改噪聲調(diào)度器讓總步數(shù)放寬到2000步左右。3D特征圖的噪聲敏感性比自然圖像高步數(shù)太短會造成生成結(jié)果出現(xiàn)波紋狀偽影。第四步訓(xùn)練和采樣。訓(xùn)練完一個(gè)checkpoint后用DDIM采樣器生成三平面再用解碼器查詢點(diǎn)云和網(wǎng)格。我第一次跑通全流程時(shí)踩了個(gè)大坑生成的網(wǎng)格總有一面是塌陷的。排查下來發(fā)現(xiàn)是采樣時(shí)只用了三個(gè)平面中的兩個(gè)第三個(gè)平面被采樣器錯(cuò)誤地當(dāng)作圖像通道處理。這個(gè)教訓(xùn)讓我意識到三平面擴(kuò)散雖然復(fù)用2D結(jié)構(gòu)但代碼中必須時(shí)時(shí)保留“三個(gè)獨(dú)立特征平面”的語義不能把它當(dāng)成普通三通道圖像處理。5.3 踩坑記錄訓(xùn)練不穩(wěn)定和生成全黑訓(xùn)練不穩(wěn)定的問題在3D擴(kuò)散里非常常見癥狀大約是loss不降或者loss降了但采樣結(jié)果全是噪聲。遇到這種情況我先檢查三平面編碼器的輸出范圍。不同編碼器出來的特征值范圍差異很大有的在0到1有的在-1到1甚至有人會在特征里混入指數(shù)激活。擴(kuò)散模型對輸入范圍極其敏感如果特征的均值和方差和預(yù)訓(xùn)練2D模型假設(shè)的不一致去噪網(wǎng)絡(luò)會專注于擬合錯(cuò)誤統(tǒng)計(jì)量導(dǎo)致loss虛低但采樣全黑。我建議在進(jìn)入模型之前對三平面特征做一次均值和方差歸一化并把這個(gè)歸一化統(tǒng)計(jì)量保存好在推理時(shí)反向還原。另一個(gè)常見問題是生成結(jié)果雖然形狀合理但紋理區(qū)域出現(xiàn)重復(fù)斑紋。這個(gè)多半是解碼器的位置編碼頻率設(shè)置太高高頻編碼放大了特征圖中的微小噪聲。調(diào)低最高頻率或者改成可學(xué)習(xí)頻率基本能解決。還有一個(gè)需要特別提醒的三平面和2D圖像的通道順序。把三平面當(dāng)成三張獨(dú)立的圖喂給模型和把它們拼接成一個(gè)三維張量喂給模型訓(xùn)練效果差異巨大。前者每個(gè)平面獨(dú)立卷積特征之間缺乏交互后者則天然具有平面間的通道注意力。我在最小Demo里選了后者效果明顯更穩(wěn)。6. 常見問題與排查技巧實(shí)錄問題現(xiàn)象可能原因解決方案生成結(jié)果全是噪聲/黑塊三平面特征未歸一化或范圍失真統(tǒng)計(jì)訓(xùn)練集特征均值方差訓(xùn)練前統(tǒng)一歸一化網(wǎng)格某一面塌陷或缺失三平面語義被當(dāng)作普通張量處理檢查代碼中三張?zhí)卣鲌D的索引映射避免平面混淆生成類別正確但形狀單一數(shù)據(jù)采樣不平衡導(dǎo)致模式坍縮訓(xùn)練時(shí)按類別做加權(quán)采樣增加條件丟棄率紋理出現(xiàn)規(guī)律斑紋解碼器位置編碼頻率過高降低高頻編碼上限或改用可學(xué)習(xí)位置編碼訓(xùn)練loss穩(wěn)定但評估指標(biāo)下降混合精度損失縮放不合適針對3D特征圖重調(diào)loss縮放因子關(guān)閉部分層的低精度計(jì)算采樣速度太慢去噪步數(shù)設(shè)置過密換用DDIM采樣器并逐步減少步數(shù)30到50步即可6.1 資源不夠時(shí)的曲線救國方案如果沒有24G大顯存第一個(gè)想到的肯定是用梯度累積但這只解決“顯存峰值”問題不解決“訓(xùn)練太慢”問題。實(shí)際上還有三條更實(shí)用的路。第一條是降低特征平面分辨率64×64起步驗(yàn)證完loss和采樣流程后再向上提分辨率。這就像先畫草稿再描細(xì)節(jié)流程跑通了才值得堆算力。第二條是用現(xiàn)成的2D擴(kuò)散模型做初始化把骨干網(wǎng)絡(luò)換成預(yù)訓(xùn)練權(quán)重之后3D解碼器和輸入輸出層隨機(jī)初始化這樣模型在早期就能利用2D穩(wěn)定特征收斂速度肉眼可見地加快。第三條是從單類別場景起步用一個(gè)類的數(shù)據(jù)把整個(gè)訓(xùn)練鏈路打通再逐步加入其他類別。很多多類別訓(xùn)練中才暴露的問題其實(shí)單類別階段就能通過生成質(zhì)量間接發(fā)現(xiàn)。6.2 判斷生成質(zhì)量的三板斧判斷一個(gè)3D擴(kuò)散模型到底行不行光看渲染圖是不夠的渲染角度好看很容易給人錯(cuò)覺。我常用的三個(gè)指標(biāo)第一看多視角一致性。圍繞生成結(jié)果轉(zhuǎn)一圈如果某個(gè)視角突然出現(xiàn)奇怪的凹陷、凸起或者紋理撕裂說明三平面編碼里存在視角不一致這是擴(kuò)散模型沒學(xué)好的典型癥狀。第二看拓?fù)浜侠硇浴I梢粋€(gè)椅子如果出現(xiàn)椅背直接穿模連接椅座哪怕渲染圖再漂亮這個(gè)模型也需要重新審視。第三看編輯穩(wěn)定性。把網(wǎng)格導(dǎo)入常規(guī)建模軟件做一次平滑或者重拓?fù)淇瓷傻拿芗W(wǎng)格能不能優(yōu)雅地降面。能優(yōu)雅降面的模型才是真正理解了結(jié)構(gòu)否則只是在密度場上“背”出了一個(gè)類別的平均值。7. 你可以怎么擴(kuò)展這個(gè)方向7.1 從靜態(tài)資產(chǎn)到動(dòng)態(tài)資產(chǎn)三平面擴(kuò)散模型解決的是靜態(tài)資產(chǎn)生成但實(shí)際項(xiàng)目里還需要大量動(dòng)態(tài)資產(chǎn)比如會動(dòng)的機(jī)械臂、人物角色的衣物擺動(dòng)。擴(kuò)展思路大致有兩類一類是在三平面之外增加時(shí)間軸維度讓擴(kuò)散模型同時(shí)生成多幀特征平面但訓(xùn)練成本會成倍上升另一類是保持靜態(tài)生成不變在資產(chǎn)生成后才用其他網(wǎng)絡(luò)做動(dòng)態(tài)變形場預(yù)測。后者更符合工程慣例因?yàn)樗选靶螤钌伞焙汀皠?dòng)態(tài)擺姿”解耦兩個(gè)環(huán)節(jié)可以分別優(yōu)化。如果追求效率可以先生成靜態(tài)資產(chǎn)并驗(yàn)證幾何質(zhì)量再考慮動(dòng)態(tài)擴(kuò)展。7.2 與多模態(tài)大模型的交叉擴(kuò)散模型在3D領(lǐng)域還有一個(gè)極具潛力的方向是和多模態(tài)大模型交叉。如果用文本或者圖像作為條件控制3D生成就能實(shí)現(xiàn)“給一段描述直接拿回一個(gè)可用的3D模型”。這個(gè)方向上最大的瓶頸還是在數(shù)據(jù)配對質(zhì)量和數(shù)量但已經(jīng)有越來越多的團(tuán)隊(duì)在嘗試用合成語料擴(kuò)充圖文到3D的對齊數(shù)據(jù)。我在實(shí)際測試中用預(yù)訓(xùn)練的圖文對齊模型生成偽條件向量再喂給3D擴(kuò)散模型效果比我預(yù)期的好。盡管條件向量的質(zhì)量參差不齊但擴(kuò)散模型的自回歸去噪過程本身就具備一定糾錯(cuò)能力它能自動(dòng)忽略部分噪聲條件生成結(jié)果仍然符合幾何常識。這說明3D擴(kuò)散模型和跨模態(tài)條件注入之間是天然兼容的未來如果能突破數(shù)據(jù)瓶頸這個(gè)方向會成為AIGC的核心一環(huán)。7.3 推理加速與輕量化部署就算訓(xùn)好了模型工程落地還逃不開推理速度問題。擴(kuò)散模型采樣動(dòng)輒幾十上百步3D應(yīng)用里還要額外跑解碼器和網(wǎng)格提取延遲很容易讓人失去耐心。我試過幾個(gè)加速方案每個(gè)都有具體適用場景。訓(xùn)練階段就加入蒸餾方案是性價(jià)比最高的路徑。把多步擴(kuò)散“蒸餾”成單步或者少步生成相當(dāng)于讓模型把幾十步的精力壓縮到幾步內(nèi)迸發(fā)出來質(zhì)量會有損失但延遲可以從秒級降到毫秒級。另一種是換用一致性模型架構(gòu)它直接把任意噪聲一步映射到數(shù)據(jù)分布省掉了迭代采樣環(huán)節(jié)缺點(diǎn)是生成多樣性會比全步擴(kuò)散略低。最后是工程層面的優(yōu)化比如三平面解碼器換成可轉(zhuǎn)成ONNX的模型推理時(shí)用GPU并行解碼多個(gè)候選點(diǎn)配合網(wǎng)格提取的并行化改造整體吞吐能提升不少。寫在后面從最開始的體素GAN一路做到三平面擴(kuò)散我的感受是這個(gè)方向正在把3D資產(chǎn)生成從一個(gè)“玄學(xué)活”變成一個(gè)“工程活”。以前調(diào)生成模型像碰運(yùn)氣現(xiàn)在有了擴(kuò)散模型這套穩(wěn)定的學(xué)習(xí)框架加上可擴(kuò)展的3D表示問題更多變成了數(shù)據(jù)和算力的工程問題。我個(gè)人在實(shí)際操作中最深的體會是不要一開始就追求大模型、大批次先把單類別、低分辨率的小鏈路跑通跑通之后你才會真正理解三平面、噪聲調(diào)度和條件控制之間的微妙關(guān)系。等這個(gè)最小系統(tǒng)穩(wěn)定了再去加數(shù)據(jù)、加參數(shù)、加類別才是可規(guī)模化的正確姿勢。后面有時(shí)間我打算再寫一篇從兩階段生成推進(jìn)到文本驅(qū)動(dòng)3D資產(chǎn)生成的實(shí)操記錄繼續(xù)和大家交流。