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