人臉檢測及識別python實現系列(6)——終篇:從實時視頻流識別出“我”
終於到了最后一步,激動時刻就要來臨了,先平復一下心情,把剩下的代碼加上,首先是為Model類增加一個預測函數:
1 #識別人臉 2 def face_predict(self, image): 3 #依然是根據后端系統確定維度順序 4 if K.image_dim_ordering() == 'th' and image.shape != (1, 3, IMAGE_SIZE, IMAGE_SIZE): 5 image = resize_image(image) #尺寸必須與訓練集一致都應該是IMAGE_SIZE x IMAGE_SIZE 6 image = image.reshape((1, 3, IMAGE_SIZE, IMAGE_SIZE)) #與模型訓練不同,這次只是針對1張圖片進行預測 7 elif K.image_dim_ordering() == 'tf' and image.shape != (1, IMAGE_SIZE, IMAGE_SIZE, 3): 8 image = resize_image(image) 9 image = image.reshape((1, IMAGE_SIZE, IMAGE_SIZE, 3)) 10 11 #浮點並歸一化 12 image = image.astype('float32') 13 image /= 255 14 15 #給出輸入屬於各個類別的概率,我們是二值類別,則該函數會給出輸入圖像屬於0和1的概率各為多少 16 result = self.model.predict_proba(image) 17 print('result:', result) 18 19 #給出類別預測:0或者1 20 result = self.model.predict_classes(image) 21 22 #返回類別預測結果 23 return result[0]
這個函數是提供給外部模塊使用的,外部模塊用它來預測哪個是“我”,哪個不是“我”。代碼很簡單,注釋也很詳細,就不多解釋了。接下來我們新建一個python文件:face_predict_use_keras.py,然后為這個文件添加如下代碼:
1 #-*- coding: utf-8 -*- 2 3 import cv2 4 import sys 5 import gc 6 from face_train_use_keras import Model 7 8 if __name__ == '__main__': 9 if len(sys.argv) != 2: 10 print("Usage:%s camera_id\r\n" % (sys.argv[0])) 11 sys.exit(0) 12 13 #加載模型 14 model = Model() 15 model.load_model(file_path = './model/me.face.model.h5') 16 17 #框住人臉的矩形邊框顏色 18 color = (0, 255, 0) 19 20 #捕獲指定攝像頭的實時視頻流 21 cap = cv2.VideoCapture(int(sys.argv[1])) 22 23 #人臉識別分類器本地存儲路徑 24 cascade_path = "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt2.xml" 25 26 #循環檢測識別人臉 27 while True: 28 _, frame = cap.read() #讀取一幀視頻 29 30 #圖像灰化,降低計算復雜度 31 frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 32 33 #使用人臉識別分類器,讀入分類器 34 cascade = cv2.CascadeClassifier(cascade_path) 35 36 #利用分類器識別出哪個區域為人臉 37 faceRects = cascade.detectMultiScale(frame_gray, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32)) 38 if len(faceRects) > 0: 39 for faceRect in faceRects: 40 x, y, w, h = faceRect 41 42 #截取臉部圖像提交給模型識別這是誰 43 image = frame[y - 10: y + h + 10, x - 10: x + w + 10] 44 faceID = model.face_predict(image) 45 46 #如果是“我” 47 if faceID == 0: 48 cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness = 2) 49 50 #文字提示是誰 51 cv2.putText(frame,'Dady', 52 (x + 30, y + 30), #坐標 53 cv2.FONT_HERSHEY_SIMPLEX, #字體 54 1, #字號 55 (255,0,255), #顏色 56 2) #字的線寬 57 else: 58 pass 59 60 cv2.imshow("識別朕", frame) 61 62 #等待10毫秒看是否有按鍵輸入 63 k = cv2.waitKey(10) 64 #如果輸入q則退出循環 65 if k & 0xFF == ord('q'): 66 break 67 68 #釋放攝像頭並銷毀所有窗口 69 cap.release() 70 cv2.destroyAllWindows()
這個就是我們的最終程序,它能夠從USB拍攝的實時視頻流中找出哪一個是我,先看識別結果:

執行結果符合預期,值得慶賀。至此,本系列完結。
