基于opencv的人脸检测与识别(python语言)(1)
人脸检测和识别技术就目前而言,已经相对成熟,各类算法层出不穷,这都归功于各位奋斗在一线的大佬的努力(站在巨人的肩膀上的感觉就是爽)。本文是参考博客 https://www.cnblogs.com/neo-T/p/6477378.html 针对自己实际应用改写程序实现人脸检测与识别,并给出在实际操作过程中的一些问题说明,所以在一些程序注释上略显精简,读者可以参考这篇博客(注释详尽)对比学习。
另外为了让读者能够更快的上手程序,本文末尾也将整个项目百度云分享给大家(我这样的好人不多了!!),同时为了让初涉人脸识别的同学能够对这个方向有着一个整体了解,文末也提供了一篇文章综述的百度云(有英文注释哦!英语差的有福了!!)。
前期准备
环境
原文是在ubuntu环境下,本文则是在windows10环境下(主要差别在路径设置上),选择anaconda+python3.6+tensorflow1.9编写,读者可以根据自己平时喜好选择具体的IDE,jupyter Notebook,PyCharm也不错(虽然我更喜欢spyder)。至于tensorflow安装相关教程不是本文重点就不详说了(想要详说的网上搜哈有很多教程,唉,太多了!还有各种问题!算了看文末百度云链接吧)
原文用的是keras这个深度学习库,keras是纯python语言编写,继承了tensorflow和theano这样的深度学习框架。想学习的可以打开这个链接 https://keras-cn.readthedocs.io/en/latest/ (捡重要的看就行)。
具体安装跟一般python库安装一样的。
opencv作为最受欢迎的开源计算机视觉库,提供Python、Ruby、Matlab等语言的接口,实现图像处理和计算机视觉方面的很多通用算法,是初学者入门的一个重要且高效的工具。安装跟前keras安装流程相同具体见博客。opencvGithub链接:https://github.com/opencv/opencv 本文选择的级联分类器是haarcascade_frontalface_alt2.xml,大家可以在Github中下载下来在路径.\opencv-master\data\haarcascades中选择合适自己的分类器。
数据库
ORL人脸数据库是由英国剑桥大写AT&T实验室创建,包含40人工400张面部图像,每人有10幅经过归一化图像,图像尺寸为92*112,图像格式为pgm格式,是opencv例程中使用的数据集。下载链接:https://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html 也可以从文末百度云下载。数据集下载如下(文件s41是我添加的自己的图像数据,百度云的我删了的哈,大家根据自己需要添加数据):
项目详解
项目列表
- face_rec_project
- pycache
- data
- s1
- 1.pgm
- 2.pgm
- …
- 10.pgm
- s2
- …
- s41
- data.txt
- s1
- haarcascades
- model
- testdata
- 1
- catch_pic.py
- face_predict_test.py
- load_dataset.py
- train_with_keras.py
文件夹data存放数据集;haarcascades文件夹存放级联分类器;model文件夹存放训练好的模型;.\testdata\1文件夹存放摄像头获得的人脸作为加入的训练样本。
获取人脸
本文在ORL人脸数据集的基础上,通过摄像头直接获取人脸添加进ORL数据集中扩充该数据集。下面是具体程序介绍:
def catch_pict(classfier, path_name, catch_pic_num):
"""Recognizing and storing 1000 face pictures form camera"""
cv.namedWindow("face detect", cv.WINDOW_AUTOSIZE)
color = (0, 255, 0) # box color
cam = cv.VideoCapture(0)
num = 0
while cam.isOpened():
ret, img = cam.read()
if not ret:
break
img = cv.flip(img, 1) # reverse picture
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
gray = cv.equalizeHist(gray)
faceRects = classfier.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=4,
minSize=(30