人脸检测和识别:人脸识别(Python)

上文提到人脸检测,本文关注人脸识别。
人脸检测是OpenCV的一个很不错的功能,是人脸识别的基础。

1. 生成人脸识别数据

确保样本图像满足一下条件:
+图像是灰度格式,后缀名为.pgm
+图像形状为正方形
+图像大小要一样
generate_train.py脚本如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
This program is debugged  by Harden Qiu.
You can send a e-mail to hardenqiu@foxmail.com for more details.
"""
import cv2

def generate():
    face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('./cascades/haarcascade_eye.xml')
    camera = cv2.VideoCapture(0)
    count = 0
    while (True):
        ret, frame = camera.read()
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        faces = face_cascade.detectMultiScale(gray, 1.3, 5)

        for (x, y, w, h) in faces:
            img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)

            f = cv2.resize(gray[y:y + h, x:x + w], (200, 200))

            cv2.imwrite('./data/sw/%s.pgm' % str(count), f)
            print(count)

            count += 1

        cv2.imshow("camera", frame)
        if cv2.waitKey(1) & 0xff == ord("q"):
            break

    camera.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    generate()

在执行本代码前注意按照程序中的路径创建文件夹,否则无法生成图片。
注意不同的人要单独创建文件夹。

2. 准备训练数据

将样本图像加载到人脸识别算法中,算法train()函数包括两个参数:图像数组和标签数组。需要创建一个基于逗号分隔符值(Comma-Separated Value, CSV)的文件,用来根据ID记录样本图像的路径。CSV_Write.py代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
This program is debugged  by Harden Qiu.
You can send a e-mail to hardenqiu@foxmail.com for more details.
"""
import os

path = "data"
dirnames = os.listdir(path)
strText = ""

with open("faces.csv", "w") as fid:
    for a in dirnames:
        filenames = os.listdir(path + os.sep + a)
        for b in range(len(filenames)):
            strText = path + os.sep + a + os.sep + filenames[b] + ";" + a + "\n"
            fid.write(strText)
fid.close()

例如,有小王(xw)和小李(xl)两组图片,运行程序后得到faces.csv,如下:
在这里插入图片描述
包括名字和标签。

3. 加载数据并识别人脸

将图像数组和CSV文件加载到人脸识别算法中,首先需要创建函数逐行读取CSV文件,并将对应路径的图像加载到图像数组中,将ID加载到标签数组中。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
This program is debugged  by Harden Qiu.
You can send a e-mail to hardenqiu@foxmail.com for more details.
"""
import os
#import sys
import cv2
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):
                filepath = os.path.join(subject_path, filename)
                im = cv2.imread(os.path.join(subject_path, filename), cv2.IMREAD_GRAYSCALE)
                im = cv2.resize(im, (20,20))
                X.append(np.asarray(im, dtype=np.uint8))
                y.append(c)
            print(c)
            c = c + 1
    return [X, y]

#人脸识别
def face_rec():
    names = ['xw', 'xl']
    path = "./data/"

    [X, y] = read_images(path)
    y = np.asarray(y, dtype=np.int32)

    model = cv2.face.LBPHFaceRecognizer_create()

    model.train(np.asarray(X), np.asarray(y))
    camera = cv2.VideoCapture(0)
    face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
    while (True):
        read, img = camera.read()
        faces = face_cascade.detectMultiScale(img, 1.2, 5)
        for (x, y, w, h) in faces:
            img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            roi = gray[x:x + w, y:y + h]

            roi = cv2.resize(roi, (200, 200), interpolation=cv2.INTER_LINEAR)
            print(roi.shape)
            params = model.predict(roi)
            print("Label: %s, Confidence: %.2f" % (params[0], params[1]))
            cv2.putText(img, names[params[0]], (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)


        cv2.imshow("camera", img)
        if cv2.waitKey(1) & 0xff == ord("q"):
            break
    cv2.destroyAllWindows()

if __name__ == "__main__":
    face_rec()

以上程序完成了基本的图像识别过程,但由于只是展示了一个完整的识别过程,在识别准确度上有待提高,可通过多种方法进行完善,本文不在赘述。程序用到的训练库可通过generate_train.py制作,也可以从网上下载pgm格式人脸数据库,或者留言询问。

声明

如有侵权,请邮件联系博主删除。
本文只做学习研究!
如有疑问,可留言反馈或通过邮件交流(hardenqiu@foxmail.com)。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值