第一次寫博客,有點緊張和興奮。廢話很少說,直接進入正題。若是你渴望使你的電腦可以進行人臉識別;若是你不想了解什麼c++、底層算法;若是你也不想買什麼樹莓派,安裝什麼幾個G的opencv;若是你和我同樣是個還沒入門的小白,可是想體驗一下人臉識別的魅力。那麼恭喜你,這篇文章就是爲你準備的。讓咱們開始吧!html
1.一臺能夠聯網的有攝像頭的電腦(手動滑稽)。python
2.python3.7的安裝包c++
1.Python3.7的安裝算法
關於python3.7的安裝,網上有不少教程,請自行百度。app
值得注意的是安裝時勾選添加環境變量,若是不添加,也能夠,但要本身輸入相關文件的絕對路徑。ide
2.第三方包的安裝準備函數
2.0本文采用pip進行安裝,如有過pip經驗的能夠跳過這個部分。ui
2.1在開始菜單欄搜索dos,而後回車啓動命令提示符。spa
2.2在python3.7的Scripts文件夾中能夠找到pip.exe。3d
2.3在命令提示符中輸入Scripts文件夾的絕對路徑
例:cd C:\\python3.7\Scripts
注:cd爲Change directory,即更換目錄,cd後有空格。
2.4更換目錄成功後,輸入pip.exe,啓動pip,出現以下畫面說明啓動成功。
2.5 啓動pip後,就能夠開始安裝Python的第三方包了,注意要讓電腦聯網。
3 第三方包的安裝
3.1opencv 的安裝,輸入:pip install opencv-python。
注:numpy與OpenCV綁定安裝,無需本身輸入命令。
3.2 pillow的安裝,輸入: pip install pillow
注:pillow爲圖像處理包。
3.3 contrib的安裝,輸入:pip instal opencv-contrib-python
注:筆者在contrib的安裝這裏花費了一些時間,網上說的那些很麻煩的辦法,讓我看的雲裏霧裏的。
contrib這個包用上面那個命令就能夠安裝,它是用於訓練本身的人臉模型的一個OpenCV擴展包。
下圖爲三個包的安裝過程截圖,因爲我以前已經安裝過,會顯示包已存在。首次安裝會有進度條,成功後會有Successfully字樣。
1.FaceDetection,人臉檢測
廢話很少說,先上代碼
1 import numpy as np 2 import cv2 3 4 # 人臉識別分類器 5 faceCascade = cv2.CascadeClassifier(r'C:\python3.7\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml') 6 7 # 識別眼睛的分類器 8 eyeCascade = cv2.CascadeClassifier(r'C:\python3.7\Lib\site-packages\cv2\data\haarcascade_eye.xml') 9 10 # 開啓攝像頭 11 cap = cv2.VideoCapture(0) 12 ok = True 13 14 while ok: 15 # 讀取攝像頭中的圖像,ok爲是否讀取成功的判斷參數 16 ok, img = cap.read() 17 # 轉換成灰度圖像 18 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 19 20 # 人臉檢測 21 faces = faceCascade.detectMultiScale( 22 gray, 23 scaleFactor=1.2, 24 minNeighbors=5, 25 minSize=(32, 32) 26 ) 27 28 # 在檢測人臉的基礎上檢測眼睛 29 for (x, y, w, h) in faces: 30 fac_gray = gray[y: (y+h), x: (x+w)] 31 result = [] 32 eyes = eyeCascade.detectMultiScale(fac_gray, 1.3, 2) 33 34 # 眼睛座標的換算,將相對位置換成絕對位置 35 for (ex, ey, ew, eh) in eyes: 36 result.append((x+ex, y+ey, ew, eh)) 37 38 # 畫矩形 39 for (x, y, w, h) in faces: 40 cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) 41 42 for (ex, ey, ew, eh) in result: 43 cv2.rectangle(img, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2) 44 45 cv2.imshow('video', img) 46 47 k = cv2.waitKey(1) 48 if k == 27: # press 'ESC' to quit 49 break 50 51 cap.release() 52 cv2.destroyAllWindows()
注:1.人臉識別分類器的路徑在不一樣的電腦上不一樣,通常來說,在python3.7\Lib\site-packages\cv2\data中,注意是絕對路徑,若是嫌目錄太長,能夠將分類器和程序放在一塊兒。
注:2.通過個人慎重考慮,我決定不放出個人人臉,請各位讀者自行嘗試,大概就是一個藍色的矩形框住你的臉,兩個綠色的矩形框住你的眼睛,按esc可退出。
2.FaceDataCollect,人臉數據收集
仍是先上代碼
1 import cv2 2 import os 3 # 調用筆記本內置攝像頭,因此參數爲0,若是有其餘的攝像頭能夠調整參數爲1,2 4 5 cap = cv2.VideoCapture(0) 6 7 face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 8 9 face_id = input('\n enter user id:') 10 11 print('\n Initializing face capture. Look at the camera and wait ...') 12 13 count = 0 14 15 while True: 16 17 # 從攝像頭讀取圖片 18 19 sucess, img = cap.read() 20 21 # 轉爲灰度圖片 22 23 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 24 25 # 檢測人臉 26 27 faces = face_detector.detectMultiScale(gray, 1.3, 5) 28 29 for (x, y, w, h) in faces: 30 cv2.rectangle(img, (x, y), (x+w, y+w), (255, 0, 0)) 31 count += 1 32 33 # 保存圖像 34 cv2.imwrite("Facedata/User." + str(face_id) + '.' + str(count) + '.jpg', gray[y: y + h, x: x + w]) 35 36 cv2.imshow('image', img) 37 38 # 保持畫面的持續。 39 40 k = cv2.waitKey(1) 41 42 if k == 27: # 經過esc鍵退出攝像 43 break 44 45 elif count >= 1000: # 獲得1000個樣本後退出攝像 46 break 47 48 # 關閉攝像頭 49 cap.release() 50 cv2.destroyAllWindows()
注:1.在運行該程序前,請先建立一個Facedata文件夾並和你的程序放在一個文件夾下。
友情提示:請將程序和文件打包放在一個叫人臉識別的文件夾下。能夠把分類器也放入其中。
注:2.程序運行過程當中,會提示你輸入id,請從0開始輸入,即第一我的的臉的數據id爲0,第二我的的臉的數據id爲1,運行一次可收集一張人臉的數據。
注:3.程序運行時間可能會比較長,可能會有幾分鐘,若是嫌長,能夠將 #獲得1000個樣本後退出攝像 這個註釋前的1000,改成100。
若是實在等不及,可按esc退出,但可能會致使數據不夠模型精度降低。
3.face_training,人臉數據訓練
1 import numpy as np 2 from PIL import Image 3 import os 4 import cv2 5 # 人臉數據路徑 6 path = 'Facedata' 7 8 recognizer = cv2.face.LBPHFaceRecognizer_create() 9 detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") 10 11 def getImagesAndLabels(path): 12 imagePaths = [os.path.join(path, f) for f in os.listdir(path)] # join函數的做用? 13 faceSamples = [] 14 ids = [] 15 for imagePath in imagePaths: 16 PIL_img = Image.open(imagePath).convert('L') # convert it to grayscale 17 img_numpy = np.array(PIL_img, 'uint8') 18 id = int(os.path.split(imagePath)[-1].split(".")[1]) 19 faces = detector.detectMultiScale(img_numpy) 20 for (x, y, w, h) in faces: 21 faceSamples.append(img_numpy[y:y + h, x: x + w]) 22 ids.append(id) 23 return faceSamples, ids 24 25 26 print('Training faces. It will take a few seconds. Wait ...') 27 faces, ids = getImagesAndLabels(path) 28 recognizer.train(faces, np.array(ids)) 29 30 recognizer.write(r'face_trainer\trainer.yml') 31 print("{0} faces trained. Exiting Program".format(len(np.unique(ids))))
注:1.第8行的LBPHFaceRecognizer_create()爲contrib中的函數,筆者以前本身摸索時,沒有安裝此包,所以卡了好久,印象深入。
注:2.運行該程序前,請在人臉識別文件夾下建立face_trainer文件夾。
4.face_recognition 人臉檢測
1 import cv2 2 3 recognizer = cv2.face.LBPHFaceRecognizer_create() 4 recognizer.read('face_trainer/trainer.yml') 5 cascadePath = "haarcascade_frontalface_default.xml" 6 faceCascade = cv2.CascadeClassifier(cascadePath) 7 font = cv2.FONT_HERSHEY_SIMPLEX 8 9 idnum = 0 10 11 names = ['Allen', 'Bob'] 12 13 cam = cv2.VideoCapture(0) 14 minW = 0.1*cam.get(3) 15 minH = 0.1*cam.get(4) 16 17 while True: 18 ret, img = cam.read() 19 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 20 21 faces = faceCascade.detectMultiScale( 22 gray, 23 scaleFactor=1.2, 24 minNeighbors=5, 25 minSize=(int(minW), int(minH)) 26 ) 27 28 for (x, y, w, h) in faces: 29 cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) 30 idnum, confidence = recognizer.predict(gray[y:y+h, x:x+w]) 31 32 if confidence < 100: 33 idnum = names[idnum] 34 confidence = "{0}%".format(round(100 - confidence)) 35 else: 36 idnum = "unknown" 37 confidence = "{0}%".format(round(100 - confidence)) 38 39 cv2.putText(img, str(idnum), (x+5, y-5), font, 1, (0, 0, 255), 1) 40 cv2.putText(img, str(confidence), (x+5, y+h-5), font, 1, (0, 0, 0), 1) 41 42 cv2.imshow('camera', img) 43 k = cv2.waitKey(10) 44 if k == 27: 45 break 46 47 cam.release() 48 cv2.destroyAllWindows()
注:1. 11行的names中存儲人的名字,若該人id爲0則他的名字在第一位,id位1則排在第二位,以此類推。
注:2. 最終效果爲一個綠框,框住人臉,左上角爲紅色的人名,左下角爲黑色的機率。
1.結語
真是不容易啊,第一次寫博客,終於寫完了。說一說初衷吧,當初我本想作一個電腦的人臉解鎖。個人想法是,手機都有人臉解鎖,電腦也能夠作。
但我認爲,我並不能真的實現,一是我不知道怎樣鎖住電腦,雖然我能夠用python的easygui去模仿一個登錄界面,輸入密碼解鎖,然而,我清楚,
我並不能真正的鎖住電腦,因此我就放棄了這個計劃。若是有大神能夠作到,請務必在評論區留言,我迫切的但願知道該怎樣作。
說一說我寫這篇博客的目的吧,我當初一路走來,在網上搜到的大可能是CSDN上的博客,且大多爲人臉檢測,並無人臉識別,數據收集和模型訓練。
僅有的幾篇也都講得雲裏霧裏,實在水平有限,看不懂。因而,我萌生了寫一篇給小白看的人臉識別的博客的想法,原本打算在csdn上寫,
但因爲種種緣由,我選擇了博客園。
2.參考文獻與擴展閱讀
在這裏,我要感謝樹莓派實驗室的一篇文章,個人大部分代碼都來源於此,對想要作深刻了解的讀者,能夠參考此文,如下是連接
在此以一個問題結尾,爲何網上沒有詳細的關於如何在電腦上實現人臉識別的教程,而卻有在樹莓派上的詳細教程呢?這不是上升了一個門檻嗎?
也許是我沒找到?這是我寫這篇教程的初衷之一。