摘要
cvpr2018上交作品,采用encoder-decoder的網(wǎng)絡(luò)模式,可以端到端地實現(xiàn)由單張RGB人臉圖像進行3D人臉重構(gòu)和密集人臉對齊的聯(lián)合任務(wù)。采用300W-LP作為訓(xùn)練集,對于大姿態(tài)人臉也能得到較好的結(jié)果。并且速度非??欤珿TX1080可達10ms/幀。代碼已開源,參見github(注:關(guān)于下文提到的3DDFA,3dmmasSTN等項目的代碼,在readme里最后作者有給出,需要的看仔細(xì)啦)
方法
該方法基本是在前人的基礎(chǔ)上一步步改進過來的,如3DDFA,
3DMMasSTN等??傮w來講,可大致分為3個部分:3D人臉模型,3D點云的uv圖表示以及網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計
3D人臉模型
參考3DDFA,3D人臉可看做是形狀和表情的和,其中3D形狀模型可基于BFM模型,通過3DMM(3D Morphable Model)系數(shù)來構(gòu)建,而3D表情模型可FW 模型構(gòu)建。二者之和再通過Pose(姿態(tài)角,平移,尺度)參數(shù)投影到攝像機坐標(biāo)系下,即得到3D點云的圖像坐標(biāo)。需要注意的是,BFM模型的點云數(shù)約為53490, FW表情模型的點云數(shù)約為53215,因此二者不能直接相加,需首先對BFM模型的點云進行篩選,僅從中提取53215個點(貌似是去除了嘴巴內(nèi)部的點),同時修正相應(yīng)的網(wǎng)格(triangles),這部分工作也是3DDFA團隊的貢獻。-
3D點云的UV圖表示
通過BFM形狀模型和表情模型,可以得到最終的3D點云的圖像坐標(biāo)(共53215個),每個點有x,y,z 3個坐標(biāo),共有53215x3個值,這些點云中的68個點x,y坐標(biāo)即為常用的68個人臉關(guān)鍵點,約40k個點的x,y坐標(biāo)即為密集人臉關(guān)鍵點。因此,本文的目標(biāo)就是從單張2D人臉RGB圖像中直接預(yù)測這約53k的點的3維坐標(biāo)值。一個簡單且普遍的是用一個1D向量來表示,即將3D點信息用一個向量來表示,然后用網(wǎng)絡(luò)預(yù)測;然而,這種方法丟失了空間信息。
相關(guān)研究中也有預(yù)測3DMM等模型的系數(shù),然后同坐模型建模來得到3D點云,但這些方法太過依賴3DMM模型,并且流程復(fù)雜;最近的VRN用Volumetric來表示,成功擺脫了上述問題,但是其網(wǎng)絡(luò)需要輸出192x192x200的一個Volume,計算量相當(dāng)大,重建分辨率將會受到限制。
針對這些問題,作者非常巧妙地將53215x3個值用一個3通道256x256的圖像來表示,即UV position map來表示,如下圖
UV 位置圖
左圖是輸入圖像的3D圖和3D點云ground-truth;右邊第1行,分別是2D圖像,UV文理映射圖,相應(yīng)的UV位置映射圖;右邊第2行,分別是UV位置映射圖的x,y,z通道。實際上UV 位置圖最初來源于3dmmasSTN,與3DDFA中的PNNC有類似的功能,二者詳細(xì)內(nèi)容及區(qū)別請參見這兩篇論文介紹。
-
網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計
論文網(wǎng)絡(luò)基于tensorflow實現(xiàn),共包含一層卷積層,10層resblock殘差塊(encoder)和17層轉(zhuǎn)置卷積(decoder),其中中間各層卷積、轉(zhuǎn)置卷積后跟著batchnorm和relu,最后一層轉(zhuǎn)置卷積的激活采用Sigmoid。encoder中各層的kernel均為4, out channel從16到512,輸出尺寸從256到8(每兩個resblock尺寸減半),decoder則反之,但細(xì)節(jié)與encoder仍存在些許差別,詳見代碼。輸入和輸出均為256x256 RGB圖像,其中輸入是人臉圖像,輸出是3D點云坐標(biāo)(共65536個)。最后分別從中提起相應(yīng)點的2d、3d坐標(biāo)來進行3D重建或人臉關(guān)鍵點。詳細(xì)結(jié)構(gòu)見下圖
resfcn256
結(jié)果


訓(xùn)練
- 數(shù)據(jù)集
在300W-LP數(shù)據(jù)集上訓(xùn)練,該數(shù)據(jù)集是3DDFA團隊基于現(xiàn)有的AFW,IBUG,HEPEP,F(xiàn)LWP等2D人臉對齊數(shù)據(jù)集,通過3DMM擬合得到的3DMM標(biāo)注,并對Pose,light,color等進行變化以及對原始圖像進行flip(鏡像)得到的一個大姿態(tài)3D人臉對齊數(shù)據(jù)集。
當(dāng)然作者也提出,可以采用其他的數(shù)據(jù)集來訓(xùn)練,那樣的話可能就不需要3dmm模型等相關(guān)的處理技巧,反正無論如何,流程都是:得到3D點云-> 插值形成uv位置圖->訓(xùn)練網(wǎng)絡(luò)這個步驟。只是得到3d點云的方式不同而已。 - 預(yù)處理
關(guān)于由3DMM系數(shù)得到3D點云的過程前文已介紹,此處需指出的是,groundtruth 點云共53215個,通過3dmmasSTN提供的插值方法,將這53k的點云通過3角插值,最終形成訓(xùn)練網(wǎng)絡(luò)的label:256x256。其他細(xì)節(jié)諸如數(shù)據(jù)增廣,輸入輸出歸一化,輸出z坐標(biāo)大于0等的處理不再詳述,論文都有介紹啦。 - 代碼實現(xiàn)
采用的框架是tensorflow,不得不說的是,作者代碼功底算是算法領(lǐng)域很好的水平,代碼無論是網(wǎng)絡(luò)實現(xiàn),還是api接口,都非常簡潔易懂,并且完全用python實現(xiàn)了3ddfa,3dmmasSTN中相關(guān)處理的matlab代碼,大大的佩服。
注:鑒于本人對3D模型的了解也只是皮毛,3d模型那塊的介紹并不深入甚至?xí)屑劼?,因此想深入了解的還是看論文比較簡單粗暴。

