(文章來源:VR陀螺網(wǎng))
當我們通過攝像頭得到深度圖后,下一步就是把深度圖輸入給算法,算法可以輸出我們手部所有關(guān)鍵點的 3D 位置。手部關(guān)鍵點也可以理解為手部骨架的關(guān)節(jié)點,通常用 21 個 3D 關(guān)鍵點來描述。每個 3D 關(guān)鍵點有 3 個自由度,那么輸出維度就是 21*3。目前學術(shù)界已經(jīng)提出各種算法用于解決“基于深度的手勢姿態(tài)估計問題“,這些算法大體可以分成模型驅(qū)動(model-driven)和數(shù)據(jù)驅(qū)動(data-driven)兩種方式。
1、模型驅(qū)動類算法,此類算法通常是預先用手部 pose(pose 指位姿參數(shù)或節(jié)點位置,后文將統(tǒng)稱為 pose)生成一系列手的幾何模型,并建立一個搜索空間(所有可能的手勢幾何模型的集合),然后在搜索空間內(nèi)找到與輸入深度圖最匹配的模型。此時,模型對應(yīng)的參數(shù)就是所求的 pose。模型驅(qū)動類算法通常需要設(shè)計一種方式把 pose 轉(zhuǎn)換成對應(yīng)的幾何模型。
此論文用了 linear blend skinning(一種骨骼蒙皮動畫算法):意思就是給骨架蒙上一層皮膚,并讓皮膚跟隨骨骼運動一起變化,多用于動畫領(lǐng)域。先把 pose 轉(zhuǎn)換成對應(yīng)的 mesh(下圖左側(cè)),在進一步轉(zhuǎn)換成光滑曲面模型。我們可以理解為 pose 是自變量,幾何模型可由 pose 算出,且?guī)缀文P团c pose 一一對應(yīng)。
輸入的手部深度圖可轉(zhuǎn)化為點云, 此點云就相當于在真實的手表面上采集到的一些 3D 點,如下圖中的紅點和藍點:這樣就可以定義損失函數(shù)為點云中的點到模型表面的距離(上圖中的紅線),以此描述深度圖和pose的相似度。損失函數(shù)的輸入是深度圖和 pose,輸出是差異度。損失函數(shù)的輸出值越小,說明輸入的深度圖和pose越相似。
因此,只要在搜索空間中找到令損失函數(shù)最小的 pose 即為所求的pose。但因搜索空間不能寫成解析形式,沒法一次性求出損失函數(shù)的最小值,通常只能用數(shù)值計算方法,如PSO,ICP等,不斷迭代計算得到最優(yōu)解。迭代的數(shù)值解法通常對初始化要求較高,若初始化的不好,則需要很長時間才能迭代收斂,還有可能無法收斂到全局最小值(因為損失函數(shù)是非凸函數(shù)),所以算法實現(xiàn)時,通常利用上一幀的pose來初始化當前幀的計算。
這種模型驅(qū)動類方法需要手工設(shè)計幾何模型和損失函數(shù)。簡單的幾何模型計算量小,復雜的幾何模型準確度高。通常設(shè)計模型時需要在準確度和性能之間做權(quán)衡。模型驅(qū)動類的算法優(yōu)勢是不需要任何訓練數(shù)據(jù),只要設(shè)計的好,寫完就可以直接用。 缺點是需要手工設(shè)計模型,計算量較大,容易誤差累計導致漂移,對初始化要求高,通常只能用在手勢追蹤領(lǐng)域。
2、數(shù)據(jù)驅(qū)動類算法,此類算法是指利用收集數(shù)據(jù)中訓練樣本與其對應(yīng)的標簽關(guān)系,讓機器學習一個從樣本到標簽的映射。 此類算法屬于判別式方法(Discriminative Approaches)。
這樣的機器學習算法有很多,可以是早期使用的隨機森林,SVM 或是最近研究的火熱的神經(jīng)網(wǎng)絡(luò)等。此類方法的優(yōu)點是不需要設(shè)計復雜的模型,缺點是需要大數(shù)據(jù)。但現(xiàn)在大數(shù)據(jù)時代數(shù)據(jù)量已經(jīng)不是問題,這種數(shù)據(jù)驅(qū)動的方式已經(jīng)成為目前的主流研究方向。
早期學術(shù)界研究手勢關(guān)鍵點回歸的經(jīng)典方法有 Cascade regression, Latent Regression Forest 等。近些年研究主要集中在各類神經(jīng)網(wǎng)絡(luò)如:DeepPrior 系列、REN、pose guided、3D-CNN、MulTI-View CNNs、HandPointNet、Feedback Loop 等。
由于此處討論的用于手勢的神經(jīng)網(wǎng)絡(luò)與普通的圖的神經(jīng)網(wǎng)絡(luò)并無本質(zhì)差異,而神經(jīng)網(wǎng)絡(luò)的科普文章已經(jīng)很多,這里就不做科普了,我們僅挑幾個有代表性的網(wǎng)絡(luò)結(jié)構(gòu)介紹一下:DeepPrior:網(wǎng)絡(luò)結(jié)構(gòu)大體如下圖,通過初始網(wǎng)絡(luò)得到粗略的 pose,再用 refine 網(wǎng)絡(luò)不斷優(yōu)化, 并且在最后的全連接層前加了一個低維嵌入,迫使網(wǎng)絡(luò)學習把特征空間壓縮到更低維度。 此網(wǎng)絡(luò)后續(xù)有更優(yōu)化的版本 DeepPrior++。
網(wǎng)絡(luò)在預測 pose 之后,反過來用 pose 生成深度圖,并與輸入的深度圖一起預測更優(yōu)的 pose,此 pose 又可用來生成更優(yōu)的深度圖,以此迭代循環(huán)優(yōu)化pose。3D CNN:網(wǎng)絡(luò)結(jié)構(gòu)如下圖,此網(wǎng)絡(luò)把2D深度圖上用像素的描述的深度信息,以TSDF的方式轉(zhuǎn)化為體素(3D的像素),并用3D 卷積代替了普通的2D卷積。
此處最大的貢獻就是在網(wǎng)絡(luò)結(jié)構(gòu)上從2D走到了3D,因為傳統(tǒng)2D卷積網(wǎng)絡(luò)是為2D圖像設(shè)計的,并不一定適合3D信息的提取,而用3D卷積網(wǎng)絡(luò)則更容易獲取3D特征,也就更適用于3D手部關(guān)鍵點回歸的問題。HandPointNet:網(wǎng)絡(luò)輸入時把深度圖轉(zhuǎn)成點云,然后用 PointNet 做手部 3D 關(guān)鍵點回歸。
HandPointNet的主要貢獻是首次把PointNet用在了手勢關(guān)鍵點回歸上,其中的PointNet是很有代表性的網(wǎng)絡(luò)。PointNet 首次用 3D 點云來作為網(wǎng)絡(luò)輸入而不是 2D 圖片。PointNet 比上一個介紹的 3DCNN 更進一步探索了在 3D 空間中的神經(jīng)網(wǎng)絡(luò)架構(gòu),以及如何更有效的提取 3D 特征,PointNet后續(xù)有更優(yōu)化的版本PointNet++。
? ? ?