介绍:
之前看了一篇在Ubuntu上写的人脸识别,自己在mac下试了一下,觉得有必要再扩展一下,通过一个简单的例子来了解一下人脸识别的过程。
准备知识:
-
欧几里得距离:是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。公式如图:
就是说两项间的差是每个变量值差的平方和再平方根,目的是计算其间的整体距离即不相似性,同样的,如果距离短则相似度高。 -
K-Means:属于硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小。算法采用误差平方和准则函数作为聚类准则函数。
安装依赖库:
备注:mac下没有apt-get,但是对应的可以用brew来安装,下面我们通过brew来安装库文件
1. 安装cmake (是一个跨平台的安装工具) : brew install cmake
2. 安装boost(C++的程序库):brew install boost-python --with-python2.7
3. 编译dlib:
a. git clone https://github.com/davisking/dlib.git
b. 进入dlib然后创建文件夹build并进入
c. 开始编译 :cmake .. -DDLIB_USE_CUDA=0 -DUSE_AVX_INSTRUCTIONS=1
d. cmake --build .
e. cd ..
f. python setup.py install --yes USE_AVX_INSTRUCTIONS --no DLIB_USE_CUDA
4. 安装人脸识别的python库:pip install face_recognition
人脸识别
使用face_recognition进行人脸识别,这里我们直接使用命令行执行,首先需要准备两个文件夹,一个是存放样本,一个是存放将要识别的图片。
如下图1 avimage这个文件夹中存放的是我们的样本三张图片,是一些小时候的女明星:
下面是result的文件夹,里面放着将要进行识别的图片
然后执行命令:第一个参数是样本文件夹,第二个参数是测试文件夹
face_recognition avimage/ results/
可以看出,识别出了仓老师和龙泽老师的图片.
人脸特征:
首先来列举一下人脸的主要特征有哪些:
1. chin 下巴
2. eyebrow 眉毛 (分左右眉毛)
3. nose bridge 鼻梁
4. nose tip 鼻尖
5. eye 眼睛 (分左右眼睛)
6. top lip 上嘴唇
7. bottom lip 下嘴唇
face_recognition包含提取人脸特征的方法,调用face_landmarks即可获取以上特征的信息,看一下代码:
from PIL import Image, ImageDraw
import face_recognition
#加载图片
image = face_recognition.load_image_file("TeacherCang.png")
#获取特征
face_landmarks_list = face_recognition.face_landmarks(image)
for face_landmarks in face_landmarks_list:
facial_features = [
'chin',
'left_eyebrow',
'right_eyebrow',
'nose_bridge',
'nose_tip',
'left_eye',
'right_eye',
'top_lip',
'bottom_lip'
]
#数组数据转化为图片
pil_image = Image.fromarray(image)
d = ImageDraw.Draw(pil_image)
#在图片上把识别出的特征用线画出来
for facial_feature in facial_features:
d.line(face_landmarks[facial_feature], width=5)
pil_image.show()
代码执行后的效果是:
人脸识别的步骤:
1 . 人脸边框检测:这一步是去发现输入图片中的人脸的位置,根据位置生成边框,最后输出一张只带有人脸的边框,如图:
2 . 效准图像:对于输入的原始图像 + 人脸的边框,这一步要做的事情就是要检测人脸中的关键点,然后根据这些关键点对人脸做对齐校准。所谓关键点,就是下图所示的绿色的点,通常是眼角的位置、鼻子的位置、脸的轮廓点等等。有了这些关键点后,我们就可以把人脸“校准”,或者说是“对齐”。解释就是原先人脸可能比较歪,这里根据关键点,使用仿射变换将人脸统一“摆正”,尽量去消除姿势不同带来的误差。这一步我们一般叫Face Alignment。
3 . 图像转向量:运用卷积神经网络,将输入的人脸图像,转换成一个向量的表示。下面通过一个非常基础的模型VGG16来了解一下:
在理想的状况下,我们希望“向量表示”之间的距离就可以直接反映人脸的相似度:
● 对于同一个人的人脸图像,对应的向量的欧几里得距离应该比较小。
● 对于不同人的人脸图像,对应的向量之间的欧几里得距离应该比较大。
4 . 向量对比:
根据人脸的向量可得:相同的人脸对应的向量的距离小,不同人脸对应的向量距离大的特点。检测A、B是否是属于同一个人。只需要计算向量之间的距离,设定合适的报警阈值(threshold)即可,或者给定一张图片,检测数据库中与之最相似的人脸,显然可以被转换为一个求距离的最近邻问题。
总结:
介绍了人脸识别库face_recognition在mac下的安装和使用,以及人脸识别的流程:人脸边框检测,效准图像,图像转向量,向量对比。