于方軍 焦玉杰 山東省淄博市博山區山頭中心學校
孫麗君 山東省淄博第二中學
人類的面部表情常見的有高興、憤怒、悲傷、吃驚、厭惡和恐懼等。MediaPipe中的面部識別(Face Mesh)能識別468個臉部關鍵點,如圖1所示是識別臉部關鍵點及放大后的嘴部特征點,其中上下嘴唇中間特征點標號分別是13、14。

圖1 MediaPipe識別的臉部關鍵點及嘴部放大圖
首先從嘴部坐標識別入手,了解臉部關鍵點檢測過程,并借助上下嘴唇中間關鍵點坐標距離做一個控制舵機的程序,控制對應的開源機器人模仿人開口說話;然后通過OpenMMlab開發的MMEdu工具,體驗基于MMEdu實現的表情識別,了解表情識別的流程;接著介紹蘋果系統如何通過unity插件,把采集到的人臉關鍵點信息投射到數字人臉部,讓數字人擁有人的臉部表情表達。
利用采集到的臉部關鍵點數據,找到上下嘴唇中間點13、14的y坐標變化,結合用開源硬件制作的表情機器人Fritz模型,可以實現簡單的張嘴、閉嘴控制,硬件選用arduino板,用pinpong庫進行控制。
獲取嘴部關鍵點坐標,通過下頁表1中的代碼讀取嘴部關鍵點13(上嘴唇中間點)、關鍵點14(下嘴唇中間點)的y坐標,在MediaPipe中用圖像高度的像素值w與這個讀取坐標值相乘,得出該點的像素坐標。閉嘴和張嘴兩種狀態,y坐標的差值大約在0~28像素之間。

表1 嘴部關鍵點13、14坐標讀取及代碼
用舵機控制腳連接開源硬件arduino板的8腳,控制其轉動的角度。安裝pinpong庫(用pip install pinpong安裝),用from pinpong.board import Board,Pin,Servo導入pinpong庫的舵機(Servo)控制,使用時需要先定義好輸出腳,本例中筆者定義8腳為輸出腳,運行代碼,根據實時采集到的嘴部13、14關鍵點坐標差值變化,映射設為舵機角度變化,并控制接在arduino板8腳的舵機轉動角度。代碼及效果如圖2所示。

圖2 控制Fritz表情機器人嘴部動作代碼及效果演示
本案例只是對MediaPipe提供的訓練好的模型的一個簡單應用,對于要訓練的特定的表情表現如“開心”“生氣”“傷心”“驚訝”等,愛好者可以自己設計一個神經網絡模型,并用采集到的數據訓練它,讓計算機學習認識各種特定表情。
在計算機硬件性能不足以支持大數據集的模型訓練時,可以借助網絡云計算平臺,如www.openinnolab.org.cn。平臺上有很多人工智能的案例,分為MMEdu和BaseEdu兩個分支,本案例采用MMEdu的圖像分類模塊MMClassification(簡稱MMCls)完成模型訓練,平臺提供了CPU和GPU模式選擇,本案例選擇了GPU模式。
選擇合適數據集,筆者把Kaggle比賽的7個情緒類公開數據集精簡為4個,分別為開心(Happy)、生氣(Angry)、傷心(Sad)、驚訝(Surprise),數據集圖片類型為png圖像,大小為48×48像素。trainning_set為訓練集,val_set為驗證集,test_set為測試集。四個數據集標簽為:0 Angry;1 Happy;2 Sad;3 Surprise。文本文件classes.txt說明類別名稱與序號的對應關系,val.txt說明驗證集圖片路徑與類別序號的對應關系。數據集文件夾結構及對應文件如圖3所示。

圖3 數據集文件夾結構及對應文件
(1)克隆并搭建模型。首先通過平臺提供的克隆操作,把平臺提供的案例克隆到項目中并修改、運行。接著在導入MMedu的分類模塊后,實例化一個神經網絡模型,MMEdu提供了很多常用的網絡模型,如LeNet、MobileNet、ResNet50等。指定分類的類別數,如本例中為4類。指定數據集路徑和訓練完成后數據集存放路徑,即可完成模型搭建。上頁圖4所示為模型搭建代碼。

圖4 模型搭建代碼
(2)模型訓練。通過model.train()開始訓練,把所有數據都訓練一遍為一輪,共訓練100輪,“validate=True”表示每輪訓練后,在驗證集上測試一次準確率,本案例用device=’cuda’表示選用GPU模式,實測100輪共訓練了3.5小時(如圖5)。

圖5 模型訓練代碼及過程
(3)表情識別過程。當訓練好模型后,上傳要識別的圖片yuxi.png,代碼中要識別的圖片改為上傳圖片,導入對應的模型文件,加載訓練好的權重文件(best_accuracy_top-1_epoch_65.pth),指定后分類標簽文件classes.txt,輸出識別結果為開心(happy)(如圖6)。

圖6 表情識別過程代碼及結果
通過分析代碼,我們看到搭建模型只需要5行代碼,訓練模型需要1行代碼,部署應用模型需要4行代碼,相比之下,MMEdu結構簡潔,代碼復雜度低,特別適合于基礎教育的人工智能教學。
在本案例中,只要下載對應的包就可以實現簡單的表情捕捉與投射,下面以unity為例進行臉部表情捕捉演示。
先在unity的PackManager包管理菜單中,使用“Add package from git URL”下載live capture包(URL填入com.unity.live-capture即可),并把自帶的實例資源一起導入,示例資源可以直接使用。
在支持深感攝像頭的IOS客戶端的App Store中,查找并安裝Unity Face Capture,在計算機端進行相應的防火墻設置,啟動其companion App server后,啟動移動端的Face Capture就可以連接計算機端,實時捕捉人臉表情,并投射到unity中的數字人面部(如圖7)。

圖7 用unity Face Caputer實現表情捕捉
除此之外,在unity中借助于相應插件,還可以把手部捕捉、人體姿態捕捉投射到對應數字人上,實現軀體的多種控制。