机器人之OpenCV-Python(3)训练一个人脸识别器
小标 2018-10-17 来源 : 阅读 3799 评论 0

摘要:本文主要向大家介绍了机器人之OpenCV-Python(3)训练一个人脸识别器,通过具体的内容向大家展现,希望对大家学习机器人有所帮助。

本文主要向大家介绍了机器人之OpenCV-Python(3)训练一个人脸识别器,通过具体的内容向大家展现,希望对大家学习机器人有所帮助。


想要能人脸识别,我们需要训练一个识别器处理。训练的话就需要之前已经标注好的训练集,在前一篇文章中,我们创建了一个已经标注好的训练集。现在,是时候用这个训练集来训练一个人脸识别器了。当然,是用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')


先这样吧


       

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标人工智能智能机器人频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 1
看完这篇文章有何感觉?已经有2人表态,50%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved