目录
人脸检测和人脸识别
级联分类器
分析人脸位置
检测其他内容
眼睛检测
猫脸检测
人脸识别
Eigenfaces 人脸识别器
Fisherfaces 人脸识别器
Local Binary Pattern Histogram 人脸识别器
小结
人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术,也是计算机视觉重点发展的技术。机器学习算法诞生之后,计算机可以通过摄像头等输入设备自动分析图像中包含的内容信息,随着技术的不断发展,现在已经有了多种人脸识别的算法。本章将介绍 OpenCV 自带的多种图像跟踪技术和 3 种人脸识别技术的用法。
将一系列简单的分类器按照一定顺序级联到一起就构成了级联分类器,使用级联分类器的程序可以通过一系列简单的判断来对样本进行识别。例如,依次满足「有 6 条腿」「有翅膀」「有头、胸、腹」这 3 个条件的样本就可以被初步判断为昆虫,但如果任何一个条件不满足,则不会被认为是昆虫。
不同版本的 OpenCV 自带的级联分类器 XML 文件可能会有差别,data 文件夹中缺少的 XML 文件可以到 OpenCV 的源码托管平台下载,地址为:https://github.com/opencv/opencv/tree/master/data/haarcascades。
每一个 XML 文件都对应一种级联分类器,但有些级联分类器的功能是类似的(正面人脸识别分类器就有 3 个),表 15.1 是部分 XML 文件对应的功能,
OpenCV 实现人脸检测需要做两步操作:加载级联分类器和使用分类器识别图像。这两步操作都有对应的方法。
首先是加载级联分类器,OpenCV 通过 CascadeClassifier()方法创建了分类器对象,其语法如下:
objects = cascade.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)
haarcascade_frontalface_default.xml 是检测正面人脸的级联分类器文件,加载该文件就可以创建出追踪正面人脸的分类器,调用分类器对象的 detectMultiScale()方法,得到的 objects 结果就是分析得出的人脸区域的坐标、宽和高。下面通过一个实例介绍如何实现此功能。
import cv2
image=cv2.imread('whuim/img.png')
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
faceCascade=cv2.CascadeClassifier('cascade/haarcascade_frontalface_alt.xml')
faces=faceCascade.detectMultiScale(image)
for(x,y,w,h) in faces:
cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),5)
cv2.imshow('img',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV 提供的级联分类器除了可以识别人脸以外,还可以识别一些其他具有明显特征的物体,如眼睛、行人等。本节将介绍几个 OpenCV 自带的级联分类器的用法。
haarcascade_eye.xml 是检测眼睛的级联分类器文件,加载该文件就可以追踪眼睛的分类器,下面通过一个实例来介绍如何实现此功能。
haarcascade_eye.xml 文件放到项目根目录下的 cascades 文件夹中,加载此级联分类器之后,检测出所有可能是眼睛的区域,通过 for 循环在这些区域上绘制红色边框,具体代码如下
import cv2
image=cv2.imread('whuim/img.png')
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
eyecascade=cv2.CascadeClassifier('C:/Users/whuim/PycharmProjects/pythonProject5/opencv/cascade\\haarcascade_eye.xml')
eyes=eyecascade.detectMultiScale(gray)
for(x,y,w,h) in eyes:
cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),5)
cv2.imshow('img',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV 还提供了 2 个训练好的检测猫脸的级联分类器,分别是 haarcascade_frontalcatface.xml 和 haarcascade_frontalcatface_extended.xml,前者的判断标准比较高,较为精确,但可能有些猫脸识别不出来;后者的判断标准比较低,只要类似猫脸就会被认为是猫脸。使用猫脸分类器不仅可以判断猫脸的位置,还可以识别图像中有几只猫。
import cv2
image=cv2.imread('dog/img_2.png')
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
eyecascade=cv2.CascadeClassifier('C:\\Users\\whuim\\PycharmProjects\\pythonProject5\\opencv\\cascade\\haarcascade_frontalcatface_extended.xml')
eyes=eyecascade.detectMultiScale(gray)
for(x,y,w,h) in eyes:
cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),5)
cv2.imshow('img',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
以上本应还有行人检测 车牌检测 但由于代码极其类似,就不一一展示了
OpenCV 提供了 3 种人脸识别方法,分别是 Eigenfaces、Fisherfaces 和 LBPH。这 3 种方法都是通过对比样本的特征最终实现人脸识别。因为这 3 种算法提取特征的方式不一样,侧重点不同,所以不能分出孰优孰劣,只能说每种方法都有各自的识别风格。
OpenCV 为每一种人脸识别方法都提供了创建识别器、训练识别器和识别 3 种方法,这 3 种方法的语法非常相似。本节将简单介绍如何使用这些方法。
Eigenfaces 也叫作「特征脸」。Eigenfaces 通过 PCA(主成分分析)方法将人脸数据转换到另外一个空间维度做相似性计算。在计算过程中,算法可以忽略一些无关紧要的数据,仅识别一些具有代表性的特征数据,最后根据这些特征识别人脸。
开发者需要通过以下 3 种方法完成人脸识别操作。
(1)通过 cv2.face.EigenFaceRecognizer_create()方法创建 Eigenfaces 人脸识别器,其语法如下:
recognizer = cv2.face.EigenFaceRecognizer_create(num_components, threshold)
训练识别器后可以通过识别器的 predict()方法识别人脸,该方法对比样本的特征,给出最相近的结果和评分,其语法如下:
label, confidence = recognizer.predict(src)
import cv2
import numpy as np
photolist=list()
lables=list()
photolist.append(cv2.imread('whuim/whuim1.jpg',0))
lables.append(0)
photolist.append(cv2.imread('whuim/whuim2.jpg',0))
lables.append(0)
photolist.append(cv2.imread('whuim/whuim3.jpg',0))
lables.append(0)
recongizer=cv2.face.EigenFaceRecognizer_create()
recongizer.train(photolist,np.array(lables))
i=cv2.imread('whuim/whuim4.jpg')
lable,confidence=recongizer.predict(i)
print(confidence)
Fisherfaces 是由 Ronald Fisher 最早提出的,这也是 Fisherfaces 名字的由来。Fisherfaces 通过 LDA(线性判别分析技术)方法将人脸数据转换到另外一个空间维度做投影计算,最后根据不同人脸数据的投影距离判断其相似度。
开发者需要通过以下 3 种方法完成人脸识别操作。
(1)通过 cv2.face.FisherFaceRecognizer_create()方法创建 Fisherfaces 人脸识别器,其语法如下:
recognizer = cv2.face.FisherFaceRecognizer_create(num_components, threshold)
recognizer.train(src, labels)
Local Binary Pattern Histogram 简称 LBPH,即局部二进制模式直方图,这是一种基于局部二进制模式算法,这种算法善于捕获局部纹理特征。
开发者需要通过以下 3 种方法来完成人脸识别操作。
(1)通过 cv2.face. LBPHFaceRecognizer_create()方法创建 LBPH 人脸识别器,其语法如下:
recognizer = cv2.face.LBPHFaceRecognizer_create(radius, neighbors, grid_x, grid
小结
人脸检测和人脸识别是相辅相成的,这是因为在进行人脸识别前,要先判断当前图像内是否出现了人脸,这个判断过程需要由人脸检测完成。只有在当前图像内检测到人脸,才能判断出这张人脸属于哪个人,这个判断是由人脸识别器完成的。因此,人脸识别指的是程序先在图像内检测人脸,再识别这张人脸属于哪个人的过程。本章讲解了 3 种人脸识别器,读者要熟练掌握这 3 种人脸识别器的实现方法和实现原理。