机器学习实战篇—人脸识别(Human Face Recognition)

原创
2017/12/27 20:44
阅读数 2.3K

介绍:

之前看了一篇在Ubuntu上写的人脸识别,自己在mac下试了一下,觉得有必要再扩展一下,通过一个简单的例子来了解一下人脸识别的过程。

准备知识:

  1. 欧几里得距离:是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。公式如图:

    就是说两项间的差是每个变量值差的平方和再平方根,目的是计算其间的整体距离即不相似性,同样的,如果距离短则相似度高。

  2. 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下的安装和使用,以及人脸识别的流程:人脸边框检测,效准图像,图像转向量,向量对比。

展开阅读全文
打赏
1
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
1
分享
返回顶部
顶部