基於資料驅動的人臉卡通動畫生成

作者:hjimce

在現實生活中,我們經常會去評價一個人,長得是否漂亮、是不是帥哥美女,然而如何用五官的資料去評價一個人是否長得五官比例協調,我們卻很難說出來,也就是你為什麼覺得某個人長得漂亮?是因為她眼睛大,嘴巴小,還是她五官位置符合江湖傳說中的黃金比例呢?我今天要講的這篇paper的創新點就是回答了這些問題,通過這篇paper的演算法,你可以找一堆非常漂亮的美女作為訓練資料庫,然後用於評價一個輸入的照片的五官位置是否長得比例協調,也就是實現一個最簡單的長相評分系統,當然這個評分功能不涉及面板紋理等,只是用於評價一個人五官位置、大小比例是否協調。

  這篇paper還有一個可能的工程應用點,如果你的訓練資料足夠perfect的話,那麼你可以實現這樣的一個App功能:智慧整容演算法。也就是使用者輸入一張照片,我們可以根據paper的演算法,預測五官的正確位置,以這些正確位置為控制頂點,利用影象變形演算法,實現五官的自動整容,當然這個最後整容效果的好壞,很依賴於訓練資料,正面照片實現估計會比較簡單,但是實現各種角度的照片的整容,那就……

 不過因為paper的五官位置調整演算法,給我的感覺不咋地,所以具體是否經過整容後,真的變得漂亮,實在很難判斷……。還有學習這篇paper的意義:通過學習這篇paper,我們可以推測騰訊的天天P圖的人臉整形、眼睛放大、嘴巴微笑等演算法有可能用了《移動最小二乘的變形》演算法實現的,還有天天p圖的頭髮識別,有可能是採用了本文的頭髮識別方法,也就是藉助於模板髮型進行頭髮區域的識別。

    OK,回到本篇博文的主題,《基於資料驅動的卡通動畫生成》是由騰訊優圖團隊發表的一篇paper,英文名為:《Data-Driven Face Cartoon Stylization 》,是2014年Siggraph Asia 上的一篇paper,其實現了人像卡通動畫的生成:


   也就是使用者輸入一張圖片,然後根據演算法,它會自動生成使用者對應的卡通動畫圖。看起來是不是高大上的樣子,看了paper的效果圖是不是感覺很牛逼的樣子,然而其實我這篇paper演算法的魯棒性很差,這篇文章能夠被Siggraph Asia錄用,唯一的亮點是因為它提出來了一個五官位置、比例自動調整演算法,利用SVM演算法進行五官比例、位置等資料擬合。

   這個功能好像曾經在世界盃期間,被應用於“天天p圖”的世界盃互動功能中,當然估計是因為魯棒性問題,所以……。整個過程的演算法除了髮型識別、單眼皮雙眼皮識別、性別識別這三個演算法沒有去做,其他的都驗證了,演算法的魯棒性確實很差,心塞啊,OK,接著我們就講解一些paper的演算法實現。

   這篇paper,分為三個步驟:1、建立訓練資料,也就是卡通動畫的五官庫。2、使用者輸入一張照片,進行最近鄰相似搜尋。3、五官位置擺放,比例演算法等。下面是我根據paper講解過程進行翻譯講解。

一、卡通動畫各個器官庫的建立方法

 

器官庫

這一步工作量非常大,如果你要搞這樣的一個專案,單單這一步就要就要耗費很多人力物力了,因為藝術家要繪製一個五官庫,相當不容易啊,不是一兩天可以搞定的事。庫的具體建立方法如下:

(1)從網上下載足夠多的人臉庫

(2)從步驟1中的人臉庫挑選300張男性、220張女性的照片,當然這520張照片要具有代表性(每張照片的五官長相,照片表情等儘量不一樣),使得資料分佈合理。這520張照片用符號P表示

(3)通過對P的每張照片器官進行分解,構建人臉五官庫Fr(Fr是可以重組成完整的一幅P中照片的)。

 

(4)挑選Fr中,具有代表性的:20個臉型、30個眉毛、30個眼睛、16個鼻子、30個嘴巴、75中型別的頭髮。注意各個器官男性、女性要分開,即男的20個臉型、女的20個臉型……。

(5)藝術家對(4)中挑選得到的五官圖片進行繪製,結果庫符號記為Fc。需要注意,藝術家繪製時,眼睛要分為單眼皮和雙眼皮進行繪製。

