首先声明这是识别(recognition) 而不是检测(detection),也就是对给定的人脸图片进行身份识别。
一直以来我主观地认为 SURF 等算法并不适用于人脸识别,直到最近看到相关的文献(Philippe Dreuw 等人: SURF-Face: Face Recognition Under Viewpoint Consistency Constraints)中提出了基于 SURF 的人脸识别方案,其识别率在某些情况下甚至超过了传统的 LBP 算法。
SURF 的实现可参考我的上一个帖子:http://tieba.baidu.com/p/2514079408
这份代码基本上是对上述文献的一次实践,过程如下:
生成脸部特征数据库:
对给定的一系列图片进行特征提取,这里使用乔治亚理工学院提供的人脸数据库,这个数据库提供了 50 人的共 750 张脸部照片。选择其中的40张正面照片,对这些照片进行插值至 280 * 400 像素,然后进行特征提取,将提取的特征点的坐标及其64维特征向量、身份标识储存到数据库,这里使用 Redis 数据库进行储存。身份直接使用照片文件名进行标识。
这 40 个人的剩余 600 张图像用作命中测试,剩下的 10 人的 150 张照片用来做无命中测试。
识别过程:
将给定的图片缩放至 280 * 400 像素,计算 SURF 并进行特征点匹配,然后通过 LMedS 算法剔除异常匹配(上述文献中使用 RANSAC 算法)。
PS: Redis 服务器在 FreeBSD 9.1 上运行, 客户端在 OS X 上运行,使用 hiredis 连接 Redis(代码在 github 的 redis/hiredis 上)。主要是贪方便。。
PS2: 人脸检测直接忽略,太多这方面的文献了。。 现在的流行做法是用 haar 分类器和决策树实现,写起来比较简单但是训练太麻烦了。。。 这次我直接使用乔治亚理工学院提供的数据库中的 cropped_faces 代替,这些都是提取完成的人脸图像。
PS3: 代码写得匆忙,质量比较差,仅仅是测试用意。。囧
一直以来我主观地认为 SURF 等算法并不适用于人脸识别,直到最近看到相关的文献(Philippe Dreuw 等人: SURF-Face: Face Recognition Under Viewpoint Consistency Constraints)中提出了基于 SURF 的人脸识别方案,其识别率在某些情况下甚至超过了传统的 LBP 算法。
SURF 的实现可参考我的上一个帖子:http://tieba.baidu.com/p/2514079408
这份代码基本上是对上述文献的一次实践,过程如下:
生成脸部特征数据库:
对给定的一系列图片进行特征提取,这里使用乔治亚理工学院提供的人脸数据库,这个数据库提供了 50 人的共 750 张脸部照片。选择其中的40张正面照片,对这些照片进行插值至 280 * 400 像素,然后进行特征提取,将提取的特征点的坐标及其64维特征向量、身份标识储存到数据库,这里使用 Redis 数据库进行储存。身份直接使用照片文件名进行标识。
这 40 个人的剩余 600 张图像用作命中测试,剩下的 10 人的 150 张照片用来做无命中测试。
识别过程:
将给定的图片缩放至 280 * 400 像素,计算 SURF 并进行特征点匹配,然后通过 LMedS 算法剔除异常匹配(上述文献中使用 RANSAC 算法)。
PS: Redis 服务器在 FreeBSD 9.1 上运行, 客户端在 OS X 上运行,使用 hiredis 连接 Redis(代码在 github 的 redis/hiredis 上)。主要是贪方便。。
PS2: 人脸检测直接忽略,太多这方面的文献了。。 现在的流行做法是用 haar 分类器和决策树实现,写起来比较简单但是训练太麻烦了。。。 这次我直接使用乔治亚理工学院提供的数据库中的 cropped_faces 代替,这些都是提取完成的人脸图像。
PS3: 代码写得匆忙,质量比较差,仅仅是测试用意。。囧