欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

opencv实现人脸识别(三) 训练图片模块

程序员文章站 2022-08-03 18:47:00
现在我们已经拍好了需要训练的图片,接下来就是进行训练 流程图: 我们在这里用到了numpy库,NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。 使用numpy的目的是减少python代码中的循环,以及提高数组运算的效率。 对于numpy性能的提升程度,我们可以从这段代码中直观感 ......

现在我们已经拍好了需要训练的图片,接下来就是进行训练

流程图:

opencv实现人脸识别(三) 训练图片模块

我们在这里用到了numpy库,numpy是一个功能强大的python库,主要用于对多维数组执行计算。

使用numpy的目的是减少python代码中的循环,以及提高数组运算的效率。

对于numpy性能的提升程度,我们可以从这段代码中直观感受到:

import datetime as dt
import numpy as np

n = 100000
start = dt.datetime.now()
a, b = [], []
for i in range(n):
    a.append(i ** 2)
    b.append(i ** 3)
c = []
for a,b in zip(a,b):
    c.append(a+b)

t = (dt.datetime.now() -start).microseconds
print(t)
start = dt.datetime.now()
a, b = np.arange(n)**2, np.arange(n)**3
c = a+b
t = (dt.datetime.now() - start).microseconds
print(t)

我们对列表进行了同样的操作,然后输出两种操作所需要的时间(微秒),可以看到numpy在效率上提高了两个数量级

opencv实现人脸识别(三) 训练图片模块

 

训练模块的源代码:

import numpy as np
from pil import image
import os
import cv2


def train():
    path = 'd:/facedata'

    # 创建opencv中的lbph算法的人脸识别器
    recognizer = cv2.face.lbphfacerecognizer_create()

    # 依然是运用人脸识别分类器
    detector = cv2.cascadeclassifier('./haarcascade_frontalface_default.xml')

    def getimagesandlabels(path):
        # os.path.join()函数:
        # 连接两个或更多的路径名组件
        # os.listdir() 方法
        # 用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序排列
        imagepaths = [os.path.join(path, f)for f in os.listdir(path)]

        facesamples = []
        ids = []

        # 遍历每一张拍到的图片
        for imagepath in imagepaths:
            # 打开图片,并转换成灰度图
            pil_img = image.open(imagepath).convert('l')

            # 将原图片的多维数组转为numpy的数组
            img_numpy = np.array(pil_img, 'uint8')

            # id对应的值是当前用户的第几张照片
            id = int(os.path.split(imagepath)[-1].split('.')[1])

            # 检测人脸
            faces = detector.detectmultiscale(img_numpy)
            for(x, y, w, h) in faces:
                # 将人脸范围的numpy数组数据保存到列表中
                facesamples.append(img_numpy[y : y + h, x : x + w])
                # 将id值保存到列表中
                ids.append(id)
            return facesamples, ids

    faces, ids = getimagesandlabels(path)

    # 对图片进行训练,将训练文件保存在指定路径
    recognizer.train(faces, np.array(ids))
    recognizer.write(r'face_trainer\trainer.yml')
    print('{0} faces trained.'.format(len(np.unique(ids))))

if __name__ == '__main__':
    train()