python實現人臉檢測及識別(3)---- 識別真正的boss
阿新 • • 發佈:2018-11-10
現在模型訓練已經完成,只需要一個預測函式判斷拍攝的照片是否是boss即可,在boss_train.py裡的Model新增predeict實現函式。
def predict(self, image): # 依然是根據後端系統確定維度順序 if K.image_dim_ordering() == 'th' and image.shape != (1, 3, IMAGE_SIZE, IMAGE_SIZE): image = resize_with_pad(image) #尺寸必須與訓練集一致都應該是IMAGE_SIZE x IMAGE_SIZE image = image.reshape((1, 3, IMAGE_SIZE, IMAGE_SIZE)) #與模型訓練不同,這次只是針對1張圖片進行預測 elif K.image_dim_ordering() == 'tf' and image.shape != (1, IMAGE_SIZE, IMAGE_SIZE, 3): image = resize_with_pad(image) image = image.reshape((1, IMAGE_SIZE, IMAGE_SIZE, 3)) # 浮點並歸一化 image = image.astype('float32') image /= 255 # 給出輸入屬於各個類別的概率,我們是二值類別,則該函式會給出輸入影象屬於0和1的概率各為多少 result = self.model.predict_proba(image) print(result) # 給出類別預測:0或者1 result = self.model.predict_classes(image) # 返回類別預測結果 return result[0]
以下是最終的實現程式碼:
# -*- coding:utf-8 -*- import cv2 from boss_train import Model from image_show import show_image if __name__ == '__main__': cap = cv2.VideoCapture(0) # 人臉識別分類器本地儲存路徑 cascade_path = "haarcascade_frontalface_default.xml" #載入模型 model = Model() model.load() while True: _, frame = cap.read() cv2.imshow("識別朕", frame) ##影象灰化,降低計算複雜度 frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 使用人臉識別分類器,讀入分類器 cascade = cv2.CascadeClassifier(cascade_path) # 利用分類器識別出哪個區域為人臉 facerect = cascade.detectMultiScale(frame_gray, scaleFactor=1.2, minNeighbors=3, minSize=(8, 8)) if len(facerect) > 0: print('face detected') color = (255, 255, 255) # 白 for rect in facerect: # 擷取臉部影象提交給模型識別這是誰 cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), color, thickness=2) x, y = rect[0:2] width, height = rect[2:4] image = frame[y - 10: y + height, x: x + width] result = model.predict(image) if result == 0: # boss print('Boss is approaching') #cv2.imshow("識別朕", frame) show_image() else: print('Not boss') #10msec的帶燈時間 k = cv2.waitKey(10) #Esc退出 if k == 27: break # 釋放攝像頭並銷燬所有視窗 cap.release() cv2.destroyAllWindows()
當我走進攝像頭的視野,電腦桌面跳出預備的照片,測試顯示結果不錯。
注意:增加自身訓練資料集可提高對boss識別精度,增加其他人的訓練資料量,可減少誤判。