查道安,江志君
(銅陵學(xué)院 電氣工程學(xué)院,安徽 銅陵 244000)
在模型訓(xùn)練過程中,輸入是一個(gè)視頻流或者多幀圖片數(shù)據(jù)。假設(shè)人臉正對(duì)相機(jī)且沒有其他干擾場景。雖然在數(shù)據(jù)采集過程中這一點(diǎn)很難保證,但是在數(shù)據(jù)預(yù)處理時(shí)會(huì)通過為人臉設(shè)置一個(gè)最大允許的偏轉(zhuǎn)角度來過濾掉有問題的幀。另外要求相機(jī)的位置固定,光線和背景都假設(shè)穩(wěn)定。
模型輸出是每一幀生成一個(gè)三維的網(wǎng)格,網(wǎng)格的數(shù)據(jù)點(diǎn)數(shù)目設(shè)置為5 453。三維點(diǎn)云的數(shù)目本身可以通過調(diào)整網(wǎng)絡(luò)參數(shù)來調(diào)節(jié),根據(jù)網(wǎng)絡(luò)結(jié)構(gòu)和其他因素設(shè)置此數(shù)目。一般來說,數(shù)據(jù)點(diǎn)太少不足以展示細(xì)節(jié)特征,數(shù)據(jù)點(diǎn)太多又會(huì)導(dǎo)致參數(shù)過多從而增加難度。
目前,通過多張人臉圖片進(jìn)行3D人臉重建[1],可以生成高精確度的3D人臉模型,但是需要大量的圖片。而基于單張圖片[2-3](Single View)進(jìn)行3D人臉重建更加困難,大致可以分為以下幾類[4-5]:
統(tǒng)計(jì)形狀表示(Statistical Shape Representations),如廣泛采用的3DMM方法,采用許多對(duì)齊的3D人臉形狀來進(jìn)行3D人臉重建。這類方法不能生成具有個(gè)體特征的人臉,而且只能在特定的條件下用于人臉識(shí)別。近期的方法中,有采用CNN的方法來調(diào)節(jié)3DMM人臉參數(shù)[6]。但是,研究發(fā)現(xiàn)缺乏足夠的訓(xùn)練數(shù)據(jù)是人臉識(shí)別中的一大問題。基于3DMM人臉模型的采樣來生成訓(xùn)練人臉圖片,生成的人臉圖片容易產(chǎn)生過擬合問題。因此,只能訓(xùn)練一個(gè)淺層殘差網(wǎng)絡(luò)。
場景假設(shè)方法[7](Scene Assumption Methods),為了獲取正確的人臉重建模型,一類研究對(duì)輸入圖片的場景和角度進(jìn)行估計(jì)。一些方法采用光源、臉部反射、臉部對(duì)稱性等信息來進(jìn)行估計(jì)。但是,這類估計(jì)在現(xiàn)實(shí)中并不適用。
基于實(shí)例的方法(Example Based Methods),按照輸入圖片來調(diào)整模板3D人臉。這類方法可以用于人臉識(shí)別中生成看不見的一面。
標(biāo)點(diǎn)擬合方法[8](Landmark Fitting Methods),這類重建方法首先檢測面部識(shí)別點(diǎn),然后將識(shí)別點(diǎn)比對(duì)到3D模型上面。
本次實(shí)驗(yàn)的所有數(shù)據(jù)均采集于RealSense,人臉面對(duì)攝像頭做出多種不同的表情,由攝像頭采集出視頻信息,所得到的數(shù)據(jù)以oni文件格式存儲(chǔ),oni格式文件是OpenNI導(dǎo)出的格式數(shù)據(jù)。然后需要將原始文件轉(zhuǎn)化成幀圖片數(shù)據(jù),這個(gè)可以使用OpenNI2的SDK讀取并轉(zhuǎn)化出來。
由于此次研究中要使用有監(jiān)督學(xué)習(xí),所以需要預(yù)先獲得每張圖片的真實(shí)值三維模型,在這里依靠動(dòng)態(tài)表情模型,在基礎(chǔ)模型上做變換得到匹配圖片中人臉表情的模型。項(xiàng)目中需要剔除背景,因此需要完成人臉識(shí)別,然后截取圖片。圖片中人臉的識(shí)別直接使用OpenCV中成熟的庫函數(shù)即可實(shí)現(xiàn)。所建立的模型是為了作為神經(jīng)網(wǎng)絡(luò)的真實(shí)值,所以目標(biāo)是準(zhǔn)確性,對(duì)它的處理速度沒有硬性要求。建模方法是通過估計(jì)一系列表情系數(shù),作用到表情向量上得到一個(gè)針對(duì)圖片中人臉表情的三維模型。使用3D混合模型來提供適用于實(shí)時(shí)跟蹤的緊致表示,從初始的粗糙估計(jì)開始,隨著追蹤過程的進(jìn)行逐步優(yōu)化動(dòng)態(tài)表情模型。
動(dòng)態(tài)表情模型[9]就是一個(gè)模型向量B=[b0,b1,…,bn],每個(gè)模型對(duì)應(yīng)一個(gè)表情,第一個(gè)表情b0就是中性表情,一個(gè)新的表情就可表示為:
F(x)=b0+ΔBx,ΔB=[b1-b0,b2-b0,…,bn-b0],x=[x1,x2,…,xn],
為了捕捉不同人臉的幾何特征,在一個(gè)很大幾何的人臉模型基礎(chǔ)上,使用PCA的降維表示來提取主要特征。同時(shí)為了更好得從模板表情到特定人臉表情的遷移,還需要一項(xiàng)空間系數(shù)。最終中性表情可以表示為b0=m+Py+Ez0,其中m+Py是PCA項(xiàng),Ez0是空間系數(shù)項(xiàng)。可以認(rèn)為模板模型中從中性表情到其他表情的變換與動(dòng)態(tài)模型中的變換是一致的,最終可以表示動(dòng)態(tài)模型中的任一表情:
Bi=Ti*b0+Ezi=Ti*(m+Py+Ez0)+Ezi,
算法最終能夠優(yōu)化出相機(jī)參數(shù)R和t,模型系數(shù)x,PCA參數(shù)y以及變形系數(shù)z,然后存儲(chǔ)在Parameter.txt文件中。Parameter文件中存儲(chǔ)的就是人臉系數(shù)和表情系數(shù),已有的Core Face Ware House中以矩陣形式存儲(chǔ)了50個(gè)人臉以及47個(gè)表情(含中性表情),一共存儲(chǔ)了11 510個(gè)三維點(diǎn)的信息,只要讀入Parameter文件,將矩陣乘以Parameter的第一行的人系數(shù)參數(shù)可得到特定的人,再乘以Parameter第二行的表情系數(shù)就能得到特定的表情。
兩組原始數(shù)據(jù)和重建的真實(shí)值如圖1、圖2所示。可將上面一行看做輸入,下面一行是神經(jīng)網(wǎng)絡(luò)的真實(shí)值。

