学习来源:https://www.cnblogs.com/neo-T/p/6511273.html
是为Model类增加一个预测函数:
# 识别人脸
def face_predict(self, image):
# 依然是根据后端系统确定维度顺序
if K.image_dim_ordering() == 'th' and image.shape != (1, 3, IMAGE_SIZE, IMAGE_SIZE):
# 尺寸必须与训练集一致都应该是IMAGE_SIZE x IMAGE_SIZE
#原博主的写了个调整图片形状的函数,我删了,直接用了cv2.resize
image = cv2.resize(image, (IMAGE_SIZE, IMAGE_SIZE), interpolation=cv2.INTER_CUBIC)
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 = cv2.resize(image, (IMAGE_SIZE, IMAGE_SIZE), interpolation=cv2.INTER_CUBIC)
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:', result)
# 给出类别预测:0或者1
result = self.model.predict_classes(image)
# 返回类别预测结果
return result[0]
这个函数是提供给外部模块使用的,外部模块用它来预测哪个是“我”,哪个不是“我”。代码很简单,注释也很详细,就不多解释了。接下来我们新建一个python文件:face_predict_use_keras.py,然后为这个文件添加如下代码:
# -*- coding: utf-8 -*-
import cv2
import sys
from face_train_use_keras import Model
CarmeraId = 0
if __name__ == '__main__':
#if len(sys.argv) != 2:
# print("Usage:%s camera_id\r\n" % (sys.argv[0]))
# sys.exit(0)
# 加载模型
model = Model()
model.load_model(file_path='./model/pm.face.model.h5')
# 框住人脸的矩形边框颜色
color = (0, 255, 0)
# 捕获指定摄像头的实时视频流
cap = cv2.VideoCapture(CarmeraId)
# 人脸识别分类器本地存储路径
cascade_path = "D:\\pycharm\\MyWorks\\MyFace\\XML\\haarcascade_frontalface_default.xml"
# 循环检测识别人脸
while True:
_, frame = cap.read() # 读取一帧视频
# 图像灰化,降低计算复杂度
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 使用人脸识别分类器,读入分类器
cascade = cv2.CascadeClassifier(cascade_path)
# 利用分类器识别出哪个区域为人脸
faceRects = cascade.detectMultiScale(frame_gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(faceRects) > 0:
for faceRect in faceRects:
x, y, w, h = faceRect
# 截取脸部图像提交给模型识别这是谁
image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
faceID = model.face_predict(image)
# 如果是“我”
if faceID == 0:
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness=2)
# 文字提示是谁
cv2.putText(frame, 'PM',
(x + 30, y + 30), # 坐标
cv2.FONT_HERSHEY_SIMPLEX, # 字体
1, # 字号
(255, 0, 0), # 颜色
2) # 字的线宽
else:
pass
cv2.imshow("FindMe", frame)
# 等待10毫秒看是否有按键输入
k = cv2.waitKey(10)
# 如果输入q则退出循环
if k & 0xFF == ord('q'):
break
# 释放摄像头并销毁所有窗口
cap.release()
cv2.destroyAllWindows()