(小结)利用分类器识别本人
前面已经把分类器训练出来了,那么最后就是预测和识别本人了,因为之前是用本人的人脸图片作为训练集进行人脸训练的,所以对应的分类器当然是我自己的。
下面将说一下怎么调用分类器进行人脸的识别
先上代码(这段代码看过前面的人应该非常熟悉):
#-*- 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()
这里解释一下上一篇里面的一段代码
Model模块
#识别人脸
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
然后将处理好的图片传入分类器中进行预测,获取预测结果
result=self.model.predict_proba(image)
print ('result',result)
result=self.model.predict_classes(image)
return result[0]
预测结果输出如下:
这便是model里面的代码,和上一篇搭建网络时候类似,判断图片的格式和后台处理框架,然后将图片格式化处理。最后进行预测。这只是一个模块。
主函数
注释里面已经解释很清楚,思路:
打开摄像头,读取视频流,对每一帧进行处理,每一帧都利用opencv截取出含有人脸的所有片段,然后将所有人脸传入模块进行识别判断,由于之前用labels=0表示本人训练出来的分类器,所有当id=0时即为识别成功,识别成功需要在一帧中进行标注,除了用框外,外加一个文字框进行突出表示。
总结
关于识别人脸已经实现,而且在笔者看来效果还不错,因为毕竟正负样本用了总共2000张进行神经网络的训练。
所以整个系列暂告一段落,相关的代码都已经贴出来了,而且不是很难。主要的搭建神经网络的部分较难,这个可以先不用管,只当一个接口进行调用即可,笔者也还在琢磨搭建神经网络模块部分。感兴趣的可以去tensorflow官网进行学习相关内容
整个部分学到的东西还是很多的:
对opencv的一些基本操作
- 打开摄像头
- 调用内置分类器
- 画出人脸框,文字框
卷积神经网络
- 概念和公式
- 如何搭建神经网络框架
python部分
- os对文件的处理
- 对文件的批量处理
- python编码能力
后续
后续阶段准备利用大量的人脸数据,利用adaboost算法进行自己训练出人脸分类器,也就是Opencv里面自带的cascade分类器,这次将不会用到神经网络,思路已经有了,等笔者实现整合后将会贴出。