(6)繪製完了以後,我們再手動用這些卡通五官庫組合成人臉。組合出P中每張照片的卡通動畫圖。通過這一步,Fr中的,每個器官都將找到Fc中最為相似的卡通器官圖片。(通過這一步建立的P對應的卡通動畫圖,也將用於後續作為訓練資料,後續講到訓練演算法的時候,會進行詳細講解)。其實前面的繪製五官卡通圖都是小事,這一步人工組合出P中照片的卡通圖,才是最不容易的事。

上面Fr、P、Fc的代號需要記清楚,後面直接用代號表示這三部分

二、演算法實現部分

    現在假設使用者輸入一張人臉照片,演算法總的過程就是先通過特徵點檢測出88個人臉特徵點,然後對各個器官進行分解,接著:

    (1)根據分解的各個器官在Fr(真實的五官庫)中,尋找最相似的器官。然後因為Fr(真實圖片的五官庫)中的每個圖都有對應的Fc(卡通五官相簿),據此我們就可以得到使用者輸入照片五官的對應卡通圖Fc

    (2)根據尋找到的最相似的五官卡通圖,進行組裝

    上面黑色字型部分,就是文獻的創新點,也就是回答瞭如下兩個問題:如何尋找最相似的器官(不僅僅用特徵點進行查詢)?如何進行五官重組(重組起來,使得卡通動畫漂亮,五官協調)?接著我將對這兩個問題進行詳細講解。

1、五官自動重組演算法實現:

    這裡我根據文獻的講解順序,先回答第一個問題:如何進行五官重組(使得重組後卡通動畫漂亮,五官比例位置協調)?當然這一步的是需要先找到使用者輸入照片的對應最相似的五官。

A、訓練資料獲取

    五官重組需要用到機器學習的演算法,因此需要訓練資料,同時訓練資料必須是五官協調的,漂亮的模型。建立方法:根據1中卡通相簿建立過程中,我們可以獲得人臉庫P的每個人臉對應的卡通相簿Pc,然後我們請藝術師對Pc的五官位置、比例進行調整,使得Pc中的每張圖片都更加漂亮,因為我們將用漂亮的卡通圖進行訓練。

B、特徵提取

    對於每張訓練資料卡通圖,我們假設圖片五官都是對稱的,我們建立如下圖所示的座標系:

 

座標系的原點:兩個眼睛位置的中點O;座標系的Y軸:O點與鼻子的中心的連線的方向。根據建立的座標系,我們定義一個十三維的特徵向量X=(x1,x2,……,x13),其中:

(x1,x2,x3)=(左眉毛位置的x座標,左眉毛位置的y座標,眉毛的長度);

(x4,x5,x6)=(左眼睛位置的x座標,左眼睛位置的y座標,左眼睛的長度);

(x7,x8)=(鼻子位置的y座標,鼻子的寬度);

(x9,x10)=(嘴巴位置的y座標,嘴巴的寬度);

(x11,x12)=(臉頰位置的y座標,臉頰的寬度);(圖中淺藍色的線)

(x13)=(下巴位置的y座標);(人臉特徵點的最下點)

     因此根據P的卡通圖,我們可以得到如下訓練資料:,其中X為卡通圖的特徵,Z為卡通圖的風格資料。在paper中,卡通相簿包含如下三種形式的風格:

 

C、學習自動進行五官比例、位置等調整。

      採用ε-SVR演算法(參考文獻:Libsvm: a library for support vector machines)進行訓練學習。我的簡單理解就是演算法通過SVM演算法,進行五官位置比例的預測擬合。因為我們要五官自動重組,使得重組後的模型更美觀。因此我們可以通過輸入訓練資料,得到相關的擬合函式的引數。然後當我們輸入一個新的模型後,我們就可以進行擬合預測出新模型。

      這一步具體演算法的實現參考paper中的:Adjustment of facial compositions。給定大於零的引數C>0、ε>0,ε-SVR歸結為求解如下最小優化問題:

 

W就是我們需要通過訓練資料,得到的引數。Φ(xi)表示對映變換函式。公式(1)的拉格朗日對偶問題為:

 

Paper中,徑向基函式K選擇高斯核函式,即:

 

