本次分享的是一個可以用于畢業(yè)設計參考的人臉識別項目,由FJNUThomas分享。如果有做人臉識別畢設的同學,可以在此基礎上,做更深入的研究,源碼下載方式見文末。下面是設計步驟: 硬件及環(huán)境:
樹莓派3B V1.2
攝像頭羅技C170
樹莓派系統(tǒng):bullseye
python 3.9.2
opencv-python 4.5.3.56
opencv-contrib-python 4.5.3.56
numpy 1.21.0
關于樹莓派安裝opencv的步驟,可以參考下面這篇博文:
https://blog.csdn.net/m0_46190150/article/details/121501093
人臉檢測
我們實現(xiàn)人臉識別的前提事件是人臉檢測,只有檢測到人臉,才能夠收集到人臉的數(shù)據(jù)。我們用的是opencv自帶的分類器:
haarcascade_frontalface_default.xml代碼實現(xiàn):
importcv2faceCascade = cv2.CascadeClassifier('Cascades/haarcascade_frontalface_default.xml')cap=cv2.VideoCapture(0) cap.set(3, 640) # set Weightcap.set(4,480)#setHeight while True: ret, img = cap.read() img = cv2.flip(img, 1) #如果攝像頭倒置,將1改成-1 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale(gray, scaleFactor=1.2,minNeighbors=5, minSize=(20, 20) ) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) roi_gray = gray[y:y + h, x:x + w]roi_color=img[y:y+h,x:x+w] cv2.imshow('video', img) k = cv2.waitKey(30) & 0xff if k == 27: # Esc for quit break cap.release() cv2.destroyAllWindows()在python3下運行如上代碼可以完成人臉檢測的功能。
圖像采集
人臉識別的本質其實就是構建一個人臉信息的數(shù)據(jù)庫,電腦比對攝像頭采集到的人臉信息和數(shù)據(jù)庫中存放的數(shù)據(jù),從而得到一個比對的結果。 圖像采集需要我們在.py文件同目錄下新建一個文件夾,用于存放采集得到的圖片。
mkdir data采集得到的圖片越多,構建的數(shù)據(jù)庫越完善,判斷成功的概率也越高,但圖片太多同樣會降低比對時的速度。 我這里是設置了每0.2s拍一張照片,按ecs或拍滿40張照片時退出。
k = cv2.waitKey(200) & 0xff # ESC退出and每0.2s拍一張 if k == 27: break elif count >= 40: # 拍40張照片 break圖像采集示例(這邊需要我們在終端輸入id號,我這邊輸入4) 采集得到的圖片:
開始訓練
訓練是opencv人臉識別的重中之重。opencv為我們提供了多個內置函數(shù),調用這些函數(shù)能夠幫助我們訓練得到自己的訓練集這邊我采用的是:
recognizer.train()在開始訓練之前,我們需要新建一個空目錄用于存放得到的模型:
mkdir trainer模型保存為.xml文件,要注意我們的代碼是在樹莓派下跑的,在樹莓派下recognizer.write()是不能夠使用的,因此我們用:
recognizer.write('trainer/trainer.yml')進行保存,訓練成功實例 ?
人臉識別
通過了前三個步驟,我們已經(jīng)有了一個在data文件夾中保存采集到的圖像、在trainer文件夾中保存自己訓練的trainer.xml模型的文件了,我們就進入到了最后一步,也就是傳說中的人臉識別了。人臉識別實例: 可以看到,系統(tǒng)識別出我有73%的概率是彭于晏,識別的成功率還是很高的、關于輸出名字的問題,在代碼的這個部分:
id = 0 names = ['None', 'pengyuyan', 'xsy', 'rhy']我們可以在這里修改成自己想要的名字,在代碼中還有這樣的部分:
id,confidence=recognizer.predict(gray[y:y+h,x:x+w])#判斷成功概率>45時,輸出id,否則輸出unknowif(confidence55):??????id?=?names[id]????? ?confidence?=?"??{0}%".format(round(100?-?confidence)) else:????????? id?=?"unknown"??????????confidence?=?"??{0}%".format(round(100?-?confidence))用于修改自己想要的判斷概率。 到這里我們的人臉識別就基本完成了。
總結
通過本項目,可以獲得以下技能:
學會樹莓派的配置,并在樹莓派上配置了環(huán)境
對opencv庫有了個基本的了解,熟悉幾個內置函數(shù)的功能和使用
對Linux有了更深刻的理解
增加了python能力
不足之處: 在調試的過程中,發(fā)現(xiàn)在樹莓派上運行項目還是有比較明顯的卡頓的,因此有對代碼進行優(yōu)化的想法,查閱資料以后了解到了有一個東西叫做pypy,嘗試過用pypy對文件進行編碼,奈何寫的代碼是基于python3.9,和當前的pypy版本不太匹配,只好暫時作罷。在之后應該會嘗試進行一次重新編譯,感興趣的同學可以嘗試看看。
-
Linux
+關注
關注
87文章
11304瀏覽量
209521 -
函數(shù)
+關注
關注
3文章
4331瀏覽量
62622 -
人臉識別
+關注
關注
76文章
4012瀏覽量
81907 -
OpenCV
+關注
關注
31文章
635瀏覽量
41352
原文標題:畢業(yè)設計| 樹莓派與OpenCV實現(xiàn)人臉識別
文章出處:【微信號:達爾聞說,微信公眾號:達爾聞說】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論