python_opencv人脸目标实时分类

原创链接(转载请注明出处):
https://blog.csdn.net/qq_44091004/article/details/105836083


接于上一篇博客:python_opencv人脸实时目标检测(制作人脸数据集)
链接:https://blog.csdn.net/qq_44091004/article/details/105787196

开发环境

python3.6.2
pycharm
opencv3.x

数据集格式

为了方便后面的数据遍历制作样本和标签,最好按照文中的格式进行制作。
通过我们上一篇博文的工作,我们完成了实时人脸目标检测。内容包括以下几项:
1.实现人脸目标
2.将检测过后的人脸统一大小尺寸
3.保存到指定文件夹,并编号
——————————————————————————
接下来的工作才是今天的内容哦。
首先找一个盘,新建一个文件夹。这里我的是在E://facedata
在指定文件夹下建立样本文件夹,每个样本(每个人)文件夹放入一定数量的样本数并编号,这部分可以通过手动,也可以通过编写函数实现:如图
在这里插入图片描述

创建两个列表,遍历样本文件夹,容纳样本及对应标签

定义一个函数:功能是遍历样本文件夹,用两个列表分别接纳样本和分类标签。分类标签可以采用数字编码也可以采用one-hot编码。我的类别数比较少,所以这里采用了数字编码。
在给出代码之前,需要简单讲解一个函数,一个简单易用的文件、目录遍历器;可以帮我们高效的处理文件、目录方面的事情。
os.walk()介绍
walk(top, topdown=True, οnerrοr=None,followlinks=False)
params:参数介绍

top: 需要遍历的第一级目录
topdown: 默认为True,表示优先遍历top目录,然后在遍历子目录;如果为Flase,反之即可 
onerror: 默认为None, 表示忽略文件夹遍历时的错误.如果不为None,遍历文件出现异常时,可以调用此回调函数进行处理
followlinks: 选填, 如果为True,则会遍历目录下的快捷方式实际所指的文件;

如果为Flase,优先遍历top的子目录

reult:返回一个生成器,需要通过遍历的方式拿到具体内容

parent:top的路径
dirnames:top路径下的文件夹的名字
filenames:top路径下文件夹以外的其他文件

注意区别:os.listdir只能返回一级目录下二级目录的所有文件和文件夹

import cv2 as cv
#遍历样本文件夹
def read_images(path):
	#用来制作标签的计数器
    c = 0
    #创建两个list分别接纳你的样本和标签,注意需要一一对应
    X,y = [], []
    #文件,目录遍历器,这里只用到了函数的返回结果的前两个,filenames没有用到
    for dirname, dirnames, filenames in os.walk(path):
        #遍历给定目录下的子文件夹,由于上面制作的文件夹非常整齐干净,这里的遍历就非常的简单,节省了很多的弯绕
        for subdirname in dirnames:
        	#将子文件夹路径加到到给定目录中
            subject_path = os.path.join(dirname, subdirname)
            #遍历子文件夹下的样本,这里的os.listdir(subject_path)上面有提到,就不赘述了
            for filename in os.listdir(subject_path):
            	#读取样本,并灰度化
                im = cv.imread(os.path.join(subject_path, filename), cv.COLOR_BGR2GRAY)
                #将样本加入到list中 
                X.append(im)
                #将标签加入到list中
                y.append(c)
            #没遍历完一个样本文件夹中的样本,就加一,因为每一个样本文件夹中的样本属于一类
            c = c + 1
    #返回样本和标签,用到的时候,调用函数用[X,y]接收就可以了
    return [X,y]

训练、实时人脸目标检测识别

实时目标检测识别:打开摄像头,拍摄,会出现人脸,有一个矩形框框住脸部,并在上方显示你的名字。
def face_rec():
    #为你的样本设置实际名称,对应于你的标签
    name = ['feng', 'xiao']
    [X,y] = read_images('E://facedata')
    y = np.asarray(y, dtype=np.int32)
    #创建一个人脸分类器
    model = cv.face.LBPHFaceRecognizer_create()
    #训练你的数据
    model.train(X,np.array(y))
    #创建一个摄像头
    camera = cv.VideoCapture(0)
    #创建一个haar级联人脸目标检测器
    face_cascade = cv.CascadeClassifier('C://opencv33//opencv//sources//data//haarcascades//haarcascade_frontalface_default.xml')
    while (True):
    	#读取帧,read是个布尔值,表示是否成功读取帧,img是帧本身
        read, img = camera.read()
        #人脸目标检测
        faces = face_cascade.detectMultiScale(img, 1.3, 5)
        for(x, y, w, h) in faces:
            img = cv.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
            gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
            roi = gray[x:x+w, y:y+h]
            try:
            	#采用插值法,改变尺寸
                roi = cv.resize(roi, (200, 200), interpolation=cv.INTER_LINEAR)
                #模型预测
                params = model.predict(roi)
                #打印标签和置信度评分
                print('Label: %s, Confidence: %.2f'%(params[0], params[1]))
                #在人脸检测框上打印出人脸对应的名字,实现人脸识别功能
                cv.putText(img, name[params[0]], (x, y-20), cv.FONT_HERSHEY_SIMPLEX, 1, 255, 2)
            except:
                continue
        cv.imshow('camera', img)
        if cv.waitKey(1) == 27:
            break
    camera.release()
    cv.destroyAllWindows()

下面放上全部代码:
import cv2 as cv
import os
import numpy as np

def read_images(path):
    c = 0
    X,y = [], []
    for dirname, dirnames, filenames in os.walk(path):
        for subdirname in dirnames:
            subject_path = os.path.join(dirname, subdirname)
            for filename in os.listdir(subject_path):
                im = cv.imread(os.path.join(subject_path, filename), cv.COLOR_BGR2GRAY)
                X.append(im)
                y.append(c)
            c = c + 1
    return [X,y]

def face_rec():
    name = ['feng', 'xiao']
    [X,y] = read_images('E://facedata')
    y = np.asarray(y, dtype=np.int32)
    model = cv.face.LBPHFaceRecognizer_create()
    model.train(X,np.array(y))
    camera = cv.VideoCapture(0)
    face_cascade = cv.CascadeClassifier('C://opencv33//opencv//sources//data//haarcascades//haarcascade_frontalface_default.xml')
    while (True):
        read, img = camera.read()
        faces = face_cascade.detectMultiScale(img, 1.3, 5)
        for(x, y, w, h) in faces:
            img = cv.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
            gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
            roi = gray[x:x+w, y:y+h]
            try:
                roi = cv.resize(roi, (200, 200), interpolation=cv.INTER_LINEAR)
                params = model.predict(roi)
                print('Label: %s, Confidence: %.2f'%(params[0], params[1]))
                cv.putText(img, name[params[0]], (x, y-20), cv.FONT_HERSHEY_SIMPLEX, 1, 255, 2)
            except:
                continue
        cv.imshow('camera', img)
        if cv.waitKey(1) == 27:
            break
    camera.release()
    cv.destroyAllWindows()

face_rec()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

资料加载中

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值