范書鋒 吳宇環(huán) 譚永輝 閆云熙 謝慷慷
(黃河科技學(xué)院,河南 鄭州 450000)
學(xué)校實(shí)驗(yàn)室對學(xué)生自由開放后,采用紙質(zhì)方式進(jìn)行出入信息記錄,管理工作較煩瑣,出錯率較高,因此,對學(xué)生自主進(jìn)出實(shí)驗(yàn)室采用智能化管理十分有必要[1]。且在當(dāng)今新冠肺炎疫情形勢下,本系統(tǒng)加入了口罩檢測功能,即可無人值班也能規(guī)范進(jìn)出者的一些行為。
本系統(tǒng)包括兩大部分,分別是STC51控制端和Python核心端。STC51硬件模塊主要通過內(nèi)部接入的定時程序進(jìn)行測距命令驅(qū)動超聲波模塊進(jìn)行測距,并將STC51通過UART與上位機(jī)連接,實(shí)現(xiàn)Python與STC51的信息交互[2]。Python核心系統(tǒng)通過檢測來自單片機(jī)的信號,識別是否為驅(qū)動OpenCV的指令,當(dāng)OpenCV開啟攝像頭則立即進(jìn)行口罩檢測與人臉識別功能,并通過GUI界面顯示出來,最終系統(tǒng)根據(jù)識別結(jié)果判別是否向單片機(jī)下達(dá)電機(jī)驅(qū)動指令??傮w結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)總體設(shè)計(jì)框圖
STC51輔助系統(tǒng)主要包括超聲波測距模塊、步進(jìn)機(jī)驅(qū)動模塊和蜂鳴器提示模塊。
超聲波測距采用HY-SRF05型號,此模塊可向外界發(fā)送一定頻率的聲波,且其精確測量2~450 cm傳感距離,精度可達(dá)3 mm。當(dāng)檢測到前方有遮擋物時,聲波就會被反射回來,被模塊接受后,開始計(jì)時,記錄高電平時間,由時間數(shù)據(jù)可計(jì)算出距離[3]。
步進(jìn)機(jī)驅(qū)動模塊采用28BYJ-48的型號,其是4相永磁式減速步進(jìn)電機(jī),采用的轉(zhuǎn)動方式是八拍模式,而齒輪內(nèi)部有8個定子,每8個節(jié)拍為一循環(huán),轉(zhuǎn)子一圈需要64節(jié)拍,由齒輪的減速比1∶64可得,每64節(jié)拍轉(zhuǎn)動5.625°,通過計(jì)算算出90°需要1 024節(jié)拍,在程序中設(shè)置轉(zhuǎn)動的正反方向,每個方向都轉(zhuǎn)動1 024節(jié)拍,并設(shè)置標(biāo)志位和延時[4],一旦轉(zhuǎn)動90°時就會停止轉(zhuǎn)動,一段時間后進(jìn)行反轉(zhuǎn),以此達(dá)到門禁作用[5]。
蜂鳴器提示模塊采用無源蜂鳴器,單片機(jī)加以0.5~4.5 kHz的頻率可驅(qū)動內(nèi)部蜂鳴器發(fā)出特定音頻,即只要對蜂鳴器設(shè)置一定的工作頻率,讓蜂鳴器以設(shè)定的頻率工作,就會發(fā)出特定的提示音。
Python控制系統(tǒng)主要包括基于pySerial與單片機(jī)進(jìn)行串口通信的模塊、基于OpenCV的攝像頭觸發(fā)和人臉標(biāo)識、基于CNN的口罩檢測和人臉識別。其Python控制系統(tǒng)流程圖如圖2所示。
當(dāng)單片機(jī)測距成功后,單片機(jī)通過UART串口把數(shù)據(jù)通過pySerial告知Python,使之調(diào)用openCV打開攝像頭進(jìn)行人臉標(biāo)識,人臉標(biāo)記成功之后再通過卷積神經(jīng)網(wǎng)絡(luò)對其進(jìn)行口罩檢測和人臉識別[6],最后把識別的結(jié)果與MySQL中的數(shù)據(jù)進(jìn)行比對,然后通過PYQT界面展示出來,最后也可以把人員識別的信息記錄在數(shù)據(jù)庫,方便管理員查詢。
為提高系統(tǒng)的可靠性,應(yīng)首先進(jìn)行圖像預(yù)處理,這里使用OpenCV中自帶的基于Haar特征的級聯(lián)分類器進(jìn)行面部檢測[7]。其庫具有級聯(lián)人臉分類器,庫中包含人臉識別模塊。僅通過加載級聯(lián)文檔,即可檢測動態(tài)或靜態(tài)圖像中的面部。文檔格式為XML,文件名為haarcascade_frontalface_default.xml。首先,根據(jù)攝像機(jī)代碼從計(jì)算機(jī)攝像機(jī)調(diào)用VideoCapture函數(shù),然后使用cap.read()方法在攝像機(jī)中讀取圖像。之后,使用captureFrame()函數(shù)從輸入圖像中檢索邊框,并檢索框架,并使用detectMultiScale()函數(shù)完成人臉識別。Python控制系統(tǒng)如圖2所示。
圖2 Python控制系統(tǒng)
通過構(gòu)建TensorFlow+Keras+OpenCV的模型來進(jìn)行口罩檢測,此模型的數(shù)據(jù)集來源于網(wǎng)絡(luò),包括2000幅戴口罩圖片,580幅無口罩的人臉。然后將這些圖像鏈接于用TensorFlow框架構(gòu)成的CNN模型,最后通過系統(tǒng)的攝像頭來檢測人們是否佩戴口罩。首先,對上述的兩類圖像進(jìn)行是否戴口罩的分類,然后通過旋轉(zhuǎn)、拉伸等辦法改變圖像,使數(shù)據(jù)增強(qiáng);之后再將增強(qiáng)后的數(shù)據(jù)分為訓(xùn)練集和檢驗(yàn)集[8],通過CNN建立模型,再對模型進(jìn)行預(yù)訓(xùn)練和訓(xùn)練,之后導(dǎo)入檢測程序,最后把是否檢測到口罩的信息通過GUI界面顯示出來[9]。
人臉識別通過CNN實(shí)現(xiàn)。CNN由卷積層、池化層、連接層組成。通過卷積層對由OpenCV檢測后的圖像進(jìn)行特征提取,小部分的層進(jìn)行邊緣、線等低級特征提取,更多的層迭代此低級特征以提取更復(fù)雜的特征。后用池化層對卷積層訓(xùn)練的特征圖進(jìn)行二次采樣。最后,形成卷積層+合并層的復(fù)合層,應(yīng)用于模型任務(wù)。同時,將所有特征圖重新形成為1×N矢量,然后連接復(fù)合層進(jìn)行模型訓(xùn)練[10],之后導(dǎo)入識別程序可完成。
為提高用戶體驗(yàn),本系統(tǒng)設(shè)計(jì)了一套GUI界面。其可分為識別界面和管理界面(如圖3所示)。用戶可在識別界面內(nèi)看到自己的基本信息及出入時間,也用于未戴口罩提醒及戴口罩顯示的功能。管理員可進(jìn)入管理界面,進(jìn)行人臉信息注冊、模型訓(xùn)練、刪改學(xué)生信息等操作[11]。
圖3 GUI界面流程圖
本系統(tǒng)采用PyQT5的QThread來實(shí)現(xiàn)自動檢測與識別,其流程圖如圖4所示。主線程顯示主界面,線程1負(fù)責(zé)與單片機(jī)進(jìn)行通信檢測是否有人到來。檢測到人到來時,線程2在識別界面上更新相機(jī)捕捉的人臉,根據(jù)余暉效應(yīng)實(shí)現(xiàn)人臉的動態(tài)顯示。延遲幾秒后,通過線程3進(jìn)行口罩檢測。檢測后,通過線程4進(jìn)行人臉識別。人臉識別成功后,通過線程5與單片機(jī)進(jìn)行通信,打開門禁。
圖4 線程流程圖
本系統(tǒng)選定在白天的室外環(huán)境下,以20名學(xué)生為對象進(jìn)行了人臉識別的測試,根據(jù)光照強(qiáng)弱及超聲波檢測距離的不同而得到不同的結(jié)果,所形成的數(shù)據(jù)見表1和表2。由表中數(shù)據(jù)可以看出,當(dāng)人員檢測距離攝像頭為20~60cm時,人臉識別成功率為97%,口罩檢測成功率為100%;經(jīng)過對系統(tǒng)測試的數(shù)據(jù)分析,發(fā)現(xiàn)在距離攝像頭50 cm進(jìn)行對象檢測的時候,誤別率和誤報(bào)率均在2%,人臉識別成功率為98%,識別時間2 s,效果最佳。
表1 口罩檢測結(jié)果
表2 人臉識別結(jié)果
本文采用人臉識別技術(shù)對高校實(shí)驗(yàn)室進(jìn)行信息化管理,對于在系統(tǒng)注冊過的人員經(jīng)人臉識別通過后可進(jìn)入實(shí)驗(yàn)室,并記錄人員信息,同時也便于管理人員統(tǒng)計(jì)進(jìn)出者信息。此外,在新冠肺炎疫情防控的形式下,系統(tǒng)還具有檢測佩戴口罩的功能,提高了實(shí)驗(yàn)室使用的安全性。在此基礎(chǔ)上,系統(tǒng)優(yōu)化了人臉識別算法,使誤識率和誤報(bào)率進(jìn)一步減??;另外對于人員進(jìn)出情況的信息,可將其導(dǎo)出到數(shù)據(jù)庫,方便管理員實(shí)時隨地查看數(shù)據(jù)。