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

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

前面已经把分类器训练出来了,那么最后就是预测和识别本人了,因为之前是用本人的人脸图片作为训练集进行人脸训练的,所以对应的分类器当然是我自己的。

下面将说一下怎么调用分类器进行人脸的识别
先上代码(这段代码看过前面的人应该非常熟悉):

#-*- 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分类器,这次将不会用到神经网络,思路已经有了,等笔者实现整合后将会贴出。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
人脸识别分类检索系统快捷特制版是利用人脸识别技术对照片中的人脸进行识别,把同一个人不同时间地点的照片提取归类。照片按人脸进行分类,实现了人脸入库,分类检索,免费版可设置500张照片。每秒比对人脸6万张。实现了百万级数据库分秒检索完成。正脸情况下可以达到97%以上的成功率。2.0新增了子目录文件批量读取,批量模板比对功能.实现大批量照片入库比对一键完成.大大方便了使用.本版本为快捷特制版,主要针对有大量图片需要批处理的需求。 本工作室致力于人工智成算法的产品化工作(有意向投资者请联系) qq: 605341429 或加群人脸识别照片分类检索 618055321 邮箱:[email protected] 使用方法: 一、 选择待分类图片目录(就是要分类的照片所在目录。本软件自动识别子目录,所以你只要把照片或照片文件夹放到一个目录中即可,不用管是不是有子目录) 二、 选择分类后照片存放的目录。只需选择目录。软件会动建每个人的分类目录。 三、 选择要分类的模板照片所在目录(就是要找那些人)。这里要注意一下。模板图片的文件名中不能含有以下这些字符。因为创建分类目录时会以模板文件名作为名称创建分类文件夹。 # % & * | \ : " ? / 前导或后缀空格(“”) Windows 或 DOS 保留的名称(“nul”、“aux”、“con”、“com1”、“lpt1”等)。 重要提示:由于打包时少了几个DLL文件,可能会出现运行不了的情况。又不能重新上传, 下载完整版本请联系 qq: 605341429 或加群人脸识别照片分类检索 618055321 也可以下载人脸识别分类检索系统1.0或2.0找到相应的dll拷入本软件安装目录即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值