目前很多中小學創(chuàng)客項目中有關“人臉識別”都是通過使用百度的AI開放平臺來實現(xiàn)的。需要提前注冊賬號并采集“人臉庫”信息,然后借助于個人賬號的API Key和Secret Key進行在線數(shù)據(jù)的調(diào)用比對,最終獲取置信度百分比實現(xiàn)對人臉的識別判斷。這種方式的優(yōu)點是用戶編程時人臉識別的底層算法及實現(xiàn)過程是一個黑箱,只需通過接口進行數(shù)據(jù)的雙向傳輸即可。缺點是必須保證網(wǎng)絡的通暢,而且免費賬號可能有時間段或有效使用次數(shù)等限制。
我們以樹莓派為基礎平臺,借助開源計算機視覺庫OpenCV、多維數(shù)組計算的Numpy庫、連接硬件設備的PinPong庫以及PIL庫、os庫等,就可以通過攝像頭采集人臉進行數(shù)據(jù)的本地訓練,最終實現(xiàn)脫離網(wǎng)絡環(huán)境的人臉識別本地門禁系統(tǒng)。
0111 實驗器材及連接
實驗器材包括:樹莓派3B和古德微擴展板各一塊,帶數(shù)據(jù)排線的P5V04A SUNNY定焦攝像頭一個,SG90舵機一個,RGB三合一紅綠燈模塊一個,小型面包板一塊,杜邦線若干。
首先,將樹莓派主板CSI卡槽接口(標注為“CAMERA”)的鎖扣兩端向上輕輕拉起,再將攝像頭數(shù)據(jù)排線末端的“金手指”一面小心插至卡槽底部,并從兩端壓緊鎖扣。接著,將古德微擴展板四角對齊,輕輕壓進樹莓派的邊槽引腳組,注意將攝像頭的數(shù)據(jù)排線從另一側(cè)引出。
然后,將RGB紅綠燈模塊的四個引腳并列插入面包板,再使用紅色、黃色和綠色杜邦線分別將紅綠燈模塊的R、Y和G引腳對應連接至擴展板的5號、6號和12號引腳的“+”極,用白色杜邦線將紅綠燈模塊的GND引腳連接至擴展板5號引腳的“-”極;接著,將舵機插入擴展板的18號引腳組,注意黃色、紅色和棕色線分別對應D數(shù)據(jù)端、VCC和GND端;最后,給樹莓派通電,啟動操作系統(tǒng)(如圖1)。
0211 獲取人臉圖片的源數(shù)據(jù)
通過編程讓樹莓派的攝像頭拍攝一批我的臉部圖片,作為訓練AI的源數(shù)據(jù)。
運行Windows的“遠程桌面連接”程序,輸入樹莓派的IP地址(192.168.1.120)后點擊“連接”按鈕,進入樹莓派的操作系統(tǒng),準備開始Python代碼編程。
1.安裝庫模塊及
筆者的樹莓派操作系統(tǒng)中Python版本是3.7.3,需要在“LX終端”先安裝OpenCV庫,命令是“pip3 install opencv-python”;用“pip3 install numpy”命令安裝Numpy庫。同樣安裝好PIL庫、os庫以及PinPong庫。
2.拷貝人臉識別文件
接下來,在/home/pi/pycode中建立Recognize_Face項目文件夾,文件夾中分別建立PicData和Data兩個空目錄,前者用來保存攝像頭捕獲人臉的照片文件,后者則用來保存訓練好的trainner.yml數(shù)據(jù)文件。
然后,從/usr/local/share/opencv4/haarcascades文件夾中將已經(jīng)訓練好的人臉正面識別檢測模型haarcascade_frontalface_default.xml文件復制進來,待調(diào)用(如圖2)。
3.采集并將人臉圖轉(zhuǎn)灰度
為了提高人臉圖片的識別度,要將攝像頭捕獲的BGR格式人臉照片轉(zhuǎn)換成GRAY灰度圖。
首先,導入numpy和opencv庫:“import numpy as np”“import cv2”;接著,建立變量cap,賦值為“cv2.VideoCapture(0)”,作用是控制攝像頭開始抓拍生成視頻畫面;建立變量face_cascade,賦值為“cv2.CascadeClassifier("haarcascade_frontalface_default.xml")”,作用是使用人臉檢測的級聯(lián)分類器讀取之前保存在當前文件夾中的識別檢測模型文件haarcascade_frontalface_default.xml;建立變量sampleNum,賦值為0,對人臉采集的數(shù)目進行零初始化計數(shù);建立變量ID,賦值為“input("請輸入您的數(shù)字ID:")”,作用是在屏幕上輸出提示信息并為人臉采集照片文件進行命名的歸類。
在“while True”循環(huán)結(jié)構(gòu)中,先通過語句“ret, img = cap.read()”對攝像頭的人臉捕獲畫面進行讀取,其中的ret返回值為布爾型,讀取正確則返回True,變量img中存儲的是矩陣形式的一幀圖片信息;再建立變量gray,賦值為“cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)”,作用是將讀取到的BGR格式圖片進行GRAY灰度顏色轉(zhuǎn)換,生成對應的灰度圖片(目的是提高圖片的識別度);建立變量faces,賦值為“face_cascade.detectMultiScale(gray,1.3,5)”,作用是設置縮放參數(shù)為1.3、人臉確定的最小次數(shù)為5,實現(xiàn)對應精度的人臉識別,返回值是OpenCV對圖片的探測結(jié)果;在“for (x,y,w,h) in faces”內(nèi)循環(huán)中,(x,y)是左上角的像素點的二維坐標值,w和h則分別表示寬度和高度;對變量img進行二次處理并賦值為“cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)”,作用是使用rectangle進行人臉的矩形框標記,其中的“(x+w,y+h)”表示矩陣右下角像素的坐標值,“(255,0,0)”所對應的是BGR格式的藍色Blue顏色值,“2”表示畫框的線寬;語句“sampleNum = sampleNum + 1”的作用是進行人臉采集“加1”計數(shù)。
4.保存采集數(shù)據(jù)
通過cv2.imwrite進行圖片文件的保存操作,文件主名由四部分組成:“"PicData/user."+str(ID)+"."+str(sampleNum)”,然后是擴展名“".jpg"”(最終的文件名格式為“user.id.num.jpg”),“gray[y:y+h,x:x+w]”的作用是將灰度圖片作為二維數(shù)組進行人臉區(qū)域的檢測;語句“cv2.imshow("img", img)”的作用是顯示變量img所存儲的圖片,該顯示窗口的名稱也同為“img”;接下來,通過兩個if條件語句實現(xiàn)攝像頭拍照和圖片存儲操作的break中斷,一個條件為“cv2.waitKey(1) & 0xFF == ord("q")”,表示延時1毫秒的切換來等待鍵盤是否按下字母“q”(quit);另一個條件為“sampleNum == 1000”,表示人臉采集的數(shù)目是否超過1000張。
最后,添加攝像頭的資源釋放語句“cap.release()”,并且關閉圖像窗口:“cv2.destroyAllWindows()”,將程序保存為“01Capture_Face.py”(如圖3)。
5.測試人臉采集程序
運行程序,在“請輸入您的數(shù)字ID:”提示信息后面輸入數(shù)字“1”后回車,此時會彈出一個名為“img”的攝像頭預覽窗口,顯示的內(nèi)容即為攝像頭的實時拍攝畫面;盡量保持正臉或是小角度的側(cè)臉及仰視和俯視,攝像頭會將識別到的人臉區(qū)域用藍色矩形框進行標識(如圖4)。
經(jīng)過一段時間的人臉采集后,按一下鍵盤的q鍵退出,攝像頭的實時預覽窗口畫面關閉;此時進入PicData文件夾查看,是不是保存著若干張人臉照片文件(134張)?眼神和姿態(tài)可能各不相同,但共同點是均對人臉區(qū)域進行了截取——即藍色矩形框內(nèi)的“人臉”信息(如圖5)。
下一期,我們將用這些“源數(shù)據(jù)”來訓練人臉數(shù)據(jù)模型。
江西星火網(wǎng)防科技有限公司工程案例
【萍鄉(xiāng)安防監(jiān)控安裝咨詢熱線:15607994110 強弱電施工、信息光纖光纜熔接等服務,歡迎來電咨詢。】