動(dòng)預(yù)測:多模態(tài)場景感知與注意力融合實(shí)戰(zhàn))
1. 從CVPR24一篇工作說起為什么人體運(yùn)動(dòng)預(yù)測突然成了香餑餑人體運(yùn)動(dòng)預(yù)測這件事放在五年前還只是動(dòng)畫圈和運(yùn)動(dòng)捕捉實(shí)驗(yàn)室里的小眾課題。但這兩年情況完全變了——自動(dòng)駕駛要預(yù)測行人下一步往哪走服務(wù)機(jī)器人要判斷人類伸手是拿杯子還是推門VR/AR要提前渲染用戶姿態(tài)避免眩暈甚至運(yùn)動(dòng)康復(fù)領(lǐng)域也在用它做跌倒預(yù)警。需求一多問題就暴露了傳統(tǒng)方法在復(fù)雜場景里預(yù)測出來的動(dòng)作要么像提線木偶一樣僵硬要么直接穿墻穿桌子根本沒法用。CVPR24上小紅書團(tuán)隊(duì)放出的這項(xiàng)工作核心就是解決這個(gè)高保真問題。所謂高保真不只是關(guān)節(jié)角度預(yù)測得準(zhǔn)更關(guān)鍵的是預(yù)測出來的動(dòng)作要和3D場景發(fā)生合理的物理交互——該繞開的繞開該接觸的接觸該坐下的坐下。他們提出的方法把多模態(tài)場景感知和人體運(yùn)動(dòng)預(yù)測綁在一起做用注意力機(jī)制在場景點(diǎn)云、人體歷史姿態(tài)、文本語義之間建立關(guān)聯(lián)最終輸出的運(yùn)動(dòng)序列在物理合理性和視覺自然度上都比之前的方法高出一截。這篇文章適合誰看如果你正在做人體運(yùn)動(dòng)預(yù)測、多模態(tài)融合、3D場景理解相關(guān)的研究或工程落地或者你只是好奇CVPR級別的論文到底在解決什么實(shí)際問題、用了哪些技術(shù)手段那接下來的內(nèi)容應(yīng)該能給你不少參考。我會(huì)從整體設(shè)計(jì)思路、核心模塊拆解、實(shí)操復(fù)現(xiàn)要點(diǎn)、常見坑四個(gè)維度展開盡量把論文里沒寫透的工程細(xì)節(jié)補(bǔ)上。2. 整體設(shè)計(jì)思路拆解為什么要把場景感知和運(yùn)動(dòng)預(yù)測綁在一起2.1 傳統(tǒng)方法的死穴在哪里先說說之前的人體運(yùn)動(dòng)預(yù)測是怎么做的。主流方案基本是兩類一類是純姿態(tài)序列預(yù)測輸入過去若干幀的關(guān)節(jié)坐標(biāo)用RNN或者Transformer預(yù)測未來幀完全不考慮周圍環(huán)境另一類是把場景作為靜態(tài)背景編碼進(jìn)去比如用CNN提取場景特征然后和人體特征拼接。這兩類方法在簡單場景下還能看一旦場景復(fù)雜起來就原形畢露。純姿態(tài)預(yù)測的問題最明顯——模型根本不知道前面有堵墻預(yù)測出來的動(dòng)作直接穿過去。場景編碼的方法稍微好點(diǎn)但大多數(shù)工作只是把場景當(dāng)成一個(gè)全局特征向量丟失了空間結(jié)構(gòu)信息。舉個(gè)例子你坐在椅子上這個(gè)動(dòng)作需要知道椅面的高度、位置、朝向如果只給一個(gè)全局場景特征模型根本沒法判斷該往哪個(gè)方向坐、坐多深。還有一個(gè)被忽視的問題是模態(tài)單一。人體運(yùn)動(dòng)本身是多模態(tài)的——視覺上的姿態(tài)、語義上的動(dòng)作意圖、物理上的接觸力這些信息在不同模態(tài)里各有體現(xiàn)。只用姿態(tài)序列等于把其他模態(tài)的信息全扔了。2.2 多模態(tài)融合的切入點(diǎn)選擇小紅書這項(xiàng)工作最聰明的地方在于它沒有試圖用一個(gè)統(tǒng)一的大模型把所有模態(tài)一鍋燉而是針對不同模態(tài)設(shè)計(jì)了專門的編碼路徑再用注意力機(jī)制做跨模態(tài)對齊。具體來說場景用點(diǎn)云編碼人體用圖卷積處理骨架序列文本用預(yù)訓(xùn)練語言模型提取語義三條路各自獨(dú)立最后在特征空間里做融合。為什么這么設(shè)計(jì)因?yàn)椴煌B(tài)的數(shù)據(jù)結(jié)構(gòu)差異太大。點(diǎn)云是無序的3D點(diǎn)集合骨架是拓?fù)鋱D結(jié)構(gòu)文本是離散符號序列強(qiáng)行用同一種網(wǎng)絡(luò)處理效果肯定打折。分開編碼再融合既保留了各模態(tài)的原始特性又能在高層語義上建立關(guān)聯(lián)。提示多模態(tài)融合不是簡單地把特征拼在一起。拼接操作假設(shè)各模態(tài)特征在同一空間里可直接比較但實(shí)際往往不是。注意力機(jī)制的好處是它能學(xué)習(xí)到什么時(shí)候該看哪個(gè)模態(tài)比如預(yù)測坐下動(dòng)作時(shí)場景模態(tài)的權(quán)重會(huì)升高預(yù)測揮手動(dòng)作時(shí)人體歷史姿態(tài)的權(quán)重更大。2.3 注意力機(jī)制在這里到底起了什么作用論文里用了多頭自注意力和跨模態(tài)注意力兩種。自注意力用在時(shí)序建模上讓模型能關(guān)注歷史序列中不同時(shí)間步的關(guān)聯(lián)——比如當(dāng)前步的膝蓋彎曲程度可能和十幀前的腳部著地有關(guān)??缒B(tài)注意力用在場景和人體之間讓每個(gè)關(guān)節(jié)點(diǎn)都能查詢場景中相關(guān)的區(qū)域。這里有個(gè)細(xì)節(jié)值得說他們用的是通道-空間協(xié)同注意力而不是單純的SE通道注意力。SE只做通道維度的重標(biāo)定空間信息被壓縮掉了。但人體運(yùn)動(dòng)預(yù)測恰恰需要空間信息——手離桌面的距離、腳和地面的接觸點(diǎn)這些都在空間維度上。通道-空間協(xié)同的做法是先做通道注意力篩選重要特征通道再做空間注意力定位關(guān)鍵區(qū)域兩者串行或并行結(jié)合。多頭機(jī)制的作用是讓模型同時(shí)關(guān)注不同類型的關(guān)聯(lián)。比如一個(gè)頭關(guān)注手和物體的接觸關(guān)系另一個(gè)頭關(guān)注整體身體朝向和場景布局的一致性。8個(gè)頭各司其職最后拼接起來表達(dá)能力比單頭強(qiáng)很多。3. 核心模塊深度解析與實(shí)操要點(diǎn)3.1 場景點(diǎn)云編碼從原始點(diǎn)云到結(jié)構(gòu)化場景特征場景編碼這塊論文用的是PointNet的變體。原始點(diǎn)云動(dòng)輒幾萬個(gè)點(diǎn)直接送進(jìn)網(wǎng)絡(luò)計(jì)算量爆炸所以先做最遠(yuǎn)點(diǎn)采樣把點(diǎn)數(shù)降到1024或2048再用球查詢做局部特征聚合。這個(gè)過程中每個(gè)點(diǎn)的特征從原始的xyz坐標(biāo)擴(kuò)展到包含局部幾何信息的128維向量。實(shí)操中容易踩的坑是采樣策略的選擇。最遠(yuǎn)點(diǎn)采樣能保證空間覆蓋均勻但計(jì)算復(fù)雜度是O(N2)點(diǎn)多了很慢。隨機(jī)采樣快但可能漏掉關(guān)鍵區(qū)域。我的經(jīng)驗(yàn)是先用體素下采樣做粗篩再在最遠(yuǎn)點(diǎn)采樣做精篩速度和質(zhì)量能兼顧。場景特征提取完后還需要做一步坐標(biāo)對齊。因?yàn)槿梭w運(yùn)動(dòng)是在世界坐標(biāo)系下定義的場景點(diǎn)云如果沒對齊注意力機(jī)制學(xué)到的關(guān)聯(lián)就是錯(cuò)的。論文里用的是場景質(zhì)心對齊把點(diǎn)云平移到以場景中心為原點(diǎn)。但更穩(wěn)的做法是用主成分分析找場景的主方向把坐標(biāo)系旋轉(zhuǎn)到和場景布局一致這樣后續(xù)的空間注意力更容易學(xué)到方向性信息。3.2 人體骨架序列建模圖卷積加時(shí)序注意力的組合拳人體骨架天然是圖結(jié)構(gòu)——關(guān)節(jié)點(diǎn)是節(jié)點(diǎn)骨骼是邊。圖卷積網(wǎng)絡(luò)能直接在骨架上做卷積比把關(guān)節(jié)坐標(biāo)拉成向量再送進(jìn)MLP要合理得多。論文里用的是時(shí)空圖卷積空間維度上聚合相鄰關(guān)節(jié)的信息時(shí)間維度上聚合相鄰幀的信息。但純圖卷積有個(gè)問題感受野有限只能看到局部關(guān)節(jié)和局部時(shí)間步。要預(yù)測長時(shí)序運(yùn)動(dòng)必須引入全局注意力。他們的做法是在圖卷積后面接一個(gè)時(shí)序Transformer用自注意力捕捉長程依賴。這里的關(guān)鍵參數(shù)是注意力窗口大小——太小了捕捉不到長程依賴太大了計(jì)算量吃不消。論文里用的是滑動(dòng)窗口加全局token的混合方案窗口內(nèi)做局部注意力全局token負(fù)責(zé)匯總?cè)中畔?。注意時(shí)序注意力機(jī)制在訓(xùn)練時(shí)容易出現(xiàn)注意力坍縮所有時(shí)間步的注意力權(quán)重都集中到少數(shù)幾幀上。解決辦法是加注意力 dropout 或者用熵正則化鼓勵(lì)注意力分布更均勻。我在復(fù)現(xiàn)時(shí)試過加0.1的dropout效果比較穩(wěn)。3.3 跨模態(tài)注意力融合讓關(guān)節(jié)點(diǎn)學(xué)會(huì)看場景這是整篇論文最核心的創(chuàng)新點(diǎn)。具體做法是每個(gè)關(guān)節(jié)點(diǎn)特征作為query場景點(diǎn)云特征作為key和value做交叉注意力。這樣每個(gè)關(guān)節(jié)點(diǎn)都能根據(jù)自身位置和運(yùn)動(dòng)狀態(tài)從場景中檢索最相關(guān)的區(qū)域特征。舉個(gè)例子預(yù)測坐下這個(gè)動(dòng)作時(shí)髖關(guān)節(jié)的query會(huì)去查詢場景中椅面的位置和高度膝蓋的query會(huì)查詢椅面前沿的位置腳部的query會(huì)查詢地面高度。這種細(xì)粒度的查詢機(jī)制比全局場景特征拼接要精確得多。實(shí)操中要注意的是query和key的維度匹配。關(guān)節(jié)點(diǎn)特征通常是256維場景點(diǎn)特征也是256維但兩者語義空間不同直接做點(diǎn)積注意力效果不好。論文里加了一個(gè)線性投影層把兩個(gè)模態(tài)的特征映射到同一空間再做注意力。這個(gè)投影層的初始化很關(guān)鍵用正交初始化比默認(rèn)的Xavier初始化收斂更快。3.4 損失函數(shù)設(shè)計(jì)不只是關(guān)節(jié)點(diǎn)誤差如果只用關(guān)節(jié)點(diǎn)位置的L2損失模型會(huì)預(yù)測出關(guān)節(jié)角度正確但物理上不合理的動(dòng)作。論文里加了三個(gè)輔助損失一是骨骼長度一致性損失保證預(yù)測的骨骼長度和初始幀一致二是腳部接觸損失當(dāng)腳部接近地面時(shí)懲罰垂直方向的運(yùn)動(dòng)三是場景穿透損失懲罰人體關(guān)節(jié)點(diǎn)進(jìn)入場景障礙物內(nèi)部。這三個(gè)損失的權(quán)重需要調(diào)。我的經(jīng)驗(yàn)是骨骼長度損失權(quán)重設(shè)1.0腳部接觸損失設(shè)0.5場景穿透損失設(shè)0.8。穿透損失權(quán)重不能太高否則模型會(huì)過度保守預(yù)測出遠(yuǎn)離所有物體的動(dòng)作看起來畏手畏腳。4. 完整實(shí)操流程從數(shù)據(jù)準(zhǔn)備到模型訓(xùn)練4.1 數(shù)據(jù)集選擇與預(yù)處理論文主要在兩個(gè)數(shù)據(jù)集上做了實(shí)驗(yàn)一是Human3.6M這是人體運(yùn)動(dòng)預(yù)測的基準(zhǔn)數(shù)據(jù)集但場景信息比較簡單二是他們自己構(gòu)建的場景感知數(shù)據(jù)集包含人體運(yùn)動(dòng)和對應(yīng)的3D場景掃描。如果你要復(fù)現(xiàn)建議先從Human3.6M入手跑通流程后再上復(fù)雜場景數(shù)據(jù)。數(shù)據(jù)預(yù)處理的關(guān)鍵步驟包括姿態(tài)歸一化把人體根節(jié)點(diǎn)移到原點(diǎn)統(tǒng)一朝向、場景點(diǎn)云下采樣從原始掃描降到2048點(diǎn)、時(shí)序?qū)R確保人體序列和場景幀率一致。這里有個(gè)細(xì)節(jié)Human3.6M的場景是固定的但人體在動(dòng)所以場景特征只需要提取一次可以緩存起來加速訓(xùn)練。4.2 網(wǎng)絡(luò)搭建的核心參數(shù)我按論文描述和常見實(shí)踐整理了一份網(wǎng)絡(luò)配置參考模塊參數(shù)取值說明場景編碼采樣點(diǎn)數(shù)2048平衡精度和速度場景編碼局部特征維度128PointNet輸出維度人體編碼圖卷積層數(shù)3空間聚合范圍人體編碼時(shí)序注意力頭數(shù)8多頭機(jī)制跨模態(tài)注意力投影維度256統(tǒng)一特征空間跨模態(tài)注意力頭數(shù)4場景-人體關(guān)聯(lián)訓(xùn)練批量大小16受顯存限制訓(xùn)練初始學(xué)習(xí)率1e-4Adam優(yōu)化器訓(xùn)練學(xué)習(xí)率衰減0.95/10epoch指數(shù)衰減這個(gè)配置在單張24G顯存的卡上能跑起來批量大小再大就要用梯度累積了。4.3 訓(xùn)練過程中的關(guān)鍵節(jié)點(diǎn)訓(xùn)練分三個(gè)階段第一階段只訓(xùn)練人體編碼器和時(shí)序預(yù)測頭凍結(jié)場景編碼和跨模態(tài)注意力讓模型先學(xué)會(huì)基本的運(yùn)動(dòng)模式第二階段解凍跨模態(tài)注意力用較小的學(xué)習(xí)率微調(diào)第三階段全部解凍端到端訓(xùn)練。這種分階段策略比直接端到端訓(xùn)練收斂更穩(wěn)最終精度也更高。每個(gè)階段的epoch數(shù)大概是第一階段50第二階段30第三階段20??傆?xùn)練時(shí)間在單卡上大約3-4天。如果算力有限可以只跑第一階段加第二階段精度損失大概2-3個(gè)百分點(diǎn)但訓(xùn)練時(shí)間能省一半。提示訓(xùn)練時(shí)建議用TensorBoard監(jiān)控注意力權(quán)重的分布。如果發(fā)現(xiàn)跨模態(tài)注意力權(quán)重在所有關(guān)節(jié)點(diǎn)上都差不多說明模型沒學(xué)到有區(qū)分度的關(guān)聯(lián)需要檢查投影層初始化或增大注意力溫度系數(shù)。4.4 推理階段的加速技巧推理時(shí)不需要場景編碼的完整計(jì)算因?yàn)閳鼍笆庆o態(tài)的可以預(yù)先算好緩存。人體編碼和跨模態(tài)注意力是必須實(shí)時(shí)跑的但可以通過減少時(shí)序注意力窗口大小來加速。實(shí)測下來窗口從32降到16推理速度提升約40%精度下降不到1%。另一個(gè)技巧是關(guān)節(jié)點(diǎn)分組推理。把人體關(guān)節(jié)點(diǎn)分成上肢、下肢、軀干三組每組獨(dú)立做跨模態(tài)注意力最后融合。這樣注意力矩陣的尺寸從N×M降到(N/3)×M計(jì)算量減少三分之二。分組帶來的精度損失可以通過增加每組內(nèi)的注意力頭數(shù)來補(bǔ)償。5. 常見問題與排查技巧實(shí)錄5.1 預(yù)測動(dòng)作抖動(dòng)嚴(yán)重怎么辦這是最常見的問題。原因通常是時(shí)序注意力在相鄰幀之間跳變導(dǎo)致預(yù)測結(jié)果不連續(xù)。解決辦法有三個(gè)一是加時(shí)序平滑損失懲罰相鄰幀預(yù)測結(jié)果的差異二是在推理時(shí)用滑動(dòng)平均對連續(xù)幾幀的預(yù)測做加權(quán)平均三是增大時(shí)序注意力的窗口大小讓模型看到更長的歷史。我試過第一種和第二種結(jié)合抖動(dòng)明顯改善?;瑒?dòng)平均的窗口設(shè)5幀比較合適太大動(dòng)作會(huì)變遲鈍。5.2 場景穿透問題怎么調(diào)如果預(yù)測的人體經(jīng)常穿進(jìn)桌子或墻壁先檢查場景穿透損失的權(quán)重是不是太低。但更根本的原因可能是場景編碼不夠細(xì)粒度。PointNet的局部特征聚合半徑如果設(shè)得太大場景的細(xì)節(jié)就被抹平了。建議把球查詢半徑從0.2降到0.1增加局部特征的判別力。另一個(gè)容易被忽視的點(diǎn)是場景點(diǎn)云的法向量。如果點(diǎn)云只有坐標(biāo)沒有法向量模型很難判斷物體的朝向和表面。加上法向量估計(jì)后穿透問題通常能改善30%以上。5.3 多模態(tài)融合不work的排查思路如果跨模態(tài)注意力學(xué)不到東西按這個(gè)順序排查先看各模態(tài)單獨(dú)預(yù)測的結(jié)果是否合理如果場景模態(tài)單獨(dú)用效果就很差那融合肯定好不了再檢查投影層的輸出分布如果兩個(gè)模態(tài)投影后的特征均值差異很大說明投影層沒對齊好最后看注意力權(quán)重的熵熵太低說明注意力太集中熵太高說明太分散理想狀態(tài)是中等熵值。5.4 常見問題速查表問題現(xiàn)象可能原因排查方法解決措施動(dòng)作抖動(dòng)時(shí)序注意力跳變可視化注意力權(quán)重加平滑損失滑動(dòng)平均場景穿透場景特征太粗檢查球查詢半徑減小半徑加法向量融合無效投影層未對齊統(tǒng)計(jì)投影后特征分布正交初始化增大溫度訓(xùn)練不收斂學(xué)習(xí)率太大觀察loss曲線分階段訓(xùn)練衰減推理太慢注意力矩陣太大計(jì)時(shí)各模塊耗時(shí)關(guān)節(jié)點(diǎn)分組窗口縮減5.5 幾個(gè)獨(dú)家避坑經(jīng)驗(yàn)第一不要一上來就用復(fù)雜場景數(shù)據(jù)。先在Human3.6M上把基礎(chǔ)流程跑通確認(rèn)人體編碼和時(shí)序預(yù)測沒問題再逐步加入場景模態(tài)。我見過太多人直接上復(fù)雜數(shù)據(jù)結(jié)果出了問題根本不知道是哪個(gè)模塊的鍋。第二場景點(diǎn)云的下采樣策略比想象中重要。隨機(jī)下采樣會(huì)導(dǎo)致不同幀的場景特征不一致因?yàn)槊看尾傻狞c(diǎn)不一樣。一定要用確定性采樣比如最遠(yuǎn)點(diǎn)采樣或體素采樣保證場景特征在時(shí)間上穩(wěn)定。第三跨模態(tài)注意力的溫度系數(shù)需要調(diào)。默認(rèn)的1/sqrt(d)在模態(tài)差異大時(shí)會(huì)導(dǎo)致注意力過于尖銳適當(dāng)增大溫度系數(shù)能讓注意力分布更平滑融合效果更好。我一般從1.0開始試調(diào)到2.0左右比較常見。第四訓(xùn)練時(shí)用混合精度能省不少顯存但要注意跨模態(tài)注意力部分用FP32因?yàn)樽⒁饬?quán)重的數(shù)值范圍比較大FP16容易溢出。混合精度的策略是編碼器用FP16注意力和損失計(jì)算用FP32。6. 這套方法還能怎么擴(kuò)展論文本身做的是人體運(yùn)動(dòng)預(yù)測但這套多模態(tài)場景感知加注意力融合的框架遷移到其他任務(wù)上也很自然。比如手物交互預(yù)測把手部關(guān)節(jié)點(diǎn)替換成手部關(guān)鍵點(diǎn)場景點(diǎn)云替換成物體點(diǎn)云跨模態(tài)注意力學(xué)到的就是手和物體的接觸關(guān)系。再比如自動(dòng)駕駛中的行人軌跡預(yù)測把人體骨架換成行人位置序列場景點(diǎn)云換成鳥瞰圖特征框架基本不用大改。另一個(gè)擴(kuò)展方向是引入更多模態(tài)?,F(xiàn)在用了場景、人體、文本三個(gè)模態(tài)還可以加入物理屬性模態(tài)——比如物體的質(zhì)量、摩擦系數(shù)這些信息對預(yù)測接觸后的運(yùn)動(dòng)很重要。加入物理模態(tài)后跨模態(tài)注意力的頭數(shù)可能需要增加因?yàn)槟B(tài)間的關(guān)聯(lián)更復(fù)雜了。從工程落地角度看這套方法目前最大的瓶頸是場景點(diǎn)云的獲取。真實(shí)場景里很難拿到高質(zhì)量的3D掃描用深度相機(jī)重建的點(diǎn)云噪聲大、缺失多。一個(gè)折中方案是用2.5D的深度圖代替點(diǎn)云雖然損失了一些3D結(jié)構(gòu)信息但獲取容易得多在機(jī)器人平臺(tái)上更實(shí)用。我個(gè)人在實(shí)際操作中的體會(huì)是多模態(tài)融合這件事模態(tài)不是越多越好關(guān)鍵是模態(tài)之間要有互補(bǔ)性。場景和人體姿態(tài)互補(bǔ)性強(qiáng)融合收益明顯但如果再加一個(gè)和兩者都高度相關(guān)的模態(tài)收益就遞減了。選模態(tài)的時(shí)候先想清楚這個(gè)模態(tài)提供了其他模態(tài)沒有的什么信息想不清楚就別加。