人脸检测与面部识别

人脸检测很早就有了,以前的数码相机拍照的时候就能实时检测出人脸、笑脸。不过那时的检测会有一些要求,脸要摆正,最好不能带帽子,笑要露出牙齿会更容易检测到。现在随着深度学习技术的发展,人脸检测技术也有了巨大的变化。

下面这个视频演示的是较早的人脸检测技术,使用 OpenCV 级联分类器(Cascade Classifier)的人脸目标检测,OpenCV Object Detection。类似的特征检测技术也有 Dlib 目标检测,Dlib Object DetectorDlib face 68 landmarks。视频中,当脸完全出现在画面中时软件能检测到,而我用手挡住脸时软件就没法检测到。这里为了不露脸,当软件检测到人脸时是在对应位置贴了“钢铁侠”,而不是画个框。“嗨,我是钢铁侠”,当然这只是个玩笑。

机器视觉软件库完善支持深度神经网络后(DNN),人脸检测几乎突破了检测,计算量大但是效果也不一般。OpenPose(Real-time multi-person keypoint detection library)是使用深度学习技术做图像检测的开源项目之一,支持身体姿势、面部、手势的关键点检测识别,也有 Caffe 实现的神经网络模型。OpenCV DNN 模块可以使用 OpenPose 的模型做识别,官方的例子比较新(大概创建于 10 天前)目前没有面部关键点检测部分,可以参考 OpenPose 文档编写相关代码来使用这个功能。

接着上面挡住部分脸时的检测,下图是 OpenCV 使用 OpenPose 神经网络模型面部关键点检测的结果。每个点都有意义(官方文档),最多 70 个点连接起来就是一张特定的脸,图中这几个点是遮挡后检测出的一部分关键点。

图片,面部检测

也有用手遮挡和带眼镜的,如下 2 张都是视频截图(电脑硬件一般跑神经网络计算帧率低,用视频演示时间较长就截图了)。基于神经网络的人脸识别比起图像目标检测要智能很多,即便遮挡一部分也能检测出人脸。这些图中你会发现关键点输出结果有明星偏差,笔记本摄像头画质很差,而且检测时我对图像做了较大的缩放(硬件计算能力有限),检测结果自然达不到画面本身的精度。

视频,面部检测

视频,面部检测

从图像中检测到人脸并不困难,有遮挡仍然可以准确判断。判断 2 张人脸图像相似度来做面部身份验证也不难,能够支持数量不大情况下(如机场、公司)的身份验证应用。

然而从千万人脸图像中准确辨认出任意一个人的身份,调取他的身份信息,就不是那么容易。神经网络的人脸检测为面部识别提供了方案,可以将面部图像作为数据集来训练网络模型,做进一步的面部识别身份验证;或许也可以使用特征点设计算法描述每张人脸独一无二的特性,来搭建通用的面部身份信息数据库,或是在已有的身份数据库中添加高效的面部特征检索支持。

RoboCop(机械警察)2014,面部身份数据库

相关博文可点击 OpenCV 标签,以下是一些参考资料

OpenPose https://github.com/CMU-Perceptual-Computing-Lab/openpose
LFW Data Set http://vis-www.cs.umass.edu/lfw/
OpenCV https://opencv.org/
Dlib http://dlib.net/

最近更新 2018-05-06