资讯专栏INFORMATION COLUMN

Python-OpenCV训练一个人脸识别器

付永刚 / 2252人阅读

摘要:想要能人脸识别,我们需要训练一个识别器处理。现在,是时候用这个训练集来训练一个人脸识别器了。同目录下,创建一个文件夹,名为,用于存放我们训练后的识别器。训练差不多完成了,现在我们调用一下这个函数,然后将我们的数据喂给识别器去训练吧。

想要能人脸识别,我们需要训练一个识别器处理。训练的话就需要之前已经标注好的训练集,在前一篇文章中,我们创建了一个已经标注好的训练集。现在,是时候用这个训练集来训练一个人脸识别器了。当然,是用OpenCV Python。

准备

首先,我们在(前一篇文章的)同目录下创建一个叫Python文件,名为trainner.py,用于编写数据集生成脚本。同目录下,创建一个文件夹,名为trainner,用于存放我们训练后的识别器。

现在,项目目录大概如此:

其他乱七八糟的文件、目录,都是之前的文章中创建的。

在开始之前,我们先安装一个Python库,Pillow:

pip install pillow
开始Coding 导入库

编写训练程序需要先做是:

导入opencv库

导入os库,用于方法文件

导入numpy库,用于计算

导入pillow库,用于处理图像

其实就是这样:

import cv2
import os
import numpy as np
from PIL import Image

现在我们初始化识别器和人脸检测器:

recognizer = cv2.face.LBPHFaceRecognizer_create()
# 有可能是 recognizer = cv2.createLBPHFaceRecognizer()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

如果face.LBPHFaceRecognizer_create或createLBPHFaceRecognizer显示不存在,则需要下载opencv-contrib-python:

pip install opencv-contrib-python

当然用IDE的也行:

载入训练数据

恩,现在我们来创建一个函数,用于从数据集文件夹中获取训练图片,然后从图片的文件名中获取到这个素材相应的id。需要remind的是,根据前文,图片的格式是User.id.samplenumber

给函数起个名字,就叫get_images_and_labels吧(Python不建议用驼峰),然后参数需要有素材的文件夹:

def get_images_and_labels(path):

在函数中,我们需要的做的有:

从数据集文件夹中载入训练图片

获取到人脸和id

整理成list并返回

获取图片:

image_paths=[os.path.join(path, f) for f in os.listdir(path)]

新建两个list用于存放:

face_samples=[]
ids=[]

遍历图片路径,导入图片和id,添加到list:

    for image_path in image_paths:
        image = Image.open(image_path).convert("L")
        image_np = np.array(image, "uint8")
        image_id = int(os.path.split(image_path)[-1].split(".")[1])
        faces = detector.detectMultiScale(image_np)
        for (x, y, w, h) in faces:
            face_samples.append(image_np[y:y + h, x:x + w])
            ids.append(image_id)

以上代码,使用了Image.open(image_path).convert(‘L’)通过图片路径并将其转换为灰度图片。

接下来我们通过image_np = np.array(image, "uint8")将图片转换成了Numpy数组,Numpy数组的逻辑结构和普通的数组无异,但是是经过优化的。

为了获取到id,我们将图片的路径分裂一下并获取相关信息,即image_id = int(os.path.split(image_path)[-1].split(".")[1])

接下来的一个循环for (x, y, w, h) in faces则是将图片和id都添加在list中。

再return一下即可。

训练

差不多完成了,现在我们调用一下这个函数,然后将我们的数据喂给识别器去训练吧。

faces, Ids = get_images_and_labels("dataSet")
recognizer.train(faces, np.array(Ids))
recognizer.save("trainner/trainner.yml")

现在只要我们运行这些代码,程序就会在trainner文件夹中创建一个trainner.yml文件。

这个yml文件,存着我们的训练好的数据,以后识别会用到的。

完整代码
import cv2
import os
import numpy as np
from PIL import Image

# recognizer = cv2.createLBPHFaceRecognizer()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
recognizer = cv2.face.LBPHFaceRecognizer_create()


def get_images_and_labels(path):
    image_paths = [os.path.join(path, f) for f in os.listdir(path)]
    face_samples = []
    ids = []

    for image_path in image_paths:
        image = Image.open(image_path).convert("L")
        image_np = np.array(image, "uint8")
        if os.path.split(image_path)[-1].split(".")[-1] != "jpg":
            continue
        image_id = int(os.path.split(image_path)[-1].split(".")[1])
        faces = detector.detectMultiScale(image_np)
        for (x, y, w, h) in faces:
            face_samples.append(image_np[y:y + h, x:x + w])
            ids.append(image_id)

    return face_samples, ids


faces, Ids = get_images_and_labels("dataSet")
recognizer.train(faces, np.array(Ids))
recognizer.save("trainner/trainner.yml")

先这样吧

原文,若有错误之处请指出,更多地关注煎鱼。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41758.html

相关文章

  • Python-OpenCV人脸识别之数据集生成

    摘要:我们把要做的事分成三部分创建数据集训练识别在本文中,我们会尝试写一个程序来生成数据集。生成数据集我们来写一个数据集生成脚本。为了不会将不同的人脸照片弄混,我们需要定一个命名规则,用于给照片命名。 在上一篇文章中,我们学习了如何安装配置OpenCV和Python,然后写了些代码玩玩人脸检测。现在我们要进行下一步了,即搞一个人脸识别程序,就是不只是检测还需要识别到人是谁。 来,搞人脸识别 ...

    ivyzhang 评论0 收藏0
  • Python-OpenCV进行人脸识别

    摘要:在之前的文章中,我们学习了使用数据集训练出一个识别器。现在,我们将使用这个训练好的文件去识别人脸了。我们把程序改成释放资源记得释放资源测试然后在测试阶段,这个人工智障完美地识别不出我。 在之前的文章中,我们学习了使用数据集训练出一个识别器。本文中,我们将载入这个识别器,然后来看见怎么识别人脸。 如果看过之前的文章,你就已经准备好了一个识别器,它就在trainner文件夹和trainne...

    Pines_Cheng 评论0 收藏0
  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0
  • 警察必备工具!用空间融合卷积神经网络鉴别伪装的「坏蛋」

    摘要:剑桥大学印度国家技术学院近日联合发布了一篇论文,名为利用空间融合卷积神经网络通过面部关键点进行伪装人脸识别,该论文利用空间融合卷积神经网络为刑侦过程的人脸识别提供了有力的支持,我们来一窥究竟。 剑桥大学、印度国家技术学院近日联合发布了一篇论文,名为《利用空间融合卷积神经网络通过面部关键点进行伪装人脸识别Disguised Face Identification (DFI) with Faci...

    anyway 评论0 收藏0
  • 多伦多大学反人脸识别,身份欺骗成功率达99.5%

    摘要:现在,人脸识别的克星反人脸识别问世了。多伦多大学教授和研究生的团队开发了一种算法,可以动态地破坏人脸识别系统。因此,成功的攻击需要同时欺骗所有对象方案。算法对抗生成器训练给定人脸检测置信度的对抗成功率。 论文地址:https://joeybose.github.io/assets/adversarial-attacks-face.pdf在一些社交媒体平台,每次你上传照片或视频时,它的人脸识别...

    TalkingData 评论0 收藏0

发表评论

0条评论

付永刚

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<