正文
一点区分
对于大部分人来说,区分人脸检测和人脸识别完全不是问题。但是网上有很多教程有意无意地把人脸检测说成是人脸识别,误导群众,造成一些人认为二者是相同的。
其实,人脸检测解决的问题是确定一张图上有木有人脸,而人脸识别解决的问题是这个脸是谁的。可以说人脸检测是是人识别的前期工作。
今天我们要做的是人脸识别。
所用工具
Anaconda 2 —— Python 2
Dlib
scikit-image
Dlib
对于今天要用到的主要工具,还是有必要多说几句的。Dlib 是基于现代 C++ 的一个跨平台通用的框架,作者非常勤奋,一直在保持更新。
Dlib 内容涵盖机器学习、图像处理、数值算法、数据压缩等等,涉猎甚广。更重要的是,Dlib 的文档非常完善,例子非常丰富。就像很多库一样,Dlib 也提供了 Python 的接口,安装非常简单,用 pip 只需要一句即可:
pip install dlib
上面需要用到的 scikit-image 同样只是需要这么一句:
pip install scikit-image
注:如果用 pip install dlib 安装失败的话,那安装起来就比较麻烦了。错误提示很详细,按照错误提示一步步走就行了。
人脸识别
之所以用 Dlib 来实现人脸识别,是因为它已经替我们做好了绝大部分的工作,我们只需要去调用就行了。Dlib 里面有人脸检测器,有训练好的人脸关键点检测器,也有训练好的人脸识别模型。
今天我们主要目的是实现,而不是深究原理。例子既然代码不超过 40 行,其实是没啥难度的。
首先先通过文件树看一下今天需要用到的代码:
准备了六个候选人的图片放在 candidate-faces 文件夹中,然后需要识别的人脸图片 test.jpg 。我们的工作就是要检测到 test.jpg 中的人脸,然后判断她到底是候选人中的谁。
另外的 girl-face-rec.py 是我们的 python 脚本。
shape_predictor_68_face_landmarks.dat 是已经训练好的人脸关键点检测器。
dlib_face_recognition_resnet_model_v1.dat 是训练好的 ResNet 人脸识别模型。
ResNet 是何凯明在微软的时候提出的深度残差网络,获得了 ImageNet 2015 冠军,通过让网络对残差进行学习,在深度和精度上做到了比 CNN 更加强大。
前期准备
shape_predictor_68_face_landmarks.dat dlib_face_recognition_resnet_model_v1.dat 都可以在这里找到。