前面已经把分类器训练出来了,那么最后就是预测和识别本人了,由于以前是用本人的人脸图片做为训练集进行人脸训练的,因此对应的分类器固然是我本身的。python
下面将说一下怎么调用分类器进行人脸的识别
先上代码(这段代码看过前面的人应该很是熟悉):web
#-*- coding:utf-8 -*-
import cv2#由于仍是须要用到opencv里面的一些函数
from trainByKeras import Model#这个文件为上一篇的文件代码,须要引入里面的一个Model对人脸进行预测
CAMERA_ID=0#默认摄像头id为0
if __name__ == '__main__':
model=Model()
model.load_model(file_path='./face.model.h5')#加载分类器
color = (0,255,0)#框的颜色
cap=cv2.VideoCapture(CAMERA_ID)#打开摄像头,读取视频流
cassade_path='/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt2.xml'#opencv人脸分类器路径,分类器路径能够修改
while True:
ok,frame=cap.read()
frame_grey=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#灰度化
cassade=cv2.CascadeClassifier(cassade_path)#加载分类器
faceRects=cassade.detectMultiScale(frame_grey,scaleFactor=1.2,minNeighbors=3,minSize=(32,32))#利用opencv获取视频frame里面的全部人脸
if len(faceRects)>0:
for faceRect in faceRects:#遍历每一个人脸
x,y,w,h=faceRect#获取人脸的框的大小
image=frame[y:y+h,x:x+w]#从视频一帧中截取只有人脸的一个片断
faceId=model.face_predict(image)#调用函数进行预测
if faceId==0:#id=0表示为本人,其余不是本人
cv2.rectangle(frame,(x,y),(x+w,y+h),color,2)#画框
cv2.putText(frame,'your grace',
(x+30,y+30),
cv2.FONT_HERSHEY_SIMPLEX,
1,
(255,0,255),
2)#文字框,表示已经识别了本人
else:
# cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
#
# cv2.putText(frame, '',
# (x + 30, y + 30),
# cv2.FONT_HERSHEY_SIMPLEX,
# 1,
# (255, 0, 255),
# 2)
pass#不然跳过
cv2.imshow('识别朕',frame)
k=cv2.waitKey(10)
if k& 0xFF==ord('q'):
break
cap.release()#释放资源
cv2.destroyAllWindows()
这里解释一下上一篇里面的一段代码算法
#识别人脸
def face_predict(self, image):
#依然是根据后端系统肯定维度顺序
if K.image_dim_ordering() == 'th' and image.shape != (1, 3, IMAGE_SIZE, IMAGE_SIZE):
image = resize_image(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_image(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:', result)
#给出类别预测:0或者1
result = self.model.predict_classes(image)
#返回类别预测结果
return result[0]
这段代码不须要添加进去,由于代码已经在上一篇的代码里面有了
这段代码看了上一篇的人应该很熟悉,由于后端利用了tensorflow进行神经网络的训练和模型的搭建,因此后端
K.image_dim_ordering()=='th'
th表示为theno,tf表示为tensorflow,分别对应的图片传入的格式不同网络
if K.image_dim_ordering()=='th'and image.shape!=(1,3,IMAGE_SIZE,IMAGE_SIZE):
elif K.image_dim_ordering()=='tf' and image.shape!=(1,3,IMAGE_SIZE,IMAGE_SIZE):
还须要对image进行大小和归一化处理,框架
image=resize_image(image) image=image.reshape(1,3,IMAGE_SIZE,IMAGE_SIZE)
image=image.astype('float32')
image/=255
而后将处理好的图片传入分类器中进行预测,获取预测结果ide
result=self.model.predict_proba(image)
print ('result',result)
result=self.model.predict_classes(image)
return result[0]
预测结果输出以下:
svg
这即是model里面的代码,和上一篇搭建网络时候相似,判断图片的格式和后台处理框架,而后将图片格式化处理。最后进行预测。这只是一个模块。函数
注释里面已经解释很清楚,思路:学习
打开摄像头,读取视频流,对每一帧进行处理,每一帧都利用opencv截取出含有人脸的全部片断,而后将全部人脸传入模块进行识别判断,因为以前用labels=0表示本人训练出来的分类器,全部当id=0时即为识别成功,识别成功须要在一帧中进行标注,除了用框外,外加一个文字框进行突出表示。
关于识别人脸已经实现,并且在笔者看来效果还不错,由于毕竟正负样本用了总共2000张进行神经网络的训练。
因此整个系列暂告一段落,相关的代码都已经贴出来了,并且不是很难。主要的搭建神经网络的部分较难,这个能够先不用管,只当一个接口进行调用便可,笔者也还在琢磨搭建神经网络模块部分。感兴趣的能够去tensorflow官网进行学习相关内容
整个部分学到的东西仍是不少的:
对opencv的一些基本操做
卷积神经网络
python部分
后续阶段准备利用大量的人脸数据,利用adaboost算法进行本身训练出人脸分类器,也就是Opencv里面自带的cascade分类器,此次将不会用到神经网络,思路已经有了,等笔者实现整合后将会贴出。