zoukankan      html  css  js  c++  java
  • 人脸检测及识别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
    " % (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拍摄的实时视频流中找出哪一个是我,先看识别结果:

    执行结果符合预期,值得庆贺。至此,本系列完结。

  • 相关阅读:
    C#之泛型
    etcd 使用: golang 例子
    九卷读书:《高效能人士的7个习惯》脑图
    Go package(2) strings 用法
    技术管理:技术管理者的多维度能力及成长路径
    gin框架教程:代码系列demo地址
    五大常见的MySQL高可用方案
    gin框架教程三:JWT的使用
    九卷读书:商业模式画布
    Go package(1) time 用法
  • 原文地址:https://www.cnblogs.com/neo-T/p/6511273.html
Copyright © 2011-2022 走看看