人臉檢測及識別python實現系列(6)——終篇:從實時視頻流識別出“我”


人臉檢測及識別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拍攝的實時視頻流中找出哪一個是我,先看識別結果:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM