人脸检测和识别的开源库总结
背景
人脸相关的任务有以下几种:
-
人脸检测(将图片中包含的人脸进行初步定位,以及关键点如眼睛、鼻子、嘴巴等更精细的定位,文章封面即为典型人脸检测结果);
-
人脸跟踪(视频中跟踪人脸位置变化);
-
人脸验证(输入两张人脸,判定是否属于同一人);
-
人脸识别(输入一张人脸,判断其属于人脸数据库全部记录中具体哪一人);
-
人脸聚类(输入一批人脸,将属于同一人的自动归为一类);
图像读取
有三种常用的读取图像的库,opencv、PIL和skimage,它们三个都有读取函数,都是读取图像,但是读进来通道不一样,其中PIL和skimage读进来的通道是RGB,而opencv读进来的是BGR。可以使用下面的函数进行转换:
#opencv读入的矩阵是BGR,如果想转为RGB,可以这么转
img4 = cv2.imread('1.jpg')
img4 = cv2.cvtColor(img4,cv2.COLOR_BGR2RGB)
dlib中使用的也是RGB格式的图片,如果用cv2读取的话,也需要使用前面的函数将图片转成dlib所要求的格式。
数据集
作为人脸识别全世界最权威的两个数据库FDDB(Face Detection Data Set and Benchmark)和LFW(Labeled Faces in the Wild Home),分别对人脸识别中最基本的两个问题:检测和识别,给出了详细的测试要求与评分标准。 介绍网址:https://zhuanlan.zhihu.com/p/23886731
开源库
opencv
opencv中使用haar特征+adaboost级联分类进行人脸检测,效果比较一般。
dlib
介绍
Dlib是一个跨平台的C++公共库,除了线程支持,网络支持,提供测试以及大量工具等等优点,Dlib还是一个强大的机器学习的C++库,包含了许多机器学习常用的算法。同时支持大量的数值算法如矩阵、大整数、随机数运算等等。
Dlib同时还包含了大量的图形模型算法,我们今天使用的是dlib的人脸检测和识别的算法。
dlib中提供的人脸检测方法(使用HOG特征或卷积神经网方法),并使用提供的深度残差网络(ResNet)实现实时人脸识别。
人脸检测
dlib人脸检测比较简单,首先获取人脸分类器:
detector = dlib.get_frontal_face_detector()
然后建立检测器
dets = detector(img, 1) #使用detector进行人脸检测 dets为返回的结果
for index, face in enumerate(dets):
# 人脸上下左右的坐标位置
left = face.left()
top = face.top()
right = face.right()
bottom = face.bottom()
人脸特征提取
dlib18能在VS2012和VS2013使用,dlib19就必须升级VS到2015以上。
人脸一般有68个标准位点。
dlib18提取出来68个特征点的坐标信息(x,y),在人脸上标注的情况如下图:
如果求两个人人脸特征的相似度的时候,就会遇见问题。如果我们用欧式距离来求相似度,发现偏差比较大,因为人脸稍微侧一下,就有可能导致距离增大,所以不能采用dlib18产生的坐标结果进行人脸比对。
dlib19产生的特征信息不再是坐标信息,而是特征值,所以利用欧式距离和余弦相似度能够很好的解决这个问题。
但是dlib19也是先产生68个特征的坐标,然后利用这68个坐标计算出128个特征值,我们就可以用这128个特征值去比对,检测出是否为同一个人。
face-recognition
dlib做人脸识别的时候需要先检测出人脸,然后提取出特征坐标,最后利用欧式距离来进行判断,过程有点复杂,face-recognition基于dlib,使得人脸识别更容易,而且也可以达到很好的效果。
使用说明
这篇文章详细介绍了该库怎么去做人脸检测和识别。
https://www.jianshu.com/p/4dd131567015
face-recognition里面的主要功能如下:
1.人脸框的坐标
import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_locations = face_recognition.face_locations(image)
2.人脸68维坐标
import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)
face_recognition.face_locations()检测出来的人脸的landmark,针对于9个人脸部位检测出坐标来,这9个部位分别为:
鼻子: nose_bridge nose_tip
下巴: chin
眼睛: left_eye right_eye left_eyebrow right_eyebrow
嘴巴: bottom_lip top_lip
3.比较人脸:
import face_recognition
known_image = face_recognition.load_image_file("biden.jpg")
unknown_image = face_recognition.load_image_file("unknown.jpg")
biden_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
results = face_recognition.compare_faces([biden_encoding], unknown_encoding)
4.人脸128维特征:
unknown_image = face_recognition.load_image_file("unknown.jpg")
biden_encoding = face_recognition.face_encodings(known_image)
facenet
facenet是基于tensorflow,所以在运行facenet程序时候,需要安装tensorflow。
1.下载源码:
git clone https://github.com/davidsandberg/facenet.git
2.下载训练好的模型
facenet提供了两个预训练模型,分别是基于CASIA-WebFace和MS-Celeb-1M人脸库训练的:
3.运行人脸对比的例子:
facenet可以直接比对两个人脸经过它的网络映射之后的欧氏距离,运行程序为facenet-master\src\compare.py
python compare.py 20170511-185253 1.jpg 2.jpg
结果: