于方軍 焦玉杰 山東省淄博市博山區(qū)山頭中心學校
孫麗君 山東省淄博第二中學
人類的面部表情常見的有高興、憤怒、悲傷、吃驚、厭惡和恐懼等。MediaPipe中的面部識別(Face Mesh)能識別468個臉部關鍵點,如圖1所示是識別臉部關鍵點及放大后的嘴部特征點,其中上下嘴唇中間特征點標號分別是13、14。
圖1 MediaPipe識別的臉部關鍵點及嘴部放大圖
首先從嘴部坐標識別入手,了解臉部關鍵點檢測過程,并借助上下嘴唇中間關鍵點坐標距離做一個控制舵機的程序,控制對應的開源機器人模仿人開口說話;然后通過OpenMMlab開發(fā)的MMEdu工具,體驗基于MMEdu實現(xiàn)的表情識別,了解表情識別的流程;接著介紹蘋果系統(tǒng)如何通過unity插件,把采集到的人臉關鍵點信息投射到數(shù)字人臉部,讓數(shù)字人擁有人的臉部表情表達。
利用采集到的臉部關鍵點數(shù)據(jù),找到上下嘴唇中間點13、14的y坐標變化,結(jié)合用開源硬件制作的表情機器人Fritz模型,可以實現(xiàn)簡單的張嘴、閉嘴控制,硬件選用arduino板,用pinpong庫進行控制。
獲取嘴部關鍵點坐標,通過下頁表1中的代碼讀取嘴部關鍵點13(上嘴唇中間點)、關鍵點14(下嘴唇中間點)的y坐標,在MediaPipe中用圖像高度的像素值w與這個讀取坐標值相乘,得出該點的像素坐標。閉嘴和張嘴兩種狀態(tài),y坐標的差值大約在0~28像素之間。
表1 嘴部關鍵點13、14坐標讀取及代碼
用舵機控制腳連接開源硬件arduino板的8腳,控制其轉(zhuǎn)動的角度。安裝pinpong庫(用pip install pinpong安裝),用from pinpong.board import Board,Pin,Servo導入pinpong庫的舵機(Servo)控制,使用時需要先定義好輸出腳,本例中筆者定義8腳為輸出腳,運行代碼,根據(jù)實時采集到的嘴部13、14關鍵點坐標差值變化,映射設為舵機角度變化,并控制接在arduino板8腳的舵機轉(zhuǎn)動角度。代碼及效果如圖2所示。
圖2 控制Fritz表情機器人嘴部動作代碼及效果演示
本案例只是對MediaPipe提供的訓練好的模型的一個簡單應用,對于要訓練的特定的表情表現(xiàn)如“開心”“生氣”“傷心”“驚訝”等,愛好者可以自己設計一個神經(jīng)網(wǎng)絡模型,并用采集到的數(shù)據(jù)訓練它,讓計算機學習認識各種特定表情。
在計算機硬件性能不足以支持大數(shù)據(jù)集的模型訓練時,可以借助網(wǎng)絡云計算平臺,如www.openinnolab.org.cn。平臺上有很多人工智能的案例,分為MMEdu和BaseEdu兩個分支,本案例采用MMEdu的圖像分類模塊MMClassification(簡稱MMCls)完成模型訓練,平臺提供了CPU和GPU模式選擇,本案例選擇了GPU模式。
選擇合適數(shù)據(jù)集,筆者把Kaggle比賽的7個情緒類公開數(shù)據(jù)集精簡為4個,分別為開心(Happy)、生氣(Angry)、傷心(Sad)、驚訝(Surprise),數(shù)據(jù)集圖片類型為png圖像,大小為48×48像素。trainning_set為訓練集,val_set為驗證集,test_set為測試集。四個數(shù)據(jù)集標簽為:0 Angry;1 Happy;2 Sad;3 Surprise。文本文件classes.txt說明類別名稱與序號的對應關系,val.txt說明驗證集圖片路徑與類別序號的對應關系。數(shù)據(jù)集文件夾結(jié)構(gòu)及對應文件如圖3所示。
圖3 數(shù)據(jù)集文件夾結(jié)構(gòu)及對應文件
(1)克隆并搭建模型。首先通過平臺提供的克隆操作,把平臺提供的案例克隆到項目中并修改、運行。接著在導入MMedu的分類模塊后,實例化一個神經(jīng)網(wǎng)絡模型,MMEdu提供了很多常用的網(wǎng)絡模型,如LeNet、MobileNet、ResNet50等。指定分類的類別數(shù),如本例中為4類。指定數(shù)據(jù)集路徑和訓練完成后數(shù)據(jù)集存放路徑,即可完成模型搭建。上頁圖4所示為模型搭建代碼。
圖4 模型搭建代碼
(2)模型訓練。通過model.train()開始訓練,把所有數(shù)據(jù)都訓練一遍為一輪,共訓練100輪,“validate=True”表示每輪訓練后,在驗證集上測試一次準確率,本案例用device=’cuda’表示選用GPU模式,實測100輪共訓練了3.5小時(如圖5)。
圖5 模型訓練代碼及過程
(3)表情識別過程。當訓練好模型后,上傳要識別的圖片yuxi.png,代碼中要識別的圖片改為上傳圖片,導入對應的模型文件,加載訓練好的權重文件(best_accuracy_top-1_epoch_65.pth),指定后分類標簽文件classes.txt,輸出識別結(jié)果為開心(happy)(如圖6)。
圖6 表情識別過程代碼及結(jié)果
通過分析代碼,我們看到搭建模型只需要5行代碼,訓練模型需要1行代碼,部署應用模型需要4行代碼,相比之下,MMEdu結(jié)構(gòu)簡潔,代碼復雜度低,特別適合于基礎教育的人工智能教學。
在本案例中,只要下載對應的包就可以實現(xiàn)簡單的表情捕捉與投射,下面以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中的數(shù)字人面部(如圖7)。
圖7 用unity Face Caputer實現(xiàn)表情捕捉
除此之外,在unity中借助于相應插件,還可以把手部捕捉、人體姿態(tài)捕捉投射到對應數(shù)字人上,實現(xiàn)軀體的多種控制。