梁薪弛,彭睿杰,劉歡,張亞楠
(哈爾濱理工大學計算機科學與技術學院,黑龍 江哈爾濱 150080)
隨著我國教育水平的普遍提高和新生數量的大量增加,高校學生的課堂出勤率和課堂紀律問題給任課教師和遵守紀律認真學習的學生帶來了困擾。合理高效地進行點名和控制學生在課堂使用手機成為學校重點關心的問題。目前,傳統的方法需要浪費大量的時間進行人工點名,不僅浪費時間,而且點名次數少讓逃課的學生有機可乘,代簽的現象也屢禁不止。
為了節約時間,提高點名效率,保證課堂紀律,故分析、設計并實現基于人臉識別的智能教學輔助平臺。本項目應用人臉識別技術,將學生的手機利用起來,在學生端可同時進行人臉識別,節約了課堂中在點名上花費的時間;在課堂中教師也可鎖定學生的手機,將其限制在APP 的界面,以達到讓學生認真聽課的目的;并可隨時將本學期的點名情況在WEB 端導出、匯總,在節約課堂時間的同時減輕教師的工作壓力,同時服務于師生。該平臺的主要功能包括:人臉識別簽到、學生端設備鎖定、教師端快速計分、教師端快速發布信息及計分結果快速導出等。
人臉識別方法包含以下相關技術及步驟:利用用戶的手機終端獲取人臉圖片,進行人臉圖片預處理、人臉五官定位、人臉特征值提取以及最后的人臉數據比對。
人臉照片獲取主要通過攝像頭拍攝獲得。由于環境光線隨著時間的變化具有不確定性。當處于黑暗環境的時候,通過手機屏幕展示白色畫面并提高亮度補光,再進行利用攝像頭拍攝人臉圖片,從而獲取清晰的面部輪廓,方便進行下一步圖片預處理并獲取臉部特征值。預處理步驟包含:圖像灰度化、高斯平滑處理、圖像對比度增強、圖像二值化處理和圖像均衡直方圖處理。人臉定位步驟包含:眼睛識別并定位、鼻子定位進而進行鼻尖的定位和嘴唇定位。定位完畢后可進行人臉特征參數的提取,人臉特征參數提取主要工作:確定雙眼之間的距離、雙眼的傾斜角度、嘴巴的重心等。將這些提取到的參數用矩陣表述,進行主成分分析、特征值分解等工作,為下一步識別比對做準備。比對過程中用特征向量進行比對,如果比對結果在范圍內則確定相同,如果不相同則將人臉數據加入訓練集中。
1.1.1 光線補償
人臉識別應用的場景越來越多,但由于光線會隨著時間發生變化,加之用于人臉識別的攝像頭的性能限制,會導致獲取的人臉圖片出現不清晰、模糊、跑焦等現象。鑒于此,為了更好地捕捉人臉信息,有必要在攝像頭位置加裝補光燈。攝像頭安裝高度一般根據環境不同,選擇不同的高度。人臉識別攝像頭安裝高度一般在1.6~2.0 m,做到幾乎與人臉持平。
(1)補光燈一般要安裝在攝像頭的下方或左右位置,也可以安裝與人臉持平的位置。
(2)補光燈要根據人臉位置傾斜角來做具體調整。
(3)安裝補光燈現場模擬具體光線是否太強或者太弱,如果太強會造成過曝現象,人臉會出現一片白的情況,不利于進一步對圖像進行預處理及特征點提取。
1.1.2 灰度化
通常看到的彩色照片都是包含R、G、B 3 種顏色通道的圖片。圖像灰度化是本次人臉圖像預處理的第一步。簡單來說就是將彩色照片轉換為黑白色圖像,經過灰度化處理的圖像不包含彩色信息只包含亮度信息。圖像將更加具體,使得圖像方便存儲,提高處理效率。灰度化的具體公式:

注意這里的2.2 次方和2.2 次方根,RGB 顏色值不能簡單直接相加,而是必須用2.2 次方換算成物理光功率。因為RGB 值與功率并非簡單的線性關系,而是冪函數關系,這個函數的指數稱為Gamma 值,一般為2.2,而這個換算過程,稱為Gamma 校正。
OpenCV 中我們直接使用cv2.cvtColor(img,flag)函數將彩色RGB 圖轉換為灰度圖。
具體代碼:
img gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
處理后的圖像效果如圖1 所示。

