鄒錳



摘要:隨著計算機新技術的流行,人臉識別等新技術的應用范圍越來越寬廣。在學校招生規模的擴大的前提下,課堂上有效快速點名成了上課教師的新問題。該文采用OpenCV和Python構建人臉識別技術實現課堂快速考勤。
關鍵詞:OpenCV;Python;人臉識別;課堂考勤
中圖分類號:TP311 ? ? ? ?文獻標識碼:A
文章編號:1009-3044(2019)15-0066-02
1 問題的提出
近年來,我國學生人數呈現逐步上升的趨勢。特別是在經濟發達地區,由于外來務工人員人數非常多,很多地區的學校都招生爆滿,每個班人數都在50人以上。對于任課老師來說,點名考勤成了不小的挑戰。特別對于中職學校來說,實訓課很多學生不一定按照指定的位置就座,因此點名時經常出現“張冠李戴”的情況。另一方面,在實訓課上,教師需要操作計算機進行實操演示,這個過程中,有些學生不認真聽講,趴在桌面上睡覺。怎樣快速準確統計出上課時不認真的學生,值得我們研究。
2 系統的構成
基于OpenCV和Python的課堂考勤系統其核心是利用基于OpenCV和Python實現人臉識別,通過對人臉的檢測、識別及統計實現課堂考勤。使用到的硬件設備主要是高清攝像頭加上一臺計算機作為服務器。軟件上我們采用OpenCV和Python來實現。系統的主要功能如下圖1:
3 相關技術知識
OpenCV:
OpenCV是一個免費開源的跨平臺計算機視覺庫,可以運行多個操作系統上。它的應用領域非常廣泛,在人機互動、圖像分割、物體識別、動作識別、人臉識別、運動跟蹤、運動分析、機器人等多個最新技術領域都有應用[1]。
Python:
Python是一種計算機程序設計語言。Python程序簡單易懂功能強大,許多功能不必從零編寫,直接使用現成的即可。許多大型網站就是用Python開發的,例如YouTube、豆瓣。Google、Yahoo ,美國航空航天局等都大量地使用Python[2]。
開發環境的搭建:
Python也可在多種平臺開發運行,本文以WINDOWS系統作為開發平臺。本文以Anaconda套件作為開發環境,它包括幾百種常用的科學與數據分析套件。并內置Spyder及Jupyter Notebook編輯器。
首先到anaconda 官方網站下載對應win平臺下的安裝包:
https://www.anaconda.com/download/ 安裝完anaconda,就相當于安裝了Python、IPython、集成開發環境Spyder、一些包等等。
然后安裝opencv,確定好Python版本,電腦64位或者32位。下載對應版本的文件。下載網址:http://www.lfd.uci.edu/~gohlke/pythonlibs/ 。
安裝后特別注意pip安裝opencv_python-3.2.0-cp36-cp36m-win_amd64.whl以后,文件目錄下沒有 opencv/sources/data/haarcascades目錄,找不到分類器的.xml。這時需要查看下你的opencv和Python版本。(本文為Python3.6+opencv 3.4),然后下載opencv win x64/x86對應版本,安裝解壓到硬盤上你指定的位置。解壓你就會發現分類器的位置。這樣我們就搭配好了OpenCV和Python的開發環境。
4 系統主要功能的實現
4.1 人臉的識別
課堂考勤系統開啟后,第一步要使用攝像頭對學生上課的圖像進行采集,這里根據系統不同功能又分為靜態圖片和視頻的圖片抓取。圖像采集后可以通過一些算法對圖像進行優化,如降噪、平滑、直方圖均衡化處理等以增強人臉特征。然后對采集的圖像進行人臉檢測和識別。人臉識別的算法非常復雜,國內比較專業的有科大訊飛、阿里云和百度等提供的人臉識別算法。本文利用 OpenCV 提供的函數和分類器進行人臉檢測相對來說比較簡單易實現。在OpenCV中主要使用了兩種特征(即兩種方法)進行人臉檢測,Haar特征和LBP特征。使用已經訓練好的XML格式的分類器進行人臉檢測[3]。人臉檢測完畢后再標識出面部位置為后面的臉部圖形抓取做好準備。最后對圖像中面部區域抓取并保存。如圖2。
在OpenCV中,使用類“CascadeClassifier”進行人臉檢測, ?PYTHON中創建CascadeClassifier對象
在Python腳本中創建名為face_cascade_name的識別對象:face_cascade_name = "e:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml
OpenCV中人臉檢測使用的是 detectMultiScale函數。它可以檢測出圖片中所有的人臉,并將人臉用vector保存每個人臉的坐標、大小(用矩形表示),函數由分類器對象調用:
FACES=face_cascade_name.detectMultiScale(IMAGE,scaleFactor=1.1,minNeighbors=5,minSize=(5,5),flags=cv2.CASCADE_SCALE_IMAGE)
detectMultiScale方法可識別圖片中的多個面部,返回值是一個列表,列表元素是由面部區域左上角的X,Y坐標,W,H坐標,面部寬度,面部高度組成的元組。通過下列代碼可獲取每一張面部區域的數據:(圖3)
for (x,y,w,h) in ?faces;
對識別的人臉用矩形框住顯示,靜態圖片采集識別主要是作為初始化數據時使用,或者用于靜態點名。全班剛上課時,擺好拍攝姿勢,教師用系統采集靜態圖片給系統進行人臉識別從而后臺統計人臉數目實現點名效果。靜態點名的好處是系統能夠最佳識別全班的人臉。但是動態視頻的圖像抓取同樣非常重要,系統啟動后自動按照系統設置的頻率抓取課堂圖像并在后臺自動進行人臉識別和統計識別出的數據,按照一定的算法統計出沒有認真上課(趴下睡覺)的人數,并通過人臉比對推算出不認真上課(趴下睡覺)的同學名字和不在上課狀態的大約時間。
4.2 人臉的比對
課堂考勤中學生經常出現的問題一般有不按固定位置就坐;遲到;早退;上課睡覺;找人頂替上課等一系列的問題。為解決這些問題需要系統后臺對識別出來的人臉比對。人臉的比對就是要將人臉識別出信息與數據庫中的已經標識出具體信息的人臉數據進行比對,從而真正識別出這張(這些)人臉是屬于誰。對人臉的比對基本原理是通過對比兩張圖片的差異度來判斷兩張圖片是否為同一人的面部。對比圖片差異度的算法有很多種,本文應用“顏色直方圖”算法來實現對人臉圖像的識別。下面代碼為在Python中比較兩張圖片的差異:
from PIL import Image
from functools import reduce
import ?math, operator
pic01 = Image.open("img01.jpg") ?#打開img01文件
pic02 = Image.open("img02.jpg") ?#打開img02文件
h1 = pic01.histogram() ?#取img01文件的直方圖信息
h2 = pic02.histogram() ?#取img02圖片的直方圖信息
diff = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2, h1, h2)))/len(h1)) #計算兩個圖形差異度
使用顏色直方圖算法需要導入pillow、 functools 、match及operator包,最終的計算結果 放入diff變量中,保存的是一個浮點數,其值代表兩張圖片的差異度,數值越大,表示圖片差異度越大,若兩張圖片完全相同,則diff值為0.0
系統開啟后,任課教師可以“手動”讓學生擺好姿勢以照片形式采集靜態圖片,同時系統一直以實時視頻為基礎按固定的頻率抓取圖像。在后臺與數據庫中人臉進行比對,經過與不同的實時圖像比對,經過算法分析,給出考勤中遲到,缺席等具體學生名單。當然為了減輕服務器的負擔,這個實時抓取比對的頻率可以設置為一節課3-4次。并且系統實時人臉比對功能默認情況下是上課后3分鐘至5分鐘后實時對比3-4次,下課前3分鐘再實時對比一次。這種主要針對一般按正常座位上課的班級。對特殊情況,教師可以在上課中間開啟實時對比功能設置對比時間和抓取頻率,查詢出沒按位置就座或頂替上課的學生名單。
5 存在的問題
本系統雖然通過OpenCV和Python構建人臉識別技術能夠實現課堂快速考勤。但也有不少問題值得后面去改進。首先是高清攝像頭的問題,一般的學校教室沒有配置這個設備,只有一些作為高考考場的教室有這些設備。教師上課需要自帶高清攝像頭顯然不現實。然后是拍攝角度問題以及光照外部環境極大的影響到人臉的檢測,特別是人臉比對采用顏色直方圖方法,環境影響非常大。學生上課不認真除了睡覺還有一些情況如開小差,閉眼睡覺等,這些可以參考開車疲勞檢測的算法進行開發。同樣,怎樣有效地減少外部環境影響,有效快速地進行人臉檢測和比對,都值得我們后面去研究。
參考文獻:
[1] 武勃.黃暢.基于連續 Adaboost 算法的多視角人臉檢測[J].計算機研究與發展,2005,42(9):1612-1621.
【通聯編輯:唐一東】