人脸检测和识别的开源库总结

背景

人脸相关的任务有以下几种:

  • 人脸检测(将图片中包含的人脸进行初步定位,以及关键点如眼睛、鼻子、嘴巴等更精细的定位,文章封面即为典型人脸检测结果);

  • 人脸跟踪(视频中跟踪人脸位置变化);

  • 人脸验证(输入两张人脸,判定是否属于同一人);

  • 人脸识别(输入一张人脸,判断其属于人脸数据库全部记录中具体哪一人);

  • 人脸聚类(输入一批人脸,将属于同一人的自动归为一类);

图像读取

有三种常用的读取图像的库,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

结果:

 

 

展开阅读全文

没有更多推荐了,返回首页