圖1 圖像灰度化效果
1.1.3 高斯平滑處理
圖像在采集、傳輸和轉換過程中均容易受環境的影響,這種影響在圖像中就表現為噪聲,這些噪聲會致使圖像質量降低或者干擾我們提取原本想要的圖像信息,所以需要通過濾波技術來去除這些圖像中的噪聲干擾。
高斯平滑處理(Gaussian Smoothing)后的圖像雖然肉眼上看會模糊,但是圖像處理時有去除高頻噪聲的功能。
圖像平滑是局部圖像預處理的一種技術。圖像經過灰度化、二值處理之后,可能有噪聲,或者圖像的不平穩性導致圖像處理過程中有干擾對圖像本質理解的頻率信息,我們將這些噪聲、頻率信息等干擾處理掉,就需要用到平滑處理。高斯平滑是對圖片應用一個高斯濾波器(Gaussian Filter),起到模糊圖片和消除噪聲的效果。
圖2(a)的噪點就是圖片中的高頻部分,通過高斯濾波器抑制圖片中的高頻部分讓低頻部分順利通過,處理為圖2(b)中的效果。

圖2 圖像高斯平滑處理效果
Opencv 中,利用高斯平滑去除高頻噪點:
blur_gray =cv2.GaussianBlur(gray,(blur_ksize,blur_ksize),0,0)
高斯平滑處理后效果如圖3 所示。

圖3 灰度化進行高斯平滑處理效果
1.1.4 對比度增強
對比度增強就是將圖片的灰度范圍拉寬,例如將范圍分布在[50,150]之間,將其拉升到[0,256]。對比度增強有幾種不同的方法,如:線性變換,直方圖正規化,伽馬變換,全局直方圖均衡化及限制對比度自適應直方圖均衡化等算法。使用直方圖正規化的算法。有如下計算公式:

OpenCV 中提供了normalize()函數來實現灰度正規化:
img_norm=cv.normalize(img,dst=None,alpha=350,beta=10,norm_type=cv.NORM_MINMAX)
通過以上方法進行對比度增強效果如圖4 所示。

圖4 圖像對比度增強效果
1.1.5 二值化處理
通常來說,彩色圖像就是具有三通道0-255,0-255,0-255,有2^24 位空間。灰度圖像就是只有一個通道0-255,有256 種顏色。而二值圖像就是只有2 種圖像,黑和白,1 白色,0 黑色,可以為后續人臉定位和比對減少運算量。通過1 個閾值改變圖像中的顏色。在OpenCV 中獲取閾值的方法:cv2.THRESH_BINARY、cv2.THRESH_BINARY_INV、cv2.THRESH_TRUNC、cv2.THRESH_TOZERO、cv2.THRESH_TOZERO_INV。根據不同方法得到的圖像區別進行分析,在此使用THRESH_TOZERO 較為合適:
ret,thresh4 =cv2.threshold(grayImage,127,255,cv2.THRESH_TOZERO)
圖像二值化處理效果如圖5 所示。

圖5 圖像二值化處理效果
1.1.6 均衡直方圖
直方圖是圖像中像素強度分布的圖形表達方式。如圖6 所示,它統計了每一個強度值所具有的像素個數。

圖6 圖像處理前直方圖
直方圖均衡化是通過拉伸像素強度分布范圍來增強圖像對比度的一種方法。以上面的直方圖為例,可以看到像素主要集中在中間的一些強度值上。直方圖均衡化要做的就是拉伸這個范圍。如圖7(a)所示: 圈出了少有像素分布其上的強度值。對其應用均衡化后,得到了圖7(b)所示的直方圖。均衡化后的圖像如圖7(c)所示。

圖7 圖像直方圖均衡化效果
均衡化指的是把1 個分布(給定的直方圖)映射到另1 個分布(1 個更寬更統一的強度值分布),所以強度值分布會在整個范圍內展開。
要想實現均衡化的效果,映射函數應該是一個累積分布函數。對于直方圖H(i),它的累積分布H^'(i)是

