人脸识别(opencv--LBPH方法训练)

一、准备数据
1.利用人脸检测方法,先将图像的人脸部分截取成图像
2.批量读取图像,制作成图像与标签对应的列表

二、开始训练
3.训练(使用opencv自带的训练方法)
4.调用

HOG人脸检测器

1.利用人脸检测方法,先将图像的人脸部分截取成图像
选用HOG的目的是为了方便而已,你完全可以使用别的方法。
代码文件名:SB1

# 人脸检测:
# 输入 一张图像
# 输出:零至多张人脸图像列表

import cv2
import dlib


def cv_show(neme, img):
    cv2.namedWindow(neme, cv2.WINDOW_NORMAL)
    cv2.imshow(neme, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


class d():
    def __init__(self):
        # 构造HOG人脸检测器
        self.hog_face_detetor = dlib.get_frontal_face_detector()

    def d1(self, img):
        # 检测人脸
        # scale 类似haar的scaleFactor
        detections = self.hog_face_detetor(img, 1)

        # 人脸图像列表
        img_list = []

        # 解析矩形结果
        for face in detections:
            # 根据测试 出现了一次 x是负值的情况,所以采用绝对值
            x = abs(face.left())
            y = abs(face.top())
            r = abs(face.right())
            b = abs(face.bottom())

            # 截取人脸
            img_crop = img[y:b, x:r]

            # 缩放解决冲突
            img_crop = cv2.resize(img_crop, (120, 120))

            # 绘制 人脸矩形框
            # cv2.rectangle(img, (x, y), (r, b), (0, 255, 0), 5)
            # 显示 绘制后的图像
            # cv_show('neme', img_crop)

            img_list.append(img_crop)

        return img_list


if __name__ == '__main__':
    # 读取图片
    img = cv2.imread('./images_1/Yamy/Yamy_0.jpg')
    p = d().d1(img)
    for i in p:
        print(i.shape)

批量读取图像

2.批量读取图像,制作成图像与标签对应的列表
这里是我自己手写的,没有考虑 时间复杂度与空间复杂度,你可以用其他现有的库的API,或者自己写个更好的。
文件目录结构:images_1文件夹下,存放n个文件夹,对应着n个类别,

代码文件名:SB2

# 批量读取数据
# 训练人脸识别

import os
import cv2

import SB1


def cv_show(neme, img):
    cv2.namedWindow(neme, cv2.WINDOW_NORMAL)
    cv2.imshow(neme, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


def r_path_name(path):
    list_img = os.listdir(path)

    # 人脸检测 创建
    p = SB1.d()

    # 人脸列表
    person = []
    # 标签列表
    lab = []

    # 标签号
    lab_n = 0

    for i in range(len(list_img)):
        list_img_name = os.listdir(path + list_img[i])

        lab_n += 1

        for j in list_img_name:
            path_n = path + list_img[i] + "/" + j

            # 读取图片
            img = cv2.imread(path_n)

            # 灰度化 训练要求使用单通道图像:
            # 转为灰度图
            img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

            # cv_show('neme', img)

            # 人脸检测
            img_ = p.d1(img)

            if len(img_) != 0:
                for img in img_:
                    # 放入人脸列表
                    person.append(img)
                    # 放入标签列表
                    lab.append(lab_n)

    # print(person)
    # print(lab)
    #
    # print(len(lab))
    # print(len(person))

    return person, lab


if __name__ == '__main__':
    path = "./images_1/"
    img, lab = r_path_name(path)
    print(len(img))
    print(len(lab))

训练

读取的图像目录名:images_1
保存模型路径与名称:./weights/LBPH1.yml
代码文件名:SB3

import cv2
import numpy as np

import SB2

# 构造分类器
face_cls = cv2.face.LBPHFaceRecognizer_create()
# cv2.face.EigenFaceRecognizer_create()
# cv2.face.FisherFaceRecognizer_create()

path = "./images_1/"
img_list, label_list = SB2.r_path_name(path)

# 训练 图像列表、标签列表、
face_cls.train(img_list, np.array(label_list))

# 保存模型
face_cls.save('./weights/LBPH1.yml')

调用

读取训练好的模型,进行加载,预测

# 进行人脸识别
import cv2

import SB1

img = cv2.imread('./images_1/Angelababy/a1.jpg')
# 转为灰度图
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 调用模型
new_cls = cv2.face.LBPHFaceRecognizer_create()
new_cls.read('./weights/LBPH1.yml')

# 人脸检测
img_list = SB1.d().d1(img)

if len(img_list) != 0:
    for i in img_list:
        # 预测
        predict_id, distance = new_cls.predict(img)
        # 类别
        print(predict_id)
        # 置信度 低于50最优 高于80很差
        print(distance)

# 基于LBPH的人脸识别操作原理
#
# 1、LBPH(Local Binary Pattern Histogram)将检测到的人脸分为小单元,并将其与模型中的对应单元进行比较,对每个区域的匹配值产生一个直方图。
#
# 由于这种方法的灵活性,LBPH 是唯一允许模型样本人脸和检测到的人脸在形状、大小上可以不同的人脸识别算法。
#
# 2、调整后的区域中调用 predict()函数
#
# predict()函数返回两个元素的数组:第一个元素是所识别 个体的标签,第二个是置信度评分。
#
# 3、所有的算法都有一个置信度评分阈值,置信度评分用来衡量所识别人脸与原模型的差距,0 表示完全匹配。可能有时不想保留所有的识别结果,则需要进一步处理,因此可用自己的算法来估算识别的置信度评分。
#
# 4、LBPH一个好的识别参考值要低于 50 ,任何高于 80 的参考值都会被认为是低的置信度评分。

你可能感兴趣的:(计算机视觉项目,opencv,计算机视觉,python)