通過求得上面的拉格朗日乘子,ɑ、ɑ*,我們就可以進行預測了,ε-SVR的預測公式如下:

 

到這裡演算法的第一部分就翻譯結束了。具體的器官自動組合的細節,在paper的倒數第二段還有講解。通過公式(3),我們可以預測每個器官的合適位置和合適大小比例。

個人總結:上面的公式是不是看起來好深奧的樣子,最優化問題,其實如果你已經非常瞭解SVM演算法,上面那些公式根本不用看,也不用自己寫程式碼實習,因為求解SVM,直接用libsvm庫就好了,十分鐘搞定的事,而文獻作者提到了,他也是直接呼叫了libsvm庫的,因此甚至你不需要懂上面的一坨公式,你只需要網上下載libsvm,看看怎麼呼叫,怎麼傳入引數就可以實現這一步的。為了測試這一步,我先簡單隨便找了50張明星美女照片,作為訓練資料,然後輸入一張使用者照片,進行五官位置預測。訓練資料:


訓練資料

因為訓練資料比較少,將就一下,並且有的訓練資料也不一定是漂亮的,我是看著順眼的,然後訓練資料也就那幾個明星的圖片。因為我們只是用於初步的測試,看一下SVM演算法是否真的能夠通過訓練資料學習出:美麗特徵。看一下效果:

宣告:測試圖片是網上下載,如有侵權請聯絡作者刪除之。

上面的測試圖片中,藍色的點是原來的人臉特徵點,我只顯示了一些五官的關鍵點,如眼睛、眉毛、嘴巴的中心位置,還有下巴的最下點。然後紅色的點代表新的五官位置,可以看到,這張圖片預測後的新五官的位置是貌似很不錯的樣子。下巴、嘴巴、鼻子都需要稍微下移進行整容才能比較漂亮一些,當然五官的大小也可以預測,我這邊為了方便,所以才沒有顯示新的五官大小。這個需要用影象變形演算法,進行五官位置整容,比較懶,所以就懶得弄變形演算法了。在測試一張本來就長得很漂亮的人,如果五官的位置發生比較大的偏移


可以看到對於長得五官比例協調的人臉來說,其五官位置的偏移基本上非常小。

2、尋找最相似的器官。

    在開始看這篇paper前,可能我們會想直接用各個器官的識別檢測到的特徵點,直接進行計算兩圖片特徵點間的歐式距離就可以了,然而通過特徵點計算相似度首先要識別足夠多的特徵點才行。通過這篇paper我們可以學到一些圖片相似搜尋的簡單演算法。

具體的演算法實現如下:

A、眼睛和鼻子。

    文獻中使用了HOG描述運算元(參考文獻:Histograms of oriented gradients for human detection),作為這兩個部位的特徵。眼睛部位:眼睛部位的圖片統一歸一化到62*100大小的圖片,然後進行計算HOG特徵。這樣就可以計算兩找眼睛圖片的特徵向量間的歐式距離。鼻子部位:統一歸一化到71*200大小的圖片。HOG運算元直接呼叫Opencv庫就好了,所以這一步也不需要我們自己去寫程式碼。

B、眉毛部位。

    首先眉毛統一歸一化到66*200大小的圖片;因為眉毛和面板可以說是混合在一起的,所以paper接著用高斯模糊對其進行預處理;然後把66*200的影象劃分成6*20個塊,最後統計每個塊的顏色資訊總和xi;最後以(x1,x2……x120)作為特徵向量,計算特徵向量間的歐式距離,這個思想是影象相似搜尋給我最簡單的方法了,在好幾篇paper中遇到這個演算法,然而效果當然不咋地,因為圖片搜尋領域,現在即便是百度識圖,給我的感覺效果也一般般。

C、臉龐和嘴巴。

    這兩個部位是直接用人臉識別到的特徵點作為特徵向量,進行計算相似度的。需要注意的一個小細節:在計算臉龐相似度時,由於圖片大小、旋轉角度不一樣,因此一開始我的思路是用相似變換的方法,求解相似變換矩陣,然後在對根據相似變換結果計算歐式距離;然而文獻中不是用這種方法,它是以固定臉龐的其中兩個頂點,計算變換矩陣,最後進行變換。這種小細節不知道是不是效果比較好,不然一般人的思路,應該是用相似變換的方法。我驗證之後,感覺效果還不如直接進行放射變換,這一步也可以直接用opencv庫的函式就好了。

D、髮型識別。


髮型識別

    我們知道,前面我們建立的卡通動畫的髮型,包含75種髮型。對於髮型的相似度計算,paper也是以HOG運算元作為特徵,計算歐式距離。具體它分為兩個步驟:區域性匹配、全域性匹配。髮型識別的細節比較多,這裡只講大體的流程。

    第一步過程,得到K近鄰髮型。這一步跟上面眉毛部位的計算方法類似:首先就是對卡通圖和真實圖進行閾值分割,得到二值化影象,並進行影象大小歸一化,具體歸一化的圖片大小文章沒有具體詳細說明;最後對歸一化影象進行分塊,統計每個塊的顏色資訊總和xi,並以(x1,x2……xn)作為特徵向量,計算特徵向量間的歐式距離。這樣我們可以得到k近鄰髮型,

     第二步過程,這一步就是要從k近鄰中,尋找最接近的髮型了。這一步的計算方法與眼睛的計算方法類似,也是通過計算HOG特徵,作為特徵向量,並計算歐式距離。這樣我們就可以從這K個近鄰中找到最相似的髮型了。

E、性別識別。

    文獻參考《Evaluation of gender classification methods with automatically detected and aligned faces》的方法,總的過程,是通過SVM訓練一個分類器,然後進行男女性別的分類判別。

F、眼鏡檢測。

    對於是否戴眼鏡,paper首先在眼鏡的中間位置取一塊區域,然後對把這一塊區域轉換成灰度影象,最後計算垂直方向上的梯度值。

根據梯度值,得到上下梯度值最大的畫素集A、B(圖中紅色的畫素點),然後統計A、B的方差:

 

最後根據sum of var(A)、var(B)的大小,進行閾值判斷其是否戴眼鏡。根據文獻的最後幾句話:The glass color is obtained from the region between two set of pixels。好像也可以通過A、B的顏色資訊,進行判斷眼鏡邊框的顏色

 

判斷是否戴眼鏡

G、雙眼皮檢測。

    判斷一個眼鏡是否有雙眼皮,這篇paper給出了貌似很簡單的演算法,可惜這一步我看不懂。paper只是說了,根據邊緣檢測運算元Candy運算元得到梯度影象,然後根據判斷眼鏡的上半部分,是否有兩個pulsers(if two pulses are detected on the left-top part of its gradient image),判斷是否雙眼皮。

      到了這裡可以說從卡通五官庫中,挑選最相似的卡通器官演算法已經結束了,接著需要補充後續的細節。補充細節:

1、五官組合。這一步前面已經講了大體的演算法過程,通過支援向量機預測擬合算法,可以預測出每個器官的大小及其位置,然後文獻直接用ɑ融合進行圖片合成。

2、影象變形。對於某些器官,我們很難在庫裡找到相似的模型,文章發現,臉型和眼睛部位是否相似,非常重要,因此文獻只對眼睛和臉龐進行變形,變形演算法採用移動最小二乘的方法。這一步的相關細節也很多,寫到這裡已經沒有力氣了,就這樣吧,寫了這麼多好累。

總結與心得:

1、識別方面。這篇paper給出了很多演算法,比如眼鏡判別、雙眼皮判別、各個五官相似度判別、髮型識別,對於我這種菜鳥感覺看起來相當爽、學到了好多。雖然有的演算法,估計效果不好,但是至少讓我看到除了用深度學習的方法,我們還是有其它的路可以走的。如果不用深度學習,這些方法值得一試,當然演算法效果精度,很差,魯棒性也很差。

2、如何通過機器學習的方法判斷一個人的五官大小、位置是否協調?是這篇paper的主要思想,其實通過SVM演算法,進行預測擬合的。這個思路是很新穎,只能說是一個很不錯的想法,然而要進行工程應用,要對一個使用者輸入照片進行自動五官整容,還很難達到商用的地步。

      最後還要說一下,別看paper的那幾張圖效果那麼好,那是因為paper估計是測試圖片就是庫裡面已有的圖片,所以相似性搜尋看起來才會那麼牛逼。

參考文獻:

1、《Data-Driven Face Cartoon Stylization 》

**********************作者:hjimce   時間:2015.8.1  聯絡QQ:1393852684   地址:http://blog.csdn.net/hjimce 轉載請保留本行資訊********************