要使用其作為映射函數,我們必須對最大值為255(或者用圖像的最大強度值)的累積分布H^'(i)進行歸一化。最后,我們使用一個簡單的映射過程來獲得均衡化后像素的強度值:
equalized(x,y)=H'(src(x,y))。
使用OpenCV 函數EqualizeHist 對直方圖均衡化:equalizeHist(src,dst)。
在進行人臉五官定位的時候首先進行膚色篩選,眼睛以及鼻子都處于非人類膚色區域。這樣可以加快鼻子以及鼻尖的定位速度。確定眼睛位置后,確定鼻子的位置就比較簡單了。以瞳孔之間的直線為例,其二分之一的位置大致就是鼻子位置。然后在鼻子的二分之一往下就是鼻尖的位置。確定鼻尖后,附近搜索顏色較深的即為鼻孔位置。
在此處,使用OpenCV 中的Dlib 庫進行人臉特征點位置定位。加載Dlib 中人臉檢測和關鍵點定位:

最后將關鍵點描繪出來即得到如圖8 所示的關鍵點定位信息。

圖8 人臉關鍵點定位
在此我們使用OpenCV 關鍵點特征提取算法GFTTDetector:
gftt=cv.GFTTDetector_create(100,0.01,1,3,False,0.04)
kp1=gftt.detect(image,None)
result=cv.drawKeypoints(image,kp1,None,(0,255,0),
cv.DrawMatchesFlags
通過該算法得到如圖9 所示的人臉關鍵點特征。

圖9 人臉關鍵點特征提取
該方法是基于shi-tomas 角點檢測變化而來的一種特征提取方法,缺點是無法提取人臉描述,但是對于本次項目來說已經足夠。
提取人臉數據后,我們使用計算余弦距離的方法來進行相似度計算,從而進行判斷攝像頭提取的人臉是否與數據庫的人臉一致,從而完成打卡功能。余弦距離,也稱為余弦相似度,是用向量空間中2 個向量夾角的余弦值作為衡量2 個個體間差異的大小的度量。當2 個向量直接的夾角theta 趨向0 時,2 個向量越接近,差異就越小。越接近1 值時,說明人臉越相似。具體對比過程如圖10 所示。


圖10 通過歐氏距離判斷相似度
本次基于人臉識別的智能教學輔助平臺系統,由基于以上算法實現的1 個跨平臺JavaScript 算法庫作為底層實現,其具體功能為傳入1 張用戶的人臉圖片后,自動對圖片進行預處理,對人臉進行定位、裁切后生成1 個人臉特征值和人臉特征的集合并返回給上層的調用者。上層調用者可以對返回的人臉特征值做對比操作以判斷是否是對應的簽到者。
平臺同時支持iOS、Android 這2 個平臺,UI 界面分別采用對應平臺的語言、工具鏈編寫,iOS 平臺采用SwiftUI& Swift,Android 平臺采用Jetpack Compose&Kotlin。而對于JavaScript 庫的調用則通過iOS 平臺的WKWebView 提供的JavaScriptCore 引擎以及Android 平臺的WebView 提供的V8 引擎來運行,并自行實現1 個JSBridge(如圖11 所示),以實現移動端UI 層與JavaScript庫的通信,以實現傳遞人臉圖片與計算后的人臉特征值。

圖11 JSBridge 架構
該平臺的接入與使用十分簡便,只需要在教師與學生手機終端上安裝本平臺提供的APP 即可。不需要學校采購相關的考勤設備,也不需要學生集中在某一時段參與考勤而造成教室內的擁堵。
平臺通過APP 的形式將每一位學生擁有的手機變成了考勤終端,解決了考勤終端少的問題,并通過人臉識別技術保證了考勤的真實性。
考勤的流程大致如下:首先教師在APP 內先創建好,并讓班內學生事先加入的頻道發起1 次簽到,可以選擇是否開啟人臉識別以及位置檢測來確保簽到的學生在教室內并且是學生本人。學生在教師發起簽到后,只需要打開APP,點擊簽到按鈕并進行人臉識別即可簽到成功。
本平臺將人臉識別算法集成于APP 內,也緩解了服務器的壓力、減少服務器設備的投入并節約了用戶的網絡流量。
整個流程耗時不會超過半分鐘,相對于傳統的點名方式動輒幾分鐘的耗時,節約了大量的課堂有效時間。平臺為實現考勤管理的信息化提供了可靠保障,有效地促進了智慧校園的建設。