查道安,江志君
(銅陵學院 電氣工程學院,安徽 銅陵 244000)
在模型訓練過程中,輸入是一個視頻流或者多幀圖片數(shù)據(jù)。假設人臉正對相機且沒有其他干擾場景。雖然在數(shù)據(jù)采集過程中這一點很難保證,但是在數(shù)據(jù)預處理時會通過為人臉設置一個最大允許的偏轉角度來過濾掉有問題的幀。另外要求相機的位置固定,光線和背景都假設穩(wěn)定。
模型輸出是每一幀生成一個三維的網(wǎng)格,網(wǎng)格的數(shù)據(jù)點數(shù)目設置為5 453。三維點云的數(shù)目本身可以通過調(diào)整網(wǎng)絡參數(shù)來調(diào)節(jié),根據(jù)網(wǎng)絡結構和其他因素設置此數(shù)目。一般來說,數(shù)據(jù)點太少不足以展示細節(jié)特征,數(shù)據(jù)點太多又會導致參數(shù)過多從而增加難度。
目前,通過多張人臉圖片進行3D人臉重建[1],可以生成高精確度的3D人臉模型,但是需要大量的圖片。而基于單張圖片[2-3](Single View)進行3D人臉重建更加困難,大致可以分為以下幾類[4-5]:
統(tǒng)計形狀表示(Statistical Shape Representations),如廣泛采用的3DMM方法,采用許多對齊的3D人臉形狀來進行3D人臉重建。這類方法不能生成具有個體特征的人臉,而且只能在特定的條件下用于人臉識別。近期的方法中,有采用CNN的方法來調(diào)節(jié)3DMM人臉參數(shù)[6]。但是,研究發(fā)現(xiàn)缺乏足夠的訓練數(shù)據(jù)是人臉識別中的一大問題?;?DMM人臉模型的采樣來生成訓練人臉圖片,生成的人臉圖片容易產(chǎn)生過擬合問題。因此,只能訓練一個淺層殘差網(wǎng)絡。
場景假設方法[7](Scene Assumption Methods),為了獲取正確的人臉重建模型,一類研究對輸入圖片的場景和角度進行估計。一些方法采用光源、臉部反射、臉部對稱性等信息來進行估計。但是,這類估計在現(xiàn)實中并不適用。
基于實例的方法(Example Based Methods),按照輸入圖片來調(diào)整模板3D人臉。這類方法可以用于人臉識別中生成看不見的一面。
標點擬合方法[8](Landmark Fitting Methods),這類重建方法首先檢測面部識別點,然后將識別點比對到3D模型上面。
本次實驗的所有數(shù)據(jù)均采集于RealSense,人臉面對攝像頭做出多種不同的表情,由攝像頭采集出視頻信息,所得到的數(shù)據(jù)以oni文件格式存儲,oni格式文件是OpenNI導出的格式數(shù)據(jù)。然后需要將原始文件轉化成幀圖片數(shù)據(jù),這個可以使用OpenNI2的SDK讀取并轉化出來。
由于此次研究中要使用有監(jiān)督學習,所以需要預先獲得每張圖片的真實值三維模型,在這里依靠動態(tài)表情模型,在基礎模型上做變換得到匹配圖片中人臉表情的模型。項目中需要剔除背景,因此需要完成人臉識別,然后截取圖片。圖片中人臉的識別直接使用OpenCV中成熟的庫函數(shù)即可實現(xiàn)。所建立的模型是為了作為神經(jīng)網(wǎng)絡的真實值,所以目標是準確性,對它的處理速度沒有硬性要求。建模方法是通過估計一系列表情系數(shù),作用到表情向量上得到一個針對圖片中人臉表情的三維模型。使用3D混合模型來提供適用于實時跟蹤的緊致表示,從初始的粗糙估計開始,隨著追蹤過程的進行逐步優(yōu)化動態(tài)表情模型。
動態(tài)表情模型[9]就是一個模型向量B=[b0,b1,…,bn],每個模型對應一個表情,第一個表情b0就是中性表情,一個新的表情就可表示為:
F(x)=b0+ΔBx,ΔB=[b1-b0,b2-b0,…,bn-b0],x=[x1,x2,…,xn],
為了捕捉不同人臉的幾何特征,在一個很大幾何的人臉模型基礎上,使用PCA的降維表示來提取主要特征。同時為了更好得從模板表情到特定人臉表情的遷移,還需要一項空間系數(shù)。最終中性表情可以表示為b0=m+Py+Ez0,其中m+Py是PCA項,Ez0是空間系數(shù)項??梢哉J為模板模型中從中性表情到其他表情的變換與動態(tài)模型中的變換是一致的,最終可以表示動態(tài)模型中的任一表情:
Bi=Ti*b0+Ezi=Ti*(m+Py+Ez0)+Ezi,
算法最終能夠優(yōu)化出相機參數(shù)R和t,模型系數(shù)x,PCA參數(shù)y以及變形系數(shù)z,然后存儲在Parameter.txt文件中。Parameter文件中存儲的就是人臉系數(shù)和表情系數(shù),已有的Core Face Ware House中以矩陣形式存儲了50個人臉以及47個表情(含中性表情),一共存儲了11 510個三維點的信息,只要讀入Parameter文件,將矩陣乘以Parameter的第一行的人系數(shù)參數(shù)可得到特定的人,再乘以Parameter第二行的表情系數(shù)就能得到特定的表情。
兩組原始數(shù)據(jù)和重建的真實值如圖1、圖2所示??蓪⑸厦嬉恍锌醋鲚斎?,下面一行是神經(jīng)網(wǎng)絡的真實值。
圖1 modeling 1圖2 modeling 2
采集得到的數(shù)據(jù)圖片都是同時具有彩色和深度信息的,再加上相機采集的時候背景信息無法保持空白,所以需要對圖片做一些預處理,以獲得更有效地輸入,這些操作包括:
截取圖片中人臉的部分以去除不必要的背景,這一點由于在之前得到模型的算法中已經(jīng)對人臉進行了識別,很容易完成;將截取后的圖片都統(tǒng)一采樣到240*320的分辨率上,作為網(wǎng)絡的統(tǒng)一輸入大??;將所有圖片變成黑白,減少無謂的信息量,因為這里的關注點在于人臉的結構特征,而這一點彩色圖片并不比灰度圖片更有優(yōu)勢;做數(shù)據(jù)增強,包括旋轉、平移等簡單變換以及亮度、對比度的改變,本次項目里針對不同的初始數(shù)據(jù)量(2 500和5 000)做了不同數(shù)目的數(shù)據(jù)增強,只要最終保證總的數(shù)據(jù)量大約有20 000張圖片即可。
雖然采集的數(shù)據(jù)量是2 500張或者5 000張,但是其中會有一些異常值,這些錯誤數(shù)據(jù)體現(xiàn)在人臉上的偏角過大,與算法的要求不符,會對網(wǎng)絡模型產(chǎn)生錯誤影響。所以需要過濾掉人臉偏角過大的圖片和點云模型,根據(jù)之前的預處理算法,還得到了每張圖片的Pose.txt文件,可將所有數(shù)據(jù)掃描一遍,根據(jù)它們的y方向和z方向的偏角來決定人臉是否足夠正,如果偏角過大,則舍棄。
另外預處理所得到的三維模型是完整的頭部模型,但是這里輸入輸出只針對正臉,所以三維點云中有大部分數(shù)據(jù)都可以去掉。通過軟件Open Flipper對基礎模型進行切割,把有用的正面部分切割出來,將切割線信息保存到Selection.ini文件中。模板模型如圖3、圖4所示。圖4模型中的劃線為切割線,劃線是手動描繪出的,考慮到圖片中的人臉也只是出現(xiàn)了正面的一部分,比如耳朵、頭頂均是未知的,所以截取的范圍比較小。圖3展示了原始的完整三維模型,圖4中的手繪線就是所做的Selection操作。
圖3 template.obj 圖4 selection
再使用openmesh操作每一個網(wǎng)格文件,應用selection.ini取出正面部分,舍棄背面部分。這里實現(xiàn)的方法是為每一個頂點賦予一個新的屬性,名為cut。selection.ini文件中記錄的點的cut屬性值為0,從某個非劃分點出發(fā),運用DFS算法逐步擴張,終止條件就是碰到劃分點,所有能遇到的點的cut屬性值均設為1,而所有不能遇到的點的cut屬性值均設為-1。然后按照cut屬性值讀出網(wǎng)格,就可以得到正面和背面的網(wǎng)格數(shù)據(jù)。
切割完成之后只要在obj文件的尾部添加上face的信息即可獲得完整模型。圖片與三維模型的預處理結果如圖5所示。圖5中第一列為原始三維模型,第二列為selection出來的正面點云,第三列為加上face信息后的正面三維模型,可以將其作為神經(jīng)網(wǎng)絡的輸入進行訓練。
圖5 圖片與三維模型的預處理結果
算法思想、標準化的圖片可以輸入到神經(jīng)網(wǎng)絡中,神經(jīng)網(wǎng)絡結構如表1所示。
網(wǎng)絡的前半部分是一系列的卷積(conv)以及池化(pool)操作,負責提取人臉圖片中的結構化信息,越靠后的卷積層能提取出更加高級的信息。這一部分的網(wǎng)絡參數(shù)的初始化使用了PReLU技術[10],在普通的ReLU的基礎上添加一個參數(shù)乘子,而這個乘子的大小與當前l(fā)ayer的參數(shù)數(shù)目有關。
表1 神經(jīng)網(wǎng)絡結構
后半部分中第一個全連接層通過計算原始數(shù)據(jù)的一個200維的PCA來初始化三維點云,然后在此基礎上進行深度微調(diào)以求達到較為理想的效果。此神經(jīng)網(wǎng)絡的核心就在于從圖片中提取一個200維的特征向量,然后作用到PCA矩陣上,得到16 539維的一維向量,即三維點坐標。
PCA的維度對最終結果會產(chǎn)生很大影響,若維度太小,那么會導致模型主要結構特征缺失,無法有效地重建;如果維度太大,那么PCA本身就已經(jīng)能很好地表達特征信息,那么神經(jīng)網(wǎng)絡的改進作用將被削弱。目標是前期會通過一定量的預計算過程,但是直接的網(wǎng)絡上的運算會很快而且效果明顯,可以達到實時的效果。
使用caffe來實現(xiàn)神經(jīng)網(wǎng)絡的結構搭建。輸入圖片為240*320,batch size為50;輸出的標量數(shù)為16 359,即5 453個三維點;PCA的維度為200;初始的learning rate為1e-12;為了簡便,使用的優(yōu)化方法是隨機梯度下降;神經(jīng)網(wǎng)絡的loss函數(shù)定義為運算值與真實值之間的差的平方和,即
Loss(x)=Σ(groundtruth-y(x))2,
caffe訓練的epoch數(shù)目為50,但是從后面的結果來看,程序在第20個epoch左右就已經(jīng)收斂了,再進行迭代運算并不能使結果變得更好。
實驗結果的截圖如圖6所示。左邊為人臉圖片,右邊為重建出來的三維模型。從實驗結果可以看出該算法可以較為準確地重建出人臉的三維模型。結果可能不是特別光滑,但是對于人臉的細節(jié)特征表現(xiàn)得很好,原有的ground truth效果更加光滑,但是卻缺失一些細節(jié)。下面是測試時的時間記錄,共有6個測試用例,每個測試用例用三行來描述。第一行是文件名,第二行是文件大小,第三行表示運行時間和結果的loss,最后是平均運行時間。
圖6 實驗結果截圖
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ù)值很大,但是均攤到每個點上其實很小。圖7中橫坐標是caffe中的epoch,縱坐標是loss值的大小,每一種顏色值代表在當前epoch中迭代到特定的次數(shù)。
每一個epoch中隨著迭代次數(shù)的增加,loss的變化規(guī)律如圖8所示。
圖7 loss隨迭代次數(shù)增加的變化 圖8 loss的變化規(guī)律
從表1中可以看出,隨著epoch的增加,所有l(wèi)oss都在下降,SGD優(yōu)化算法雖然簡單,卻也是實用的算法。但是考慮在某一個特定的epoch中,loss并不是簡單隨著迭代次數(shù)的增加而增加,很多時候loss都會產(chǎn)生波動,或者維持穩(wěn)定沒有很大改善。這里如果使用更為復雜的優(yōu)化算法比如ADAM,可能會更快更有效地收斂。
另外,由于PCA可以提取主要特征,只要前期可以把不同人臉的數(shù)據(jù)都作為輸入,并計算出一個混合的PCA值,它就可以容納不同的人臉的區(qū)別,從而通過這一網(wǎng)絡實現(xiàn)不同的人臉重建任務。
對于深度學習而言,真實值的效果好壞直接影響到學習到的模型的優(yōu)劣,因此如果數(shù)據(jù)開始處理階段生成的模型就有問題的話,那對學習效果的影響非常大。對于一個幾分鐘甚至十幾分鐘的視頻流來說,一共要截取幾千幀數(shù)據(jù)并加以處理,很多幀數(shù)據(jù)得到的3D模型的正確性無法得到保證,雖然大部分模型可以與圖片中的人臉相匹配,但仍然有部分模型與圖片不一致,可能是延遲,也可能是其他原因。但按照該算法,一個模型的錯誤并不是只會影響到它所對應的這一張圖片的結果。由于在最開始使用了PCA來降維,然后將其作為網(wǎng)絡中全連接層的初始化,神經(jīng)網(wǎng)絡的作用是在此初始的粗糙結果上做微小的調(diào)整,得到精細的結果。當部分模型不一致的時候,它會對PCA產(chǎn)生影響,從而使某一類圖片上的人臉表情在推導3D模型的時候往錯誤的方向偏移,得到不準確的結果。這里所實現(xiàn)的工作是利用了圖片中的特征信息,拿它去乘PCA矩陣從而得到16 539個標量。雖然現(xiàn)在只能實現(xiàn)重建模型這一種任務,但是基于這種特征提取+PCA初始化+網(wǎng)絡優(yōu)化的模式可以去做更多的事情,如果能提取到更多的特征,就能實現(xiàn)比如特征點檢測、可見性檢測[11]等更多的任務,得到更精確的人臉模型,這是此算法值得思考的地方。