注意注意:如果你想要扩展支持人脸识别功能,那么在安装OpenCV时候,需要安装contrib模块
PHPOpenCV使用FaceRecognizer类做人脸识别,所以你可以开始尝试人脸识别吧。本章将教你如何做基本的人脸识别。
目前可用的算法是:
- Eigenfaces (see EigenFaceRecognizer::create)
- Fisherfaces (see FisherFaceRecognizer::create)
- Local Binary Patterns Histograms (see LBPHFaceRecognizer::create)
人脸库Face Database
我们先获取一些数据来进行实验吧。我不想在这里做一个幼稚的例子。我们在研究人脸识别,所以我们需要一个真的人脸图像!
你可以自己创建自己的数据集,也可以从这里http://face-rec.org/databases下载一个。
- AT&TFacedatabase又称ORL人脸数据库,
- 40个人,每人10张照片。照片在不同时间、不同光照、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集。
- 所有的图像都在一个黑暗均匀的背景下采集的,正面竖直人脸(有些有有轻微旋转)。
- YaleFacedatabase A ORL数据库对于初始化测试比较适合,
- 但它是一个简单的数据库,特征脸已经可以达到97%的识别率,所以你使用其他方法很难得到更好的提升。
- Yale人脸数据库是一个对于初始实验更好的数据库,因为识别问题更复杂。
- 这个数据库包括15个人(14个男人,1个女人),每一个都有11个灰度图像,大小是320*243像素。数据库中有光照变化(中心光照、左侧光照、右侧光照)、表情变化(开心、正常、悲伤、瞌睡、惊讶、眨眼)、眼镜(戴眼镜或者没戴)。
- ExtendedYale Facedatabase B
- 此数据库包含38个人的2414张图片,并且是剪裁好的。这个数据库重点是测试特征提取是否对光照变化强健,因为图像的表情、遮挡等都没变化。
- 我认为这个数据库太大,不适合这篇文章的实验,我建议使用ORL数据库。
数据准备
准备基本的数据图像
这里我们采用AT&TFacedatabase数据集,又称ORL。
下载它并解压,可以看到一下结构:
可以看到每个人一个文件夹,每个文件夹下是这个人的十张照片,但是不是我们熟悉的BMP或者是PNG或者是JPEG格式的,而是PGM格式的。
准备自己的图像数据
准备好基本的人脸数据库后,我们不是要识别数据库的人脸,我们要做识别我们自己。既然这样,我们还需要准备自己的人俩图像
首先我们先写一个程序调用电脑摄像头进行对自己的头像拍摄
use CV\VideoCapture; |
保存为photograph.php
,并直接用cli模式运行,然后让我们对着摄像头拍10张照片,这里我们只需要10张就足够了。
- 按“
p
”进行拍照 - 按“
s
”退出程序
对自己人脸图像预处理
在得到自己的人脸照片之后,还需要对这些照片进行一些预处理才能拿去训练模型。所谓预处理,其实就是检测并分割出人脸,并改变人脸的大小与下载的数据集中图片大小一致。
人脸检测在之前已经做了介绍。详情参考:级联分类器。用ROI分割即可。
检测出人脸之后改变大小使之与ORL人脸数据库人脸大小一致。
通过加断点在Locals里面或者是ImageWatch可以看到ORL人脸数据库人脸的大小是92 x 112。
这里只需要对检测后得到的ROI做一次resize即可。
预处理代码
use CV\CascadeClassifier; |
处理后结果
整合数据
整合自己的图像集到人脸数据目录
至此,我们就得到和ORL人脸数据库人脸大小一致的自己的人脸数据集。然后我们把自己的作为第41个人,
在我们下载的人脸文件夹下建立一个s41的子文件夹,把自己的人脸数据放进去。
就成了这样下面这样,最后一个文件夹里面是我自己的头像照片:
生成csv文件
function searchDir($path, &$data) |
保存为generateCSV.php
并运行,会生成一个at.txt文件
人脸识别模型训练与识别
代码
use CV\Mat; |