Python-OpenCV训练一个人脸识别器
想要能人脸识别,我们需要训练一个识别器处理。训练的话就需要之前已经标注好的训练集,在前一篇文章中,我们创建了一个已经标注好的训练集。现在,是时候用这个训练集来训练一个人脸识别器了。当然,是用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':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训练一个人脸识别器相关推荐
- python识别人脸多种属性_OpenCV-Python(3)训练一个人脸识别器
想要能人脸识别,我们需要训练一个识别器处理.训练的话就需要之前已经标注好的训练集,在前一篇文章中,我们创建了一个已经标注好的训练集.现在,是时候用这个训练集来训练一个人脸识别器了.当然,是用OpenC ...
- Python+OpenCv实现AI人脸识别身份认证系统(3)——训练人脸识别模型
目录 案例引入 本节项目 最近有小伙伴们一直在催本项目的进度,好吧,今晚熬夜加班编写,在上一节中,实现了人脸数据的采集,在本节中将对采集的人脸数据进行训练,生成识别模型. 案例引入 首先简要讲解数据集 ...
- Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储
原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...
- Python+OpenCv实现AI人脸识别身份认证系统(1)——人脸识别原理
原 Python+OpenCv实现AI人脸识别身份认证系统(1)--人脸识别原理 置顶 2019年07月02日 08:47:40 不脱发的程序猿 阅读数 1255更多 所属专栏: 人脸识别身份认证系统 ...
- Python+OpenCV实现AI人脸识别身份认证系统(4)—人脸识别
本篇博文是Python+OpenCV实现AI人脸识别身份认证系统的收官之作,在人脸识别原理到数据采集.存储和训练识别模型基础上,实现人脸识别,废话少说,上效果图: 案例引入 在Python+OpenC ...
- python+opencv+dlib实现人脸检测与表情识别
python+opencv+dlib实现人脸检测与表情识别 一,dlib简单介绍:Dlib包含广泛的机器学习算法.所有的设计都是高度模块化的,快速执行,并且通过一个干净而现代的C ++ API,使用起 ...
- OpenCV中Fisherfaces人脸识别器识别人脸实战(附Python源码)
需要源码和图片请点赞关注收藏后评论区留言私信~~~ Fisherfaces是由Ronald Fisher最早提出的,这也是它名字的又来,它基于LDA线性判别分析技术,该方法将人脸数据转换到另外一个空间 ...
- OpenCV中LBPH人脸识别器识别人脸实战(附Python源码)
需要源码和图片请点赞关注收藏后评论区留言私信~~~ Local Binary Pattern Histofram简称LBPH,即局部二进制模式直方图,这是一种基于局部二进制模式算法,这种算法善于捕获局 ...
- 使用Python+OpenCV+dlib为人脸生成口罩
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...
- python人脸识别opencv_基于python+OpenCV模块的人脸识别定位技术
什么是OpenCV模块 OpenCV是一款跨平台的视觉库,可以支持的操作系统有Linux.Windows和Mac OS操作系统,并且还提供了多种语言的接口,比如Python,java,MATLAB等常 ...
最新文章
- 面试问我,创建多少个线程合适?我该怎么说
- 【已解决】GO语言开发中调用另一个库报错 cannot refer to unexported name XXXX
- Android开发架构规范
- 日志库EasyLogging++学习系列(5)—— 辅助配置功能
- java第六章工具包6.1P6-01.Collections 2020.4.3+7
- 搭建H1ve-ctfd以及如何部署题目
- 微型计算机引脚,微型计算机硬件基础8086引脚.doc
- Subversion Server For Windows安装指南
- hibernate select语句返回的类型
- easyui form 提交
- 01-移植AZPR SoC到Xilinx Aritix7 FPGA
- 阿里邮箱怎么开通pop3服务器,云邮箱如何在IPAD上设置POP3/IMAP协议?
- 闪字在线制作php源码,闪光字图片制作 在线制作图片加闪光字
- Ubuntu 18安装搜狗拼音
- 伽卡他卡使用教程_伽卡他卡电子教室安装使用和常见问题
- Dubbo系列之Provider Service注册和暴露(三)
- AI应用第一课:支付宝刷脸登录
- 如何快速提取视频中的文案?
- 如何将低像素的图片无损放大?
- active password changer v3.0
热门文章
- (转)HDOJ 4006 The kth great number(优先队列)
- jquery 页面自动滚动到顶部
- [如何构建自己的轮式移动机器人系统·从入门到放弃]机器人底层篇
- 利用 SendInput 和INPUT结构 模拟鼠标移动
- Jquery打造AdRotator轮转图片
- 使用 Request.Form 集合之后,不能调用 BinaryRead
- little w and Sum(思维)
- PHP执行系统外部命令函数:exec()、passthru()、system()、shell_exec()
- django中admin路由系统工作原理
- 使用kermit通过串口升级uboot