2020.10.21 13:00

用TensorFlow.js讓蒙娜麗莎的視線隨著觀看者移動,效果栩栩如生

ADVERTISEMENT

據說,當你在羅浮宮博物館踱步遊覽的時候,你會感到油畫中的蒙娜麗莎視線隨你而動。這就是《蒙娜麗莎》這幅畫的神奇之處。出於好玩,TensorFlow軟體工程師Emily Xie最近開發了一個互動數位肖像,只需要瀏覽器和鏡頭,你就能把會動的蒙娜麗莎帶回家了!

這個專案的核心利用了TensorFlow.js,深度學習,還有一些圖像處理技術。大體想法如下:首先,要產生一系列蒙娜麗莎的頭像,這些頭像注視的方向由左到右。有了這個頭像集,我們就可以在其中連續選取圖像,從而根據觀看者的位置產生一幅即時畫面。

ADVERTISEMENT

在這篇文章裡,作者詳細介紹了專案設計和完成的細節。

用深度學習讓蒙娜麗莎動起來

圖片動畫化技術可以讓一張靜態圖片參考一個「視訊驅動」的運動模式而活動起來。使用基於深度學習的方法,作者得以產生一段非常逼真的動畫——「蒙娜麗莎的注視」。

具體來說,Emily使用了Aliaksandr Siarohin等人在2019年發佈的First Order Motion Model(FOMM)這一個模型。總的來說,這個方法由兩個模組組成,分別負責運動抽取和圖像產生。運動抽取模組會檢測「視訊驅動」中的關鍵點和局部仿射變換。這些值在相鄰影格間的差將輸入神經網路以預測一個稠密運動場(dense motion field)以及一個閉合遮罩(mask),該遮罩指定了需要修飾或者需要做上下文推斷的圖像區域。負責圖像產生的神經網路會繼而檢測人臉特徵點,並根據運動抽取模組的結果對源圖像進行變形和著色,最後輸出處理後的圖像。

ADVERTISEMENT

Emily選擇FOMM是因為它特別易用。作為對比,圖片動畫化領域的先驗模型都是「依賴於對象」的,要求獲取所要動畫化的對象的詳盡數據。相反,FOMM不依賴先驗知識。更重要的是,FOMM的作者們發佈了一個開源的人臉動畫化方案——內建預先訓練權重,拿來就能用。這使得把FOMM模型應用在蒙娜麗莎上變得相當簡單:只要把程式碼倉庫複製到Colab notebook上,再拿自己做模特兒產生一小段眼部來回移動的「視訊驅動」提供給模型,同時提供一張蒙娜麗莎的頭部截圖就可以了。模型產生的影片效果很好,Emily從中選取了33影格用於構成最終的動畫。

圖像拼接

儘管可以針對自己的專案重新訓練模型,Emily還是決定就用Siarohin等作者給出的神經網路權重。這樣可以節省時間,也節省運算資源。不過,這意味著輸出的圖像解析度低於期望,而且只包含人物的頭部區域。Emily想要的最終視覺效果是蒙娜麗莎的整體,包括頭部、軀幹和背景。因此,他打算把得到的頭部圖像簡單地疊放在完整的肖像畫上。

ADVERTISEMENT

這又帶來了一系列挑戰。如果你仔細看上面的例圖,你會注意到頭部區域的解析度比較低,而且有一些變形,看起來像是浮在背景圖之上。換句話說,這修補的痕跡也太明顯了!為瞭解決這個問題,作者用Python做了一些處理來把頭部區域和背景「拼接」起來。

首先,他調整了頭部圖像的解析度,透過像素的模糊化,讓解析度增加到跟背景圖一致。然後,透過頭部圖像和背景圖像的像素加權平均來做一張新圖,想法也很簡單,頭部圖像的像素權重在它的中點位置取得最大,遠離中點逐漸變小。

ADVERTISEMENT

權重分佈由一個二維的S形函數決定,表達式為: 

這裡j決定了S形函數的陡度,k是拐點,m是坐標中點值。函數畫出來如下:

Emily把動畫集中的33影格圖像都做了如上處理,結果每一張看起來都渾然一體:

用BlazeFace跟蹤觀看者的頭部

到此,剩下的任務就是決定如何透過鏡頭追蹤使用者,以顯示相應的畫面。

自然,他用TensorFlow.js來處理這項任務。TensorFlow庫提供了一系列相當健壯的模型用於檢測影片中的人像。經過研究,他選擇了BlazeFace。

BlazeFace是一個基於深度學習的目標辨識模型,能夠檢測人臉和臉部特徵點。該模型經過專門訓練,以適應移動鏡頭作為輸入源。這非常適合他的情況,因為作者預期大部分使用者用類似的方式使用他們的鏡頭——頭部入鏡,正面朝向鏡頭,距離較近——不管是用行動設備還是筆記型電腦。

不過,他選擇BlazeFace的最主要考量是它出色的檢測速度。這個專案要成功,就得把整個動畫即時跑起來,這包括了人臉辨識的時間開銷。BlazeFace改編了single-shot detection (SSD)模型——一種基於深度學習的目標檢測算法,能夠在一次網路前向傳遞中同時定位邊框和發現目標。BlazeFace的輕量級檢測器能夠達到每秒200影格率的人臉辨識速度。

選定模型之後,Emily又寫了一些程式碼用於把使用者的鏡頭數據對接到BlazeFace。程式每跑一次,模型會輸出一個包含人臉特徵點的數組,以及特徵點對應的2D坐標。用這些數據可以運算使用者兩眼的中點位置,這樣就近似得到了臉部中心的X坐標。

最後,Emily把結果離散映射到整數0到32,每一個數位對應動畫序列中的一個影格(如果你還記得的話,動畫集裡有33格)——0代表蒙娜麗莎的視線轉向最左,32則在最右。接下來,只要在螢幕上顯示相應的畫面就可以了。

來試一下吧!

ADVERTISEMENT