(人脸识别2-7)——利用分类器识别本人

(小结)利用分类器识别本人

前面已经把分类器训练出来了,那么最后就是预测和识别本人了,由于以前是用本人的人脸图片做为训练集进行人脸训练的,因此对应的分类器固然是我本身的。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()

这里解释一下上一篇里面的一段代码算法

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

而后将处理好的图片传入分类器中进行预测,获取预测结果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部分

    • os对文件的处理
    • 对文件的批量处理
    • python编码能力

后续

后续阶段准备利用大量的人脸数据,利用adaboost算法进行本身训练出人脸分类器,也就是Opencv里面自带的cascade分类器,此次将不会用到神经网络,思路已经有了,等笔者实现整合后将会贴出。