周錦榮,徐張偉,段夢芳,鄒力偉
(閩南師范大學物理與信息工程學院,福建 漳州 363000)
隨著物聯(lián)網(wǎng)、人工智能以及混合光源、變色光源等先進新技術的發(fā)展,LED照明正在迅速實現(xiàn)智能化和應用多樣化。依靠LED亮度、顏色易于調(diào)控等優(yōu)點,向用戶提供健康舒適的照明環(huán)境,成為情感照明設計的一個新的研究和應用熱點。通過研究數(shù)字混合調(diào)光引起的光學屬性變化(包括光強度、波長和色溫等)和對人體健康、工作表現(xiàn)、情緒等光的空間情感特征之間的相關性來構建不同的采光方式和照明表現(xiàn),實現(xiàn)需要的各種不同光視覺體驗和情緒變化調(diào)節(jié)結果[1-3]。
國內(nèi)外對于LED實現(xiàn)情感(情緒)照明的研究應用已取得了一些進展。Yun S J等[2]根據(jù)人類感官功能的敏感性,應用采集到的情緒狀態(tài)腦電波(EEG)生物信號進行用戶的情緒狀態(tài)分類,獲得了色度坐標,實現(xiàn)LED情感照明控制系統(tǒng)設計。Kang E Y等[3]根據(jù)室溫、室內(nèi)環(huán)境因素與用戶感受到的溫度顏色混合等具體情況,采用神經(jīng)模糊系統(tǒng)設計了一種LED情感照明系統(tǒng)。Lim S J 等[4]利用RBFNN智能算法實現(xiàn)LED情感照明系統(tǒng)設計,這種方法采用紅色、綠色和藍色三種LED來確保色彩空間的情感照明,并使用白色LED來確保足夠的光強度。Hartstein L E等[5]研究了LED光源的相關色溫對人體認知過程的影響情況,認為不同種類的光可以導致晝夜節(jié)律、情緒和認知能力的變化。接觸較冷的色溫光源(CCT light)可以維持注意力,改善情緒和警覺性,并可能在性別之間產(chǎn)生差異。Gabel V等[6]認為光照會對認知表現(xiàn)和情緒等人體生理和行為產(chǎn)生許多影響。他們利用LED模擬晨光,研究晨光照射作為睡眠限制(SR)下認知能力和情緒受損的對策。朱瑩瑩、汝濤濤博士和周國富教授等對照明在非視覺功能(認知、情緒、社會行為等)方面的表現(xiàn)及國內(nèi)外的研究情況進行了深入說明,對照度和相關色溫與情緒和認知的相互作用進行了分析,指出動態(tài)照明,特別是LED 新型綠色光源的使用可有效彌補靜態(tài)照明的不足,有利于結合實際情境創(chuàng)設個性化的照明環(huán)境以滿足特殊需求,促進身心健康發(fā)展[7,8]。徐俊麗等[9]從光環(huán)境健康設計角度出發(fā),基于對上海市第十人民醫(yī)院心內(nèi)科導管手術室的深入調(diào)研,設計應用了LED 媒體界面,通過改變其光色、亮度及圖案,定性研究光照對病患負面情緒的緩解作用。
基于不同的LED光環(huán)境會對人的情緒變化產(chǎn)生不同的影響,本文采用提取幾何特征和神經(jīng)網(wǎng)絡分類器識別的卷積神經(jīng)網(wǎng)絡算法對人臉臉部情緒特征進行采集與檢測,并結合無線物聯(lián)網(wǎng)和微處理器數(shù)字脈寬控制技術,設計一種根據(jù)人臉情緒識別的LED混合光環(huán)境的調(diào)控系統(tǒng)。主要步驟如下:
1)通過Android端應用程序調(diào)用手機攝像頭采集用戶圖像數(shù)據(jù)。
2)調(diào)用OpenCV框架對采集到的圖像數(shù)據(jù)提取Haar特征并識別人臉區(qū)域。
3)將人臉區(qū)域經(jīng)圖像剪裁及灰度化后生成48×48的人臉灰度圖像。
4)在Linux環(huán)境中使用Tensorflow(谷歌深度學習框架)對fer2013人臉圖像數(shù)據(jù)集進行卷積神經(jīng)網(wǎng)絡模型訓練,得到輸入為48×48的灰度圖,輸出為六種情緒編號的CNN模型。將得到的CNN模型放入Android程序里。最后在程序中將采集后處理得到圖像輸入該模型即可返回對應的情緒編號。
5)通過硬件NodeMCU及ESP8266的物聯(lián)網(wǎng)專用系統(tǒng)板接收由Android端發(fā)送的由情緒編號生產(chǎn)的燈光方案,并根據(jù)方案中的RGB顏色及動態(tài)相關數(shù)據(jù)控制WS2812燈帶變色和產(chǎn)生動態(tài)光照強度、色溫等燈光效果。
本系統(tǒng)主要由電腦端模型訓練、上位機Android端應用程序、下位機單片機硬件控制驅動模塊構成。下位機系統(tǒng)硬件由集成了NodeMCU及ESP8266的物聯(lián)網(wǎng)專用系統(tǒng)板外接WS2812燈帶構成。硬件端只需要接收由Android手機端發(fā)送的燈光方案并根據(jù)方案中的RGB顏色及動態(tài)相關數(shù)據(jù),利用PWM控制燈帶變色和產(chǎn)生動態(tài)效果即可,如圖1所示。
圖1 系統(tǒng)框圖Fig.1 System hardware block diagram
電腦端安裝TensorFlow框架,利用TensorFlow對Fer2013.CSV開源人臉數(shù)據(jù)集進行CNN模型訓練。使用Android Studio軟件編寫Android移動端程序,該程序也是整套系統(tǒng)的核心程序。程序由一個主頁面Activity、一個圖像采集Dialog頁面、一個控制Wi-Fi的Service、三個起界面美化作用的CardView加上圖像處理、情緒分類、燈光方案等相關工具類構成。程序工程集成OpenCV圖像處理框架、電腦端編譯好的TensorFlow for ARM框架以及訓練得到的CNN模型文件。整個流程為調(diào)用手機鏡頭采集圖像數(shù)據(jù),利用OpenCV檢測Haar特征識別人臉區(qū)域并對該區(qū)域剪裁和灰度處理,將圖像輸入CNN模型文件后輸出情緒編號,根據(jù)得到的情緒值選擇對應的燈光方案,將方案通過Wi-Fi發(fā)送到單片機。方案流程如圖2所示。
圖2 系統(tǒng)方案流程Fig.2 System overall solution block diagram
表情是人類情緒的直觀反應,表情(情緒)識別一直是計算機視覺的重要研究課題之一。徐峰等[10]對人臉微表情識別的國內(nèi)外研究進展進行了綜述,指出國內(nèi)外對人臉表情的研究目前主要集中在心理學應用方面,基于視覺圖像處理和機器學習等智能自動識別算法模型構建逐漸成為新的研究熱點。Mohammed A A等[11]基于雙向二維主成分分析(B2DPCA)和極端學習機(ELM)的人臉識別算法,使用改進的降維技術在尺寸上減小標準偏差和利用B2DPCA生成判別性特征集以確定分類準確性來提高人臉識別分類率和降低對原型數(shù)量的依賴性。中國科學院心理研究所王甦菁等提出了微觀表達定位的主方向最大差異(MDMD)分析,使用光流特征主方向上的幅度最大差異來發(fā)現(xiàn)面部微表情的變化,他們還提出通過轉移長期卷積神經(jīng)網(wǎng)絡模型(TLCNN)實現(xiàn)小樣本的微表達識別[12,13]。夏召強等[14]通過幾何變形建模并應用于Adaboost算法模型進行面部微表情識別。從視頻序列(微表情定位)中檢測存在的細微頭部運動和不受約束的照明條件等方面影響。
本設計采用卷積神經(jīng)網(wǎng)絡CNN模型進行訓練實現(xiàn)分類器功能。CNN由輸入層、隱含層、輸出層構成,其中隱含層包含卷積層、池化層和全連接層。系統(tǒng)使用Fer2013.CSV作為數(shù)據(jù)輸入,目前訓練樣本為7 000個,使用三個卷積池化層后疊加三個全連接層進行模型文件輸出。第一個的卷積層代碼示例:及池化層模型代碼如圖3所示。最終可以得到格式為pb的CNN模型文件,該模型輸入為48×48的灰度圖像,輸出為0~6總共7種情緒編號。
圖3 CNN模型訓練流程Fig.3 CNN model training process
當輸入CNN的值為圖像時,實際上輸入的并不是圖像,而是圖像中像素點包含的數(shù)字信息,常見形式有矩陣和向量。CNN在處理圖像時,可以把圖像理解成一個長方體,如圖4所示,長方體的長和寬為圖像的長和寬,而高度可以理解成每個像素的顏色信息數(shù),如RGB圖像高度為3,灰度圖像高度為1。每次處理時收集圖像中一小塊區(qū)域的像素信息,按這個區(qū)域大小以一定的步長遍歷整個圖像,處理完成后輸出一個新的高度增加、長寬縮小的圖像,這個過程稱為對圖片的卷積。多次重復這個步驟,最后將得到高度更高的圖像輸入普通的分類神經(jīng)層,就可以得到原始圖像的分類結果。由于CNN對圖像的處理單位并不是一個像素,而是圖像中的某一小塊像素區(qū)域,這使得它能獲得圖像中像素間的關聯(lián)信息而非僅僅是單個像素的信息。
圖4 卷積神經(jīng)網(wǎng)絡Fig.4 Convolutional neural network
對圖像進行卷積操作的實質(zhì)就是求某些矩陣的內(nèi)積。例如,有一個大小為3×3×1的灰度圖像,如果需要對他進行卷積處理,需要先將其抽象為一個矩陣,將該矩陣最外圈填充一圈0得到一個5×5矩陣A1,定義兩個濾波矩陣W1、W2和一個偏置量bias。用W1和W2分別以步長1遍歷矩陣A1。所謂遍歷與步長,可以理解為使用W1和W2在A1矩陣上進行水平或垂直平移操作,每次平移中間間隔步長個單位,直到覆蓋整個圖像。其中矩陣A1填充0的操作是為了使濾波矩陣能按規(guī)定步長恰好移到邊緣的位置,從數(shù)學角度來說就是長或寬除以濾波矩陣長或寬的余數(shù)能被步長整除。在本次設計中,我們采用的步長為1,但一般情況下實際圖像長寬值較大,步長也不為1,在元數(shù)據(jù)矩陣外側填充任意最小圈0才能達到恰好遍歷的目的。定義bias為1,A1、W1、W2,如式(1)和式(2)所示:
(1)
(2)
使用W1遍歷A1時,先計算W1與對應范圍的3×3矩陣的內(nèi)積加上偏移量的值得到新的值c11,如式(3)所示:
(3)
再將該值作為新矩陣C1第一行一列的值,同理計算該矩陣其他位置的值與使用W2遍歷得到的值,得到的新矩陣C1與C2如式(4)所示:
(4)
此時圖像的高度從1變成了2,長和寬都縮小成了2。從上述計算過程可以看出,輸出矩陣的高度與濾波矩陣的數(shù)量有關,長和寬與步長和元數(shù)據(jù)矩陣長寬有關。
池化(pooling)的出現(xiàn)是為了解決在對圖像進行卷積處理時由于圖像尺寸較大,特征值過多時出現(xiàn)的計算緩慢問題和數(shù)據(jù)量過多時出現(xiàn)的過擬合問題。池化的方法有最大值池化、平均值池化、隨機池化、求和區(qū)域池化等。在CNN中,運用最多的是最大值池化,它能減少對圖像進行卷積過程中由于參數(shù)誤差造成的結果的偏移。最大值池化即取區(qū)域最大值,例如大小為4×4的矩陣M,需要池化為2×2的矩陣N,M為假定值,如式(5)所示:
(5)
過程為將M按2×2分割成4個區(qū)域,取每個區(qū)域的最大值即可得到矩陣N,結果如式(6)所示:
(6)
圖像采集頁面CameraCaptureDialog.java繼承自DialogFragment,使用Fragment而非Activity可以降低在兩個頁面之間切換的延遲感,提升軟件實際體驗。在主頁面點擊掃描按鈕即可打開圖像采集頁面,頁面提供鏡頭轉換及打開閃光燈功能,在圖像采集頁面按住掃描圖標開始采集圖像。初始主頁面及圖像采集頁面設計如圖5所示。
圖5 圖像采集與控制處理頁面Fig.5 Image acquisition and control processing page
采集圖象使用cameraKit類中的captureImage函數(shù),執(zhí)行成功后回調(diào)callback函數(shù),將圖像數(shù)據(jù)保存在cameraKitImage對象中,最后使用該對象所在類中的getBitmap方法返回bitmap類型的數(shù)據(jù)并儲存,流程如圖6所示。
圖6 圖像采集流程圖Fig.6 Image acquisition key code flow chart
本系統(tǒng)中我們使用OpenCV自帶的haarcascade_frontalface_default.xml特征文件對圖像進行人臉檢測,圖7為具體實現(xiàn)效果。
圖7 人臉區(qū)域檢測效果圖Fig.7 Face area detection effect chart
圖像的縮放就是根據(jù)原圖像矩陣生成目標圖像矩陣。例如,一個3×3大小的灰度圖像A2需要將其縮放成4×4大小圖像B,A2和B分為如式(7)和式(8)所示:
(7)
(8)
其中就涉及到如何填充新矩陣中各個值的問題。若使用臨近插值算法,B中的值可由公式(9)和式(10)計算得出:
srcX=dstX×(srcW/dstW)
(9)
srcY=dstY×(srcH/dstH)
(10)
該式中srcX,srcY和dstX,dstY分別表示以左上角為原點時A2矩陣和B矩陣中值的坐標。srcW,srcH和dstW,dstH分別表示A矩陣和B矩陣的寬和高,在本例中分別等于3和4。于是,當我們要填充b11的值時,將dstX=dstY=1帶入公式可得srcX=srcY=0.75,由于像素坐標只能使用整數(shù),采用四舍五入原則,取srcX=srcY≈1。同理計算B中其他值可得到B如式(11)所示:
(11)
本系統(tǒng)中圖像縮放采用雙線性插值算法如式(12)所示:
f(Xi+Xj,Yi+Yj)=(1-Xj)(1-Yj)×f(Xi,Yi)
+(1-Xj)Yj×f(Xi,Yi+1)+Xj(1-Yj)×f(Xi+1,Yi)
+XjYj×f(Xi+1,Yi+1)
(12)
在該算法中,將原圖像矩陣中的像素值表示為f(Xi+Xj,Yi+Yj),其中Xi和Yi表示坐標的整數(shù)部分,Xj和Yj表示坐標的小數(shù)部分。當需求依然是將A2圖像矩陣縮放成B矩陣時,不再使用四舍五入原則,取srcX=srcY=0.75,即Xi=Yi=0,Xj=Yj=0.75,該算法中,我們將像素坐標從0開始計算,即可得到b11如式(13)所示:
b11=f(0.75,0.75)
=0.25×0.25×f(0,0)+0.25×0.75×f(0,1)
+0.75×0.25×f(1,0)+0.75×0.75×f(1,1)
=0.0625a11+0.1875a12+0.1875a21+0.5625a22
(13)
從該計算結果可以看出,b11的值由a11、a12、a21、a22四個值決定,而且由于f(0.75,0.75)離f(1,1)更近,所以在結果中a22所占的權重更大。因此雙線性插值算法可以有效地解決臨近插值算法中圖像失真嚴重的問題,在圖像縮放運算中使用該算法更加科學有效。
圖像信息根據(jù)其表示方法可分為位圖和矢量圖。位圖(Bitmap)又稱點陣圖或光柵圖,簡單的說,它使用我們稱為像素(Pixel)的一格一格的小點來描述圖像,矢量圖(Vector)也稱向量圖,是通過組成圖形的一些基本元素,如點、線、面、邊框、填充色的信息通過計算的方式來顯示圖形[12]。由攝像頭采集到的圖像都是位圖,由多個像素構成,每個像素點由A、R、G、B四個分量決定,分別對應透明度(Alpha)、紅色(Red)、綠色(Green)、藍色(Blue)。
調(diào)整圖像顏色可以看作對構成該圖像的所有像素點進行分別調(diào)色。在Android系統(tǒng)中,對圖像進行顏色處理需要使用顏色矩陣(ColorMatrix),它是一個4行5列的數(shù)字矩陣。在調(diào)整單個像素點顏色時,只需要使用該矩陣與這個像素點的R、G、B、A四個值和單位值1構成的1列5行矩陣相乘即可。例如,矩陣CL為顏色矩陣,矩陣PI為像素值矩陣,如式(14)和式(15)所示:
(14)
(15)
由CM×PI得到的新矩陣CL即代表經(jīng)過調(diào)色后的該像素點的R、G、B、A值。由公式(15)可知,調(diào)色后該像素點R、G、B、A的值由每個分量的系數(shù)和偏移量(e、j、o、t)決定。
本系統(tǒng)需要對圖像進行灰度處理,只需要將由該圖像生成的像素值矩陣與灰度顏色矩陣相乘即可。Android系統(tǒng)提供了許多默認的顏色矩陣,灰度顏色矩陣(grayMatrix)和反轉顏色(reverseMatrix)矩陣,分別用GM和RM表示,如式(16)和式(17)所示:
(16)
(17)
灰度圖像的特征為RGB的值相等。觀察灰度顏色矩陣可以看出,處理得到的灰度圖像的灰度值是由原圖像中紅、綠、藍三種顏色根據(jù)不同權重混合而成,其中紅色權重0.33,綠色權重0.59,藍色權重0.11。
圖8為本系統(tǒng)中對人臉圖像進行進行縮放和灰度處理后,得到48×48大小灰度圖像的效果圖。
圖8 圖像灰度處理Fig.8 Collected face image processing
由于已經(jīng)在Linux桌面端輸出了CNN模型文件,Android只需要將其導入工程,并引入TensorFlow接口即可使用。實例化接口代碼為:inferenceInterface=new TensorFlowInferenceInterface(assetManager,modePath)。
其中assetManager為Android默認資源管理對象,modePath為CNN模型文件名及所在工程目錄,值為file:///android_asset/FacealExpressionReg.pb。圖9為數(shù)據(jù)輸入模型文件返回情緒編號相關代碼流程。該程序中傳入的圖像數(shù)據(jù)類型為2304維浮點型數(shù)組。返回值labels包含0~6總共7種情緒編號。
圖9 數(shù)據(jù)輸入模型文件返回情緒編號程序流程Fig.9 Data input model file returns the emotional number related code flow chart
NodeMCU是一個能快速搭建物聯(lián)網(wǎng)系統(tǒng)的硬件平臺,平臺集成ESP8266 Wi-Fi芯片,使用Lua腳本進行編程開發(fā)。本系統(tǒng)使用該平臺接收方案信息并控制WS2812燈帶顏色,下位機的硬件程序控制流程圖如圖10所示。
圖10 硬件程序控制流程圖Fig.10 Hardware program control flow chart
本系統(tǒng)總共能分辨0~6總共7種人臉情緒,分別為開心、平靜、驚訝、低落、害怕、反感、憤怒。每種情緒對應一種RGB燈光方案,在該方案中,用三個8位數(shù)字來分別表示RGB的值,其范圍為0~255。具體方案如表1所示。
表1 情緒類型對應的RGB LED三通道PWM控制值Table 1 Emotion type corresponds to RGB mixed light three-channel PWM value adjustment scheme
由于需要將燈光方案發(fā)送至單片機接收端,所以需要制定應用層協(xié)議。在本系統(tǒng)中,使用長度為10的字符串常量來表示燈光方案。例如使用“a255036000”來代表編號0方案,第2~10位由RGB的值順序排列組成,第一位為標志位,單片機接收到字符“a”后才會繼續(xù)接收后續(xù)字符,該位也為實現(xiàn)其他燈光效果提供方便。
為了測試系統(tǒng)識別情緒的準確度,我們使用700組fer2013.csv中的人臉圖像對系統(tǒng)進行測試,其中包括0~6總共7種情緒的圖像各100組,使用該樣本進行的準確度測試結果如表2所示。
表2 情緒識別測試結果Table 2 Emotion recognition test results
從測試結果可以看出,7種情緒中開心、平靜、憤怒識別率較高,反感、低落識別率較低。分析原因可能是由于人臉情緒中,反感和低落在面部的特征體現(xiàn)不如其他情緒明顯。
在整體系統(tǒng)實際圖像測試中使用本人四組不同情緒照片做測試,分別包括平靜、開心、低落、驚訝。測試中包含對戴眼鏡及側臉的不確定因素的測試。測試的四組圖像如圖11所示。
圖11 情緒識別調(diào)控RGB LED燈光結果 Fig.11 Emotional recognition to control RGB LED lighting
從圖11結果可以看出,1、2、3、4號圖像最后得到的結果分別是平靜、開心、低落、驚訝,與圖像實際情緒較為接近。從第2號圖像的處理結果可以看出,該系統(tǒng)能正確識別戴眼鏡的人臉圖像。從4號圖像的處理結果可以看出,該系統(tǒng)對小角度的側臉圖像能正確識別。
本文討論了利用卷積神經(jīng)網(wǎng)絡CNN算法識別移動端采集到的人臉面部情緒的方法,實現(xiàn)了通過無線物聯(lián)Wi-Fi進行情緒識別結果傳送,向微控制器發(fā)送相關的數(shù)字調(diào)控信息控制LED燈的RGB三通道混合光顏色和光強度變化。設計中研究和應用了卷積神經(jīng)網(wǎng)絡模型訓練、圖像處理以及Android程序編寫方法;并采用單片機無線通信技術,結合Android Studio開發(fā)軟件,在OpenCV與TensorFlow框架下對傳統(tǒng)照明情緒識別的應用設計,實現(xiàn)可根據(jù)人物情緒變化實時調(diào)節(jié)LED燈光特性的效果,可作為利用LED燈光顯示判別人的情緒狀態(tài),滿足人們對照明應用多樣化的需求。在后續(xù)工作中,可進一步結合心理學、醫(yī)學等不同領域深入研究LED照明光環(huán)境與人情緒變化的內(nèi)在關系,以及增加系統(tǒng)智能反饋調(diào)節(jié)性能以便于更好地對利用燈光調(diào)節(jié)情緒方案的調(diào)控精度進行改進。