唐孟雪 邢曉燕
摘要:得益于現(xiàn)代科技的飛速發(fā)展,人們的生活水平得到了極大的提升,與此同時人們對安全的要求也越來越高。門鎖一直是一個家庭安全保障的關(guān)鍵性物件,門鎖的發(fā)展更是經(jīng)歷了從普通物理門鎖到密碼鎖,指紋鎖到如今利用生物特征識別技術(shù)的門鎖。其中人臉識別技術(shù)更是在近年來得到了大眾的追捧和普遍認(rèn)可,并已逐漸被應(yīng)用于一些高科技產(chǎn)品設(shè)計上。
該次設(shè)計初探人臉識別門鎖制作,采用OpenMV智能采集人臉信息,利用其內(nèi)置的STM32F65VI AMR Cortex M7處理器計算處理信息,通過對比圖像LBP算子的方式,識別判斷人臉信息。同時將OpenMV與單片機相連接,外接LCD1602顯示屏,矩陣鍵盤,繼電器,蜂鳴器完整模擬一款可以進(jìn)行用戶人臉信息注冊、人臉識別、電子顯示、開鎖、報警等多功能的智能識別人臉門鎖。
關(guān)鍵詞:OpenMV;LBP算子;人臉識別;門鎖
中圖分類號:TP18 ? ? ?文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2020)25-0005-04
1 背景
人臉識別技術(shù)是近代以來飛速發(fā)展的一種生物識別技術(shù),由于每個人長相不同,臉部輪廓幅度不同,用人臉信息作為識別身份的依據(jù)是可靠的。因而現(xiàn)如今也出現(xiàn)了人臉識別的廣泛應(yīng)用,比如支付寶刷臉支付、手機刷臉解鎖,公安監(jiān)控系統(tǒng)的人臉識別等。但就對于普通家庭而言,門鎖才是安全的第一保障,而傳統(tǒng)的鑰匙門鎖易丟失,易復(fù)制;密碼鎖密碼需定時更換,且容易被錄像竊取;指紋鎖在智能人臉門鎖的特征優(yōu)勢下也顯得相形見絀。雖然人臉識別門鎖成本較高,但具有可記錄圖像,處理和分析圖像的功能,不僅防止了外來非法人員的進(jìn)入,更可以幫助使用者了解試圖闖入人員的面部信息,起到很好的安全防范作用。
人臉識別是通過對圖像中人臉各個維度信息進(jìn)行分析,再將分析后的數(shù)據(jù)與數(shù)據(jù)庫內(nèi)的數(shù)據(jù)進(jìn)行對比判斷,從而達(dá)到識別的效果。一般步驟為,定義局部區(qū)域,局部區(qū)域特征的提取,經(jīng)過樣本訓(xùn)練后得到的變換矩陣將人臉圖像向量映射為人臉特征向量;然后進(jìn)行分類。分類器多采用組合分類器的形式,每個局部特征對應(yīng)一個分類器,后可用投票或線性加權(quán)等方式得到最終識別結(jié)果。
人臉識別算法的分類按維數(shù)分類可大致分為二維算法和三維算法。
二維算法是利用人臉上分布的由低到高的80個節(jié)點來檢測量眼睛、顴骨、下巴等之間的距離從而實現(xiàn)身份認(rèn)證。其主要算法有:基于模板匹配的方法;基于奇異值特征方法;子空間分析法;局部保持投影(Locality Preserving Projections,LPP);主成分分析(PCA);其他方法還有彈性匹配方法、特征臉法(基于KL變換)、人工神經(jīng)網(wǎng)絡(luò)法、支持向量機法、基于積分圖像特征法(adaboost學(xué)習(xí))、基于概率模型法。
由于三維算法可以有效地解決二維圖像中姿態(tài),光照,表情,面部遮擋物等方面對識別精度的影響,自90年代初期,科學(xué)家們就開展了對三維算法的研究,并取得了極大的進(jìn)展。目前三維人臉識別方法有基于圖像特征的方法和基于模型可變參數(shù)的方法。
2 總體設(shè)計
2.1 系統(tǒng)總體框圖
本系統(tǒng)主要是由五個硬件部分組成,其中核心的處理器為OpenMV搭載的STM32F65VI AMR Cortex M7芯片,輸入模塊有按鍵和攝像頭;輸出模塊有LCD顯示和繼電器模擬門鎖開關(guān)。
2.2 系統(tǒng)總體方案
本設(shè)計按照用戶具體操作情況可以分為兩大部分,一是管理員操作模塊,二是用戶使用模塊。其中管理員操作模塊分為三個部分:驗證管理員信息;采集人臉信息;退出管理員系統(tǒng)。用戶使用模塊又可細(xì)化為下面四個步驟:攝像頭采集人臉,處理人臉信息,根據(jù)人臉信息選擇是否開鎖,系統(tǒng)復(fù)位。具體描述如下:
1)通過鍵盤選擇進(jìn)入管理員操作系統(tǒng)或用戶系統(tǒng)。
2)若檢測到指定按鍵被按下,攝像頭立刻采集人臉圖片三次。
3)處理器處理采集到的人臉圖片,與系統(tǒng)內(nèi)儲存的合法人臉相對比,若三次采集的圖像數(shù)據(jù)對比吻合度都達(dá)到閾值要求,則打開門鎖。
4)門鎖打開后,按任意鍵關(guān)閉門鎖。
5)若用戶想進(jìn)入管理員系統(tǒng)需按下按鈕并輸入管理員密碼。
6)檢測管理員密碼是否正確,若正確進(jìn)入管理員操作系統(tǒng);若錯誤發(fā)出提示音,若連續(xù)三次輸入錯誤,則鎖住按鍵,不能更改。
7)錄入人臉信息20次。
8)按任意鍵退出管理員系統(tǒng)。
3 硬件設(shè)計
本設(shè)計主要是由OpenMV、STC89C51單片機,矩陣鍵盤,液晶顯示器,繼電器控制模塊等部分組成。
3.1 OpenMV
OpenMV攝像頭是一款低功耗,容易上手,擴展性強的電路板,其使用python編程語言可以幫助使用者較為輕松地完成機器視覺應(yīng)用的實現(xiàn)。它由STM32F65VI AMR Cortex M7處理器搭配OV7725感光元件構(gòu)成,其中處理器有一個全速USB(12Mbs)接口,可供OpenMV插入電腦端;一個μSD卡槽,;一個SPI總線,;一個 I2C總線,CAN總線, 和一個異步串口總線(TX/RX) ,;一個12-bit ADC 和一個12-bit DAC;三個 I/O 引腳用于舵機控制;一個RGB LED(三色), 兩個高亮的 850nm IR LED(紅外)。
OpenMV是一個開源的,搭載了一個強大的32位處理器的攝像頭,達(dá)到了本項目的技術(shù)要求水平,并且可以使用SD卡可以更方便將圖像流數(shù)據(jù)提取出來,是一個較為完整地開發(fā)系統(tǒng)。相較于在STM32單片機上搭載攝像頭,OpenMV更加的便捷高效。相較于用樹莓派搭載攝像頭采集人臉信息,然后調(diào)用opencv與face++的API對照片進(jìn)行識別而言,OpenMV會更加方便快捷。
3.2 STC89C51單片機
本設(shè)計中,管理員系統(tǒng)采用了STC89C51作為主處理芯片,STC89C51是電子類大學(xué)生普遍接觸的一款單片機類型,具有低功效,高性能的特點。STC89C51含有32個雙向I/O口,2個16位可編程定時器、計數(shù)器中斷,2個串行中斷,2個外部中斷,2個讀寫中端口,具有低功效空閑和掉電模式,可軟件設(shè)置睡眠和喚醒功能。
由時鐘電路和復(fù)位電路構(gòu)成單片機最小系統(tǒng),時鐘電路為單片機提供運行振蕩時鐘,是單片機工作的前提;復(fù)位電路提供快速復(fù)位操作,一般單片機都提供了上電自動復(fù)位和手動復(fù)位。
3.3 LCD1602顯示屏
LCD1602是一款點陣式LCD,由16*2個顯示單元組成,每個顯示單元可以顯示一個字符,一個顯示單元由5*7的點陣字符顯示位構(gòu)成。顯示單位的點陣字符的明暗反映出顯示的內(nèi)容,而屏幕上的顯示單元又與顯示RAM區(qū)字節(jié)一一對應(yīng),實現(xiàn)了控制顯示。
LCD1602共具有16個引腳,其中2個電源引腳VSS和VCC,一個顯示屏對比度調(diào)整端VL,一個寄存器選擇引腳RS,一個讀寫引腳R/W,一個使能引腳E,一正一負(fù)兩個背光源引腳,七個雙8位雙向口數(shù)據(jù)線D0~D7。
LCD1602的讀寫,光標(biāo)和顯示模式的控制操作則都是由指令編碼完成。一共有十一條指令:清除、返回、輸入模式設(shè)置、顯示開關(guān)、控制、以為、功能設(shè)置、CGRAM地址設(shè)置、DDRAM地址設(shè)置、讀忙信號和光標(biāo)地址、寫數(shù)據(jù)、讀數(shù)據(jù)。
3.4 AT24C02存儲模塊
AT24C02是一款美國Atmel公司生產(chǎn)的低功效CMOS型E2PROM,具有掉電存儲功能,利用IIC總線數(shù)據(jù)傳送協(xié)議,它共有6個引腳,其中有串行時鐘線SCL,串行數(shù)據(jù)/地址線SDA,A0-A2器件地址輸入端,WP寫保護。
3.5 繼電器控制模塊
電磁繼電器是利用電磁感應(yīng)原理,可以通過小電壓控制較大電流,其主要組成部分有鐵芯、線圈、銜鐵、觸點簧片。當(dāng)給線圈兩邊施加一定電壓,線圈周圍將會產(chǎn)生磁場,從而吸引銜鐵使之向鐵芯方向移動,同時也導(dǎo)致了銜鐵的動觸點與靜觸點吸合,使輸出回路連通。當(dāng)斷電后,銜鐵在彈簧的拉力作用下返回原來位置,動觸點與靜觸點斷開,輸出回路斷開。在此設(shè)計中,利用繼電器控制門鎖的開關(guān)是合適的。
3.6 矩陣鍵盤模塊
本次設(shè)計需要用戶輸入密碼,這里采用的是最普遍的0-9數(shù)字密碼,因而選用了4*4矩陣鍵盤。將鍵盤設(shè)計成矩陣的形式可以減少I/O口的占用,4*4一共16個僅占用一個端口即可設(shè)計完成。
4 軟件設(shè)計
此次開發(fā)設(shè)計選用OpenMV作為圖像處理處理器,而OpenMV的二次開發(fā)一般選用Python程序語言。Python具有上手簡單;不用考慮內(nèi)存的申請和釋放;已有開發(fā)團隊封裝好的各種算法和模塊可以直接調(diào)用;還有MicroPython庫可以直接用等的優(yōu)點,并且Python在圖像處理,機器學(xué)習(xí),網(wǎng)絡(luò)編程中都得到了廣泛應(yīng)用。
4.1 主函數(shù)程序框圖
4.2 各子程序設(shè)計
4.2.1 OpenMV采集人臉程序設(shè)計
OpenMV采集人臉只需要將當(dāng)前攝像頭所拍攝的圖像信息儲存到用戶庫中即可。為了提高樣本集,在此處設(shè)置每個用戶拍攝20張照片,并且拍攝過程中需要用戶盡可能調(diào)整自己的面部表情。
采集人臉程序代碼:
import sensor, image, pyb
red_led ? = LED(1)
green_led = LED(2)
blue_led = LED(3)
lcd.init() # 初始化lcd.
sensor.reset() # 初始化攝像頭.
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_framesize(sensor.B128X128)
sensor.set_windowing((92,112))#設(shè)置屏幕窗口大小
sensor.skip_frames(10)
sensor.skip_frames(time = 2000)
num = 3#被拍攝人臉信息編號
n = 10 #每個用戶拍攝10張照片
while(n):
red_led.on()#亮紅燈
sensor.skip_frames(time = 2000) # 暫停2s
blue_led.on()
sensor.snapshot().save("photo/s%s/%s.pgm" % (num, n) ) # 將用戶人臉信息保存到SD卡里面
n -= 1
blue_led.off()
print("注冊人臉信息已成功")
4.2.2 OpenMV識別人臉程序設(shè)計
為了提高識別人臉時數(shù)據(jù)采集的精準(zhǔn)性,使用了判斷標(biāo)識關(guān)鍵字的方式,利用for循環(huán)語句,進(jìn)行三次人臉采集,分別判斷當(dāng)前人臉與用戶庫人臉數(shù)據(jù)的對比數(shù)據(jù)是否超過閾值,當(dāng)差異度小于閾值,將標(biāo)識字賦值為1,否則為0。當(dāng)關(guān)鍵字為0時,退出識別人臉程序,并閃爍紅燈,標(biāo)識人臉識別失敗。當(dāng)三次識別均成功時,閃爍綠燈,打開繼電器。
識別人臉代碼:
import sensor, time, image, pyb, lcd
from pyb import Pin
from pyb import LED
red_led ? = LED(1)
green_led = LED(2)
lcd.init() #
sensor.reset() # 初始化攝像頭.
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_framesize(sensor.B128X128)
sensor.set_windowing((92,112))#設(shè)置屏幕窗口大小
sensor.skip_frames(10)
sensor.skip_frames(time = 2000)
NUM_SUBJECTS = 3 #圖庫中的用戶人數(shù)
NUM_SUBJECTS_IMGS = 10 #每個人的合法樣本數(shù)
flag = 1
p_in = Pin('P6', Pin.IN, Pin.PULL_UP)# P6為輸入引腳,并上拉電阻
value = p_in.value() # get value, 0 or 1#讀P6引腳的值
print(value)
def min_value(a, b, c):
global num
if a pmin=b num=c return a if value==0 and flag ==1: for n in range(0,3): # 拍攝當(dāng)前人臉。 Img_now = sensor.snapshot() ####display### for i in range (1,100): lcd.display(Img_now) #拍攝當(dāng)前照片并顯示出來 ############## L0 = Img_now.find_lbp((0, 0, img.width(), img.height())) #將當(dāng)前人臉的lbp特征保存在L0中 Img_now = None pmin = 999999#最大化 num=0 for s in range(1, NUM_SUBJECTS+1): dist = 0 for i in range(2, NUM_SUBJECTS_IMGS+1): img = Img_now.Image("photo/s%d/%d.pgm"%(s, i)) L1 = Img_now.find_lbp((0, 0, Img_now.width(), Img_now.height())) #將文件夾中的lbp特征保存在L1中 dist += Img_now.match_descriptor(L0, L1)#計算人臉的特征差異度。 print("Average dist for subject %d: %d"%(s, dist/NUM_SUBJECTS_IMGS)) pmin = min_value(pmin, dist/NUM_SUBJECTS_IMGS, s)#打印當(dāng)前照片與用戶庫中照片的特征差異度 if (pmin<6500): flag = 1 else: flag = 0 print(pmin) print(num_value) # num為當(dāng)前最匹配的人的編號。 if(pmin<6500): print("the door is open.") Img_now.draw_string(200,200,"the door is open.", color = (255, 0, 0)) green_led.on() time.sleep(500) else: print("the face is not detected,please try again.") Img_now.draw_string(200,200,"the face is not detected,please try again.") red_led.on() time.sleep(500) else: print("the face is not detected,please try again.") Img_now.draw_string(200,200,"the face is not detected,please try again.") red_led.on() time.sleep(500) 4.2.3 密碼驗證程序設(shè)計 在驗證管理員信息時需要對輸入的密碼與AT24C02中儲存的密碼進(jìn)行比較驗證,并且設(shè)置了三次密碼錯誤啟動鍵盤鎖,此時將不能再通過按鍵輸入密碼。 4.2.4 按鍵程序設(shè)計 本次設(shè)計采用的是矩陣鍵盤,判斷是否有按鍵按下,需要CPU對所有的鍵盤進(jìn)行實時監(jiān)視,判斷按下的是哪個鍵盤需要按行按列依次掃描鍵盤確認(rèn)位置,并且掃描時要注意去除抖動。 5 調(diào)試 5.1 人臉識別特征差異閾值 由于LBP特征識別算法是將圖像的局部紋理特征轉(zhuǎn)化為一個LBP值,因此在對比圖像時,LBP的差異度即特征差異度越小,說明檢測到的人臉與樣本人臉更為相似。 在本設(shè)計中,用于區(qū)分是否為本人的這個特征差異度稱之為閾值。這個閾值的選擇需要實際實驗測得數(shù)據(jù)來選擇,同時還考慮到了樣本照片,光線強弱,人物背景,人物表情等因素對特征差異度的影響。下面是控制變量法下的實驗數(shù)據(jù)。 由表中數(shù)據(jù)可以看到,通過圖片檢測的特征差異度普遍在7000-8000之間,而真實人臉檢測的特征差異度可以在6500左右。因此在實際選擇閾值時選擇設(shè)置閾值為6500,并且進(jìn)行多次檢測的方式減少誤差比較合適。 5.2 OpenMV調(diào)試 對OpenMV調(diào)試主要是將其連接至電腦端,單獨運行人臉識別和人臉存儲的代碼。由于代碼是用python語法,因此有一個常見的錯誤提醒:SyntaxError: invalid syntax,這種錯誤常由于在def,class,if,elif,for,while等語句末尾沒有加上“:”或是因為縮進(jìn)不正確。由于python是一個沒有中括號的編程語言,語言的邏輯包含關(guān)系全都由縮進(jìn)體現(xiàn),因此在整個編程中要特別注意縮進(jìn)。另外在調(diào)試代碼時出現(xiàn)了沒有語法錯誤,但是出來的結(jié)果并非期望值的情況,這時就只能一步一步地看代碼,在關(guān)鍵代碼處可以添加一行輸出來查看這時一些關(guān)鍵值的變化,這樣可以快速定位出錯的邏輯位置。 還有一個小問題值得一提,由于OpenMV保存人臉信息是保存至本地的SD內(nèi)存卡中,在提取人臉信息算法中要輸入相應(yīng)的路徑,該路徑下存有已經(jīng)保存的人臉信息分別放至s1-s6的文件夾中。開始本以為路徑和文件夾都可以自動生成,但是測試時發(fā)現(xiàn)都不行,而且在提取完人臉信息后,文件夾內(nèi)是不會立即更新的,需要將OpenMV重啟后才能看到。 5.3 LCD顯示屏調(diào)試 本次設(shè)計中的管理員系統(tǒng)采用了LCD1602顯示屏,用于用戶輸入密碼顯示。整體來說LCD1602的調(diào)試比較簡單,可以通過在51學(xué)習(xí)板上進(jìn)行范例代碼的測試,由此判斷顯示屏是否工作正常,只要顯示成功余下的就是編碼的問題了。 5.4 矩陣鍵盤調(diào)試 矩陣鍵盤測試的重點是硬件方面,在焊接時一定要仔細(xì)仔細(xì)再仔細(xì),每次焊接完一行或者一列都需要用萬用表測試是否連通,是否存在虛焊的情況。用萬用表確認(rèn)基本無誤后,將在學(xué)習(xí)板測試成功的簡單按鍵操作代碼修改引腳后用于測試。 5.5 系統(tǒng)安裝 1)設(shè)計需求分析,按照本次設(shè)計的需求現(xiàn)將設(shè)計成為相應(yīng)模塊,并構(gòu)思好系統(tǒng)的框架結(jié)構(gòu)。 2)按照模塊需求,列出每個模塊需要的元器件,并匯總為總元器件清單。 3)按照元器件清單購買元器件,并根據(jù)設(shè)計的原理圖將元器件按照每個模塊焊接完成,并用萬能表測試焊接情況,初步排除虛焊,漏焊等情況。 4)在相應(yīng)的編程軟件中,按照模塊順序編寫相應(yīng)程序,如果方便可以先在學(xué)習(xí)板上測試程序功能。 5)在軟硬件準(zhǔn)備工作完成后,將所有的模塊相連,挨個測試模塊功能是否完成。模塊測試完成后再編寫主程序,耐心調(diào)試。 6)在主程序測試成功后,對整體代碼邏輯順序進(jìn)行梳理,多次測試完善,直到最終達(dá)到理想效果。 設(shè)計安裝完成及調(diào)試過程如圖3。 參考文獻(xiàn): [1] 何玉.基于Python語言圖像邊緣檢測及其算法分析[J].計算機產(chǎn)品與流通, 2018(6):147. [2] 郭向,星田斐.智能人臉識別門鎖控制系統(tǒng)設(shè)計[J].電子技術(shù)與軟件工程, 2019(17):115-116. [3] 李勇.基于RFID與人臉識別技術(shù)的智能門禁系統(tǒng)研究與設(shè)計[D].重慶:重慶大學(xué),2009. 【通聯(lián)編輯:謝媛媛】