圖像處理(二十一)基於數據驅動的人臉卡通動畫生成-Siggraph Asia 2014
http://blog.csdn.net/garfielder007/article/details/50582018
在現實生活中,我們經常會去評價一個人,長得是否漂亮、是不是帥哥美女,然而如何用五官的數據去評價一個人是否長得五官比例協調,我們卻很難說出來,也就是你為什麽覺得某個人長得漂亮?是因為她眼睛大,嘴巴小,還是她五官位置符合江湖傳說中的黃金比例呢?我今天要講的這篇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估計是測試圖片就是庫裏面已有的圖片,所以相似性搜索看起來才會那麽牛逼
**********************作者:hjimce 時間:2015.8.1 聯系QQ:1393852684 地址:http://blog.csdn.net/hjimce 轉載請保留本行信息********************
圖像處理(二十一)基於數據驅動的人臉卡通動畫生成-Siggraph Asia 2014