看蒙娜麗莎(Mona Lisa)畫(huà)像時(shí),你會(huì)發(fā)現(xiàn)她的眼睛將四處移動(dòng)跟隨你。這就是所謂的“蒙娜麗莎效應(yīng)”。為了娛樂(lè),我們把蒙拉麗莎畫(huà)像制成交互式數(shù)字肖像,通過(guò)你的瀏覽器和網(wǎng)絡(luò)攝像頭將這種現(xiàn)象變?yōu)楝F(xiàn)實(shí)。
該項(xiàng)目的核心是利用TensorFlow.js,深度學(xué)習(xí)和一些圖像處理技術(shù)。總體思路如下:首先,我們必須生成蒙娜麗莎(Mona Lisa)頭的圖像序列,眼睛從左到右凝視。從該項(xiàng)目中,我們將根據(jù)觀看者的位置連續(xù)不斷地實(shí)時(shí)選擇并顯示單個(gè)幀。
在通過(guò)深度學(xué)習(xí)+TensorFlow.js對(duì)蒙娜麗莎進(jìn)行動(dòng)畫(huà)處理中,我將詳細(xì)介紹該項(xiàng)目的技術(shù)設(shè)計(jì)和實(shí)施。
通過(guò)深度學(xué)習(xí)對(duì)蒙娜麗莎進(jìn)行動(dòng)畫(huà)處理
圖像動(dòng)畫(huà)是一種允許通過(guò)駕駛視頻偽造靜態(tài)圖像的技術(shù)。使用基于深度學(xué)習(xí)的方法,能夠產(chǎn)生令人信服的蒙娜麗莎注視動(dòng)畫(huà)。
具體來(lái)說(shuō),使用了Aliaksandr Siarohin等人發(fā)布的一階運(yùn)動(dòng)模型(FOMM)。在2019年,此方法在較高級(jí)別上由兩個(gè)模塊組成:一個(gè)模塊用于運(yùn)動(dòng)提取,另一個(gè)模塊用于圖像生成。運(yùn)動(dòng)模塊從行駛視頻中檢測(cè)關(guān)鍵點(diǎn)和局部仿射變換。然后,將連續(xù)幀之間的這些值的差異用作預(yù)測(cè)密集運(yùn)動(dòng)場(chǎng)的網(wǎng)絡(luò)的輸入,以及指定需要修改或根據(jù)上下文推斷的圖像區(qū)域的遮擋遮罩。然后,圖像生成網(wǎng)絡(luò)檢測(cè)面部標(biāo)志,并產(chǎn)生最終輸出-根據(jù)運(yùn)動(dòng)模塊的結(jié)果扭曲和修復(fù)的源圖像。
之所以選擇FOMM,是因?yàn)樗子谑褂?。在該領(lǐng)域中,先前的模型是“特定于對(duì)象的”,這意味著它們需要對(duì)要進(jìn)行動(dòng)畫(huà)處理的對(duì)象的詳細(xì)數(shù)據(jù),而FOMM對(duì)此卻不可知。更重要的是,作者發(fā)布了一種開(kāi)源,開(kāi)箱即用的實(shí)現(xiàn),帶有針對(duì)面部動(dòng)畫(huà)的預(yù)先訓(xùn)練的權(quán)重。因此,將模型應(yīng)用于Mona Lisa變得出乎意料的直接:我將回購(gòu)克隆到了Colab筆記本中,制作了一段簡(jiǎn)短的駕駛視頻,眼睛四處移動(dòng),并通過(guò)模型和截圖將其反饋給模型。 Gioconda的頭部。最終的電影很出色。由此,我最終僅采樣了33張圖像來(lái)構(gòu)成最終的動(dòng)畫(huà)。
FOMM生成的駕駛視頻和圖像動(dòng)畫(huà)預(yù)測(cè)的示例。
使用一階運(yùn)動(dòng)模型生成的最終動(dòng)畫(huà)幀的子樣本。
圖像融合
盡管可以出于項(xiàng)目目的重新訓(xùn)練模型,但還是決定在Siarohin權(quán)重的約束范圍內(nèi)進(jìn)行工作,以避免原本需要的時(shí)間和計(jì)算資源。但是,這意味著將生成的幀固定在比所需的更低的分辨率上,并且僅由對(duì)象的頭部組成。但是,由于希望最終的視覺(jué)效果包含蒙娜麗莎的全部?jī)?nèi)容(包括手,軀干和背景),因此我們的計(jì)劃是將輸出的頭部框架簡(jiǎn)單地疊加到繪畫(huà)的圖像上。
頭部框架覆蓋在基礎(chǔ)圖像之上的示例。為了更好地說(shuō)明問(wèn)題,此處顯示的版本來(lái)自項(xiàng)目的早期迭代,其中頭部框架中的分辨率進(jìn)一步降低。
但是,這帶來(lái)了自己的挑戰(zhàn)。如果你看上面的示例,你會(huì)注意到,由于FOMM的變形過(guò)程,模型的較低分辨率輸出(加上一些細(xì)微的附帶背景變化)使頭部框架從視覺(jué)上突出了。換句話說(shuō),這顯然只是一張圖片在另一張圖片之上。為了解決這個(gè)問(wèn)題,在Python中進(jìn)行了一些圖像處理,以將頭部圖像“融合”到底層圖像中。
首先,將頭架調(diào)整為原始分辨率。從那里開(kāi)始,使用這些模糊像素和基礎(chǔ)圖像中相應(yīng)像素的加權(quán)平均值創(chuàng)建了一個(gè)新幀,其中,頭部幀中像素的權(quán)重(或alpha)隨著其遠(yuǎn)離中點(diǎn)而減小。
用于確定alpha的函數(shù)是從2D乙狀結(jié)腸開(kāi)始改編的,表示為:
其中j決定邏輯函數(shù)的斜率,k是拐點(diǎn),m是輸入值的中點(diǎn)。繪制出來(lái)的函數(shù)看起來(lái)像:
在將上述過(guò)程應(yīng)用于動(dòng)畫(huà)集中的所有33幀之后,對(duì)于不產(chǎn)生懷疑的眼睛,每個(gè)疊加所產(chǎn)生的疊加似乎是一張圖像:
通過(guò)BlazeFace跟蹤查看者的頭部
此時(shí)剩下的就是確定如何通過(guò)網(wǎng)絡(luò)攝像頭跟蹤用戶并顯示相應(yīng)的框架。
自然地,轉(zhuǎn)向TensorFlow.js來(lái)完成這項(xiàng)工作。該庫(kù)提供了一組相當(dāng)強(qiáng)大的模型來(lái)檢測(cè)給定視覺(jué)輸入下人類的存在,但是經(jīng)過(guò)一番研究和思考,選擇了BlazeFace。
BlazeFace是基于深度學(xué)習(xí)的對(duì)象識(shí)別模型,可檢測(cè)人臉和面部標(biāo)志。經(jīng)過(guò)專門(mén)培訓(xùn),可以使用移動(dòng)相機(jī)輸入。這對(duì)于我的用例來(lái)說(shuō)效果很好,因?yàn)槲蚁M蠖鄶?shù)觀看者無(wú)論是通過(guò)移動(dòng)設(shè)備還是在他們的移動(dòng)攝像頭上,都以類似的方式使用他們的網(wǎng)絡(luò)攝像頭-頭部對(duì)準(zhǔn)框架,正面并且距離攝像頭非常近筆記本電腦。
但是,在選擇此模型時(shí),我最重要的考慮是其非凡的檢測(cè)速度。為了使該項(xiàng)目具有說(shuō)服力,我需要能夠?qū)崟r(shí)運(yùn)行整個(gè)動(dòng)畫(huà),包括面部識(shí)別步驟。BlazeFace適應(yīng)了單發(fā)檢測(cè)(SSD)模型,這是一種基于深度學(xué)習(xí)的對(duì)象檢測(cè)算法,可同時(shí)提出邊界框并僅在網(wǎng)絡(luò)的前向通道中檢測(cè)對(duì)象。BlazeFace的輕巧檢測(cè)器能夠以每秒200幀的速度識(shí)別面部標(biāo)志。
給定輸入圖像,BlazeFace可以捕獲的內(nèi)容的演示:人頭的邊界框以及面部標(biāo)志。
確定了模型之后,編寫(xiě)了代碼,以將用戶的網(wǎng)絡(luò)攝像頭數(shù)據(jù)不斷地傳輸?shù)紹lazeFace中。在每次運(yùn)行中,模型都會(huì)輸出一組面部地標(biāo)及其相應(yīng)的2D坐標(biāo)位置。使用此方法,通過(guò)計(jì)算眼睛之間的中點(diǎn)來(lái)近似臉部中心的X坐標(biāo)。
最后,將此結(jié)果映射到0到32之間的整數(shù)。你可能還記得,這些值分別代表動(dòng)畫(huà)序列中的一幀–其中0代表左眼是蒙娜麗莎,而32代表左眼。正確的。從那里開(kāi)始,只需要在屏幕上顯示框架即可。
填寫(xiě)下面表單即可預(yù)約申請(qǐng)免費(fèi)試聽(tīng)!怕錢不夠?可先就業(yè)掙錢后再付學(xué)費(fèi)! 怕學(xué)不會(huì)?助教全程陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可推薦就業(yè)!
?2007-2022/ m.5wd995.cn 北京漫動(dòng)者數(shù)字科技有限公司 備案號(hào): 京ICP備12034770號(hào) 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc