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

准备

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

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

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

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

pip install pillow

开始Coding

导入库

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

  1. 导入opencv库
  2. 导入os库,用于方法文件
  3. 导入numpy库,用于计算
  4. 导入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):

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

  1. 从数据集文件夹中载入训练图片
  2. 获取到人脸和id
  3. 整理成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':continueimage_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, idsfaces, Ids = get_images_and_labels('dataSet')
recognizer.train(faces, np.array(Ids))
recognizer.save('trainner/trainner.yml')

先这样吧

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

Python-OpenCV训练一个人脸识别器相关推荐

  1. python识别人脸多种属性_OpenCV-Python(3)训练一个人脸识别器

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

  2. Python+OpenCv实现AI人脸识别身份认证系统(3)——训练人脸识别模型

    目录 案例引入 本节项目 最近有小伙伴们一直在催本项目的进度,好吧,今晚熬夜加班编写,在上一节中,实现了人脸数据的采集,在本节中将对采集的人脸数据进行训练,生成识别模型. 案例引入 首先简要讲解数据集 ...

  3. Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储

    原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...

  4. Python+OpenCv实现AI人脸识别身份认证系统(1)——人脸识别原理

    原 Python+OpenCv实现AI人脸识别身份认证系统(1)--人脸识别原理 置顶 2019年07月02日 08:47:40 不脱发的程序猿 阅读数 1255更多 所属专栏: 人脸识别身份认证系统 ...

  5. Python+OpenCV实现AI人脸识别身份认证系统(4)—人脸识别

    本篇博文是Python+OpenCV实现AI人脸识别身份认证系统的收官之作,在人脸识别原理到数据采集.存储和训练识别模型基础上,实现人脸识别,废话少说,上效果图: 案例引入 在Python+OpenC ...

  6. python+opencv+dlib实现人脸检测与表情识别

    python+opencv+dlib实现人脸检测与表情识别 一,dlib简单介绍:Dlib包含广泛的机器学习算法.所有的设计都是高度模块化的,快速执行,并且通过一个干净而现代的C ++ API,使用起 ...

  7. OpenCV中Fisherfaces人脸识别器识别人脸实战(附Python源码)

    需要源码和图片请点赞关注收藏后评论区留言私信~~~ Fisherfaces是由Ronald Fisher最早提出的,这也是它名字的又来,它基于LDA线性判别分析技术,该方法将人脸数据转换到另外一个空间 ...

  8. OpenCV中LBPH人脸识别器识别人脸实战(附Python源码)

    需要源码和图片请点赞关注收藏后评论区留言私信~~~ Local Binary Pattern Histofram简称LBPH,即局部二进制模式直方图,这是一种基于局部二进制模式算法,这种算法善于捕获局 ...

  9. 使用Python+OpenCV+dlib为人脸生成口罩

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...

  10. python人脸识别opencv_基于python+OpenCV模块的人脸识别定位技术

    什么是OpenCV模块 OpenCV是一款跨平台的视觉库,可以支持的操作系统有Linux.Windows和Mac OS操作系统,并且还提供了多种语言的接口,比如Python,java,MATLAB等常 ...

最新文章

  1. 面试问我,创建多少个线程合适?我该怎么说
  2. 【已解决】GO语言开发中调用另一个库报错 cannot refer to unexported name XXXX
  3. Android开发架构规范
  4. 日志库EasyLogging++学习系列(5)—— 辅助配置功能
  5. java第六章工具包6.1P6-01.Collections 2020.4.3+7
  6. 搭建H1ve-ctfd以及如何部署题目
  7. 微型计算机引脚,微型计算机硬件基础8086引脚.doc
  8. Subversion Server For Windows安装指南
  9. hibernate select语句返回的类型
  10. easyui form 提交
  11. 01-移植AZPR SoC到Xilinx Aritix7 FPGA
  12. 阿里邮箱怎么开通pop3服务器,云邮箱如何在IPAD上设置POP3/IMAP协议?
  13. 闪字在线制作php源码,闪光字图片制作 在线制作图片加闪光字
  14. Ubuntu 18安装搜狗拼音
  15. 伽卡他卡使用教程_伽卡他卡电子教室安装使用和常见问题
  16. Dubbo系列之Provider Service注册和暴露(三)
  17. AI应用第一课:支付宝刷脸登录
  18. 如何快速提取视频中的文案?
  19. 如何将低像素的图片无损放大?
  20. active password changer v3.0

热门文章

  1. (转)HDOJ 4006 The kth great number(优先队列)
  2. jquery 页面自动滚动到顶部
  3. [如何构建自己的轮式移动机器人系统·从入门到放弃]机器人底层篇
  4. 利用 SendInput 和INPUT结构 模拟鼠标移动
  5. Jquery打造AdRotator轮转图片
  6. 使用 Request.Form 集合之后,不能调用 BinaryRead
  7. little w and Sum(思维)
  8. PHP执行系统外部命令函数:exec()、passthru()、system()、shell_exec()
  9. django中admin路由系统工作原理
  10. 使用kermit通过串口升级uboot