圖1 modeling 1圖2 modeling 2
采集得到的數(shù)據(jù)圖片都是同時(shí)具有彩色和深度信息的,再加上相機(jī)采集的時(shí)候背景信息無法保持空白,所以需要對(duì)圖片做一些預(yù)處理,以獲得更有效地輸入,這些操作包括:
截取圖片中人臉的部分以去除不必要的背景,這一點(diǎn)由于在之前得到模型的算法中已經(jīng)對(duì)人臉進(jìn)行了識(shí)別,很容易完成;將截取后的圖片都統(tǒng)一采樣到240*320的分辨率上,作為網(wǎng)絡(luò)的統(tǒng)一輸入大小;將所有圖片變成黑白,減少無謂的信息量,因?yàn)檫@里的關(guān)注點(diǎn)在于人臉的結(jié)構(gòu)特征,而這一點(diǎn)彩色圖片并不比灰度圖片更有優(yōu)勢;做數(shù)據(jù)增強(qiáng),包括旋轉(zhuǎn)、平移等簡單變換以及亮度、對(duì)比度的改變,本次項(xiàng)目里針對(duì)不同的初始數(shù)據(jù)量(2 500和5 000)做了不同數(shù)目的數(shù)據(jù)增強(qiáng),只要最終保證總的數(shù)據(jù)量大約有20 000張圖片即可。
雖然采集的數(shù)據(jù)量是2 500張或者5 000張,但是其中會(huì)有一些異常值,這些錯(cuò)誤數(shù)據(jù)體現(xiàn)在人臉上的偏角過大,與算法的要求不符,會(huì)對(duì)網(wǎng)絡(luò)模型產(chǎn)生錯(cuò)誤影響。所以需要過濾掉人臉偏角過大的圖片和點(diǎn)云模型,根據(jù)之前的預(yù)處理算法,還得到了每張圖片的Pose.txt文件,可將所有數(shù)據(jù)掃描一遍,根據(jù)它們的y方向和z方向的偏角來決定人臉是否足夠正,如果偏角過大,則舍棄。
另外預(yù)處理所得到的三維模型是完整的頭部模型,但是這里輸入輸出只針對(duì)正臉,所以三維點(diǎn)云中有大部分?jǐn)?shù)據(jù)都可以去掉。通過軟件Open Flipper對(duì)基礎(chǔ)模型進(jìn)行切割,把有用的正面部分切割出來,將切割線信息保存到Selection.ini文件中。模板模型如圖3、圖4所示。圖4模型中的劃線為切割線,劃線是手動(dòng)描繪出的,考慮到圖片中的人臉也只是出現(xiàn)了正面的一部分,比如耳朵、頭頂均是未知的,所以截取的范圍比較小。圖3展示了原始的完整三維模型,圖4中的手繪線就是所做的Selection操作。

圖3 template.obj 圖4 selection
再使用openmesh操作每一個(gè)網(wǎng)格文件,應(yīng)用selection.ini取出正面部分,舍棄背面部分。這里實(shí)現(xiàn)的方法是為每一個(gè)頂點(diǎn)賦予一個(gè)新的屬性,名為cut。selection.ini文件中記錄的點(diǎn)的cut屬性值為0,從某個(gè)非劃分點(diǎn)出發(fā),運(yùn)用DFS算法逐步擴(kuò)張,終止條件就是碰到劃分點(diǎn),所有能遇到的點(diǎn)的cut屬性值均設(shè)為1,而所有不能遇到的點(diǎn)的cut屬性值均設(shè)為-1。然后按照cut屬性值讀出網(wǎng)格,就可以得到正面和背面的網(wǎng)格數(shù)據(jù)。
切割完成之后只要在obj文件的尾部添加上face的信息即可獲得完整模型。圖片與三維模型的預(yù)處理結(jié)果如圖5所示。圖5中第一列為原始三維模型,第二列為selection出來的正面點(diǎn)云,第三列為加上face信息后的正面三維模型,可以將其作為神經(jīng)網(wǎng)絡(luò)的輸入進(jìn)行訓(xùn)練。

圖5 圖片與三維模型的預(yù)處理結(jié)果
算法思想、標(biāo)準(zhǔn)化的圖片可以輸入到神經(jīng)網(wǎng)絡(luò)中,神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)如表1所示。
網(wǎng)絡(luò)的前半部分是一系列的卷積(conv)以及池化(pool)操作,負(fù)責(zé)提取人臉圖片中的結(jié)構(gòu)化信息,越靠后的卷積層能提取出更加高級(jí)的信息。這一部分的網(wǎng)絡(luò)參數(shù)的初始化使用了PReLU技術(shù)[10],在普通的ReLU的基礎(chǔ)上添加一個(gè)參數(shù)乘子,而這個(gè)乘子的大小與當(dāng)前l(fā)ayer的參數(shù)數(shù)目有關(guān)。

表1 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
后半部分中第一個(gè)全連接層通過計(jì)算原始數(shù)據(jù)的一個(gè)200維的PCA來初始化三維點(diǎn)云,然后在此基礎(chǔ)上進(jìn)行深度微調(diào)以求達(dá)到較為理想的效果。此神經(jīng)網(wǎng)絡(luò)的核心就在于從圖片中提取一個(gè)200維的特征向量,然后作用到PCA矩陣上,得到16 539維的一維向量,即三維點(diǎn)坐標(biāo)。
PCA的維度對(duì)最終結(jié)果會(huì)產(chǎn)生很大影響,若維度太小,那么會(huì)導(dǎo)致模型主要結(jié)構(gòu)特征缺失,無法有效地重建;如果維度太大,那么PCA本身就已經(jīng)能很好地表達(dá)特征信息,那么神經(jīng)網(wǎng)絡(luò)的改進(jìn)作用將被削弱。目標(biāo)是前期會(huì)通過一定量的預(yù)計(jì)算過程,但是直接的網(wǎng)絡(luò)上的運(yùn)算會(huì)很快而且效果明顯,可以達(dá)到實(shí)時(shí)的效果。
使用caffe來實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)搭建。輸入圖片為240*320,batch size為50;輸出的標(biāo)量數(shù)為16 359,即5 453個(gè)三維點(diǎn);PCA的維度為200;初始的learning rate為1e-12;為了簡便,使用的優(yōu)化方法是隨機(jī)梯度下降;神經(jīng)網(wǎng)絡(luò)的loss函數(shù)定義為運(yùn)算值與真實(shí)值之間的差的平方和,即
Loss(x)=Σ(groundtruth-y(x))2,
caffe訓(xùn)練的epoch數(shù)目為50,但是從后面的結(jié)果來看,程序在第20個(gè)epoch左右就已經(jīng)收斂了,再進(jìn)行迭代運(yùn)算并不能使結(jié)果變得更好。
實(shí)驗(yàn)結(jié)果的截圖如圖6所示。左邊為人臉圖片,右邊為重建出來的三維模型。從實(shí)驗(yàn)結(jié)果可以看出該算法可以較為準(zhǔn)確地重建出人臉的三維模型。結(jié)果可能不是特別光滑,但是對(duì)于人臉的細(xì)節(jié)特征表現(xiàn)得很好,原有的ground truth效果更加光滑,但是卻缺失一些細(xì)節(jié)。下面是測試時(shí)的時(shí)間記錄,共有6個(gè)測試用例,每個(gè)測試用例用三行來描述。第一行是文件名,第二行是文件大小,第三行表示運(yùn)行時(shí)間和結(jié)果的loss,最后是平均運(yùn)行時(shí)間。

圖6 實(shí)驗(yàn)結(jié)果截圖
1074C_gray_image.jpg
shape:(240,320)
time:0.003533 s loss:29138.6015625
1075C_gray_image.jpg
shape:(240,320)
time:0.00353 s loss:23904.109375
1076D_gray_image.jpg
shape:(240,320)
time:0.003308 s loss:21336.0703125
1077G_gray_image.jpg
shape:(240,320)
time:0.003291 s loss:26257.6171875
1080D_gray_image.jpg
shape:(240,320)
time:0.003395 s loss:284726.640625
1083_gray_image.jpg
shape:(240,320)
time:0.003375 s loss:24022.21875
average test time:0.00339262 s
loss隨迭代次數(shù)增加的變化如圖7所示。這里的數(shù)據(jù)并沒有做歸一化,所以loss數(shù)值很大,但是均攤到每個(gè)點(diǎn)上其實(shí)很小。圖7中橫坐標(biāo)是caffe中的epoch,縱坐標(biāo)是loss值的大小,每一種顏色值代表在當(dāng)前epoch中迭代到特定的次數(shù)。
每一個(gè)epoch中隨著迭代次數(shù)的增加,loss的變化規(guī)律如圖8所示。

圖7 loss隨迭代次數(shù)增加的變化 圖8 loss的變化規(guī)律
從表1中可以看出,隨著epoch的增加,所有l(wèi)oss都在下降,SGD優(yōu)化算法雖然簡單,卻也是實(shí)用的算法。但是考慮在某一個(gè)特定的epoch中,loss并不是簡單隨著迭代次數(shù)的增加而增加,很多時(shí)候loss都會(huì)產(chǎn)生波動(dòng),或者維持穩(wěn)定沒有很大改善。這里如果使用更為復(fù)雜的優(yōu)化算法比如ADAM,可能會(huì)更快更有效地收斂。
另外,由于PCA可以提取主要特征,只要前期可以把不同人臉的數(shù)據(jù)都作為輸入,并計(jì)算出一個(gè)混合的PCA值,它就可以容納不同的人臉的區(qū)別,從而通過這一網(wǎng)絡(luò)實(shí)現(xiàn)不同的人臉重建任務(wù)。
對(duì)于深度學(xué)習(xí)而言,真實(shí)值的效果好壞直接影響到學(xué)習(xí)到的模型的優(yōu)劣,因此如果數(shù)據(jù)開始處理階段生成的模型就有問題的話,那對(duì)學(xué)習(xí)效果的影響非常大。對(duì)于一個(gè)幾分鐘甚至十幾分鐘的視頻流來說,一共要截取幾千幀數(shù)據(jù)并加以處理,很多幀數(shù)據(jù)得到的3D模型的正確性無法得到保證,雖然大部分模型可以與圖片中的人臉相匹配,但仍然有部分模型與圖片不一致,可能是延遲,也可能是其他原因。但按照該算法,一個(gè)模型的錯(cuò)誤并不是只會(huì)影響到它所對(duì)應(yīng)的這一張圖片的結(jié)果。由于在最開始使用了PCA來降維,然后將其作為網(wǎng)絡(luò)中全連接層的初始化,神經(jīng)網(wǎng)絡(luò)的作用是在此初始的粗糙結(jié)果上做微小的調(diào)整,得到精細(xì)的結(jié)果。當(dāng)部分模型不一致的時(shí)候,它會(huì)對(duì)PCA產(chǎn)生影響,從而使某一類圖片上的人臉表情在推導(dǎo)3D模型的時(shí)候往錯(cuò)誤的方向偏移,得到不準(zhǔn)確的結(jié)果。這里所實(shí)現(xiàn)的工作是利用了圖片中的特征信息,拿它去乘PCA矩陣從而得到16 539個(gè)標(biāo)量。雖然現(xiàn)在只能實(shí)現(xiàn)重建模型這一種任務(wù),但是基于這種特征提取+PCA初始化+網(wǎng)絡(luò)優(yōu)化的模式可以去做更多的事情,如果能提取到更多的特征,就能實(shí)現(xiàn)比如特征點(diǎn)檢測、可見性檢測[11]等更多的任務(wù),得到更精確的人臉模型,這是此算法值得思考的地方。