好玩的人脸识别face_recognition安装+尝试+API详细

face_recognition是一个可玩度很高的人脸识别开源框架,不仅安装方便,运行起来也很轻松。
官网:https://github.com/ageitgey/face_recognition.git

以下我将按标题分享以下我的畅玩经历:

1、安装

  • cuda和cudnn

机器视觉必备,这个不过多赘述。

  • anaconda2或3

anaconda在官网即可下载:https://www.anaconda.com/download/
分别自带python2.7和3.6版本。在此我用的是2.7版本
在某些博客会提及python3.6下Dlib无障碍编译,貌似是python35 36的版本不匹配原因。我尝试了下,不论27 36都无障碍编译成功了。因此我认为Dlib编译出问题与否很大可能跟你机器的python配置纯不纯有关系。

  • 编译Dlib

前提需要boost和cmake环境,如果有配置过caffe就不用重复了。
github:https://github.com/davisking/dlib
下载如图
好玩的人脸识别face_recognition安装+尝试+API详细_第1张图片
解压后在cmd中运行

python setup.py install

cuda编译需要很长时间,大概30分钟,要耐心等待。

  • 安装face_recognition

在cmd直接pip install!

pip install face_recognition

提示安装完成后就可以开玩啦!

  • opencv

opencv是可选选项,安装后能够提高可玩性

点我直接下载opencv3.4.1

安装完成后,将opencv下的.\build\python\2.7\x64的cv2.pyd文件放置到.\Anaconda2\Lib\site-packages文件夹下
注:此处仅有python2.7的提供,其余版本参考百度
其余配置参考https://blog.csdn.net/weixin_39393712/article/details/79583274

2、人脸识别尝试

先上代码:

# coding:utf-8
import face_recognition

#输入已知图片biden.jpg
known_image = face_recognition.load_image_file("biden.jpg")
#输入待识别的图片unknown.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)
#输出的results是一串Boolean值
print results

好玩的人脸识别face_recognition安装+尝试+API详细_第2张图片

若想要识别其余的人,自己动手编写python文件就好了,如此轻松,岂不美哉?
其余还有挺多功能的,可在官网查看

3、API详细

https://face-recognition.readthedocs.io/en/latest/face_recognition.html
看不懂?没关系,下面我来一一介绍

1、人脸定位——locations

face_locations(img, number_of_times_to_upsample=1, model="hog")

利用CNN深度学习模型或方向梯度直方图(Histogram of Oriented Gradient, HOG)进行人脸提取。返回值是一个数组(top, right, bottom, left)表示人脸所在边框的四条边的位置。
成员变量:

  • img:图片名
  • number_of_times_to_upsample=1:数值越大识别的人脸越小,耗时也越长
  • model=”hog”:使用的人脸检测模型

此外,人脸定位的方法还有:

_raw_face_locations(img, number_of_times_to_upsample=1, model="hog")
_raw_face_locations_batched(images, number_of_times_to_upsample=1, batch_size=128)
batch_face_locations(images, number_of_times_to_upsample=1, batch_size=128)

读者有兴趣可自行尝试,不一一赘述。

2、人脸解码——encodings
人脸识别的前菜。输入一张图片后,生成一个128维的特征向量,这是 人脸识别的依据。

face_encodings(face_image, known_face_locations=None, num_jitters=1)

成员变量:

  • face_image:图片名
  • known_face_locations=None:这个是默认值,默认解码图片中的每一个人脸。若输入face_locations()[i]可指定人脸进行解码。
  • num_jitters=1:池化操作。数值越高,精度越高,但耗时越长。

3、人脸比对——compare
人脸识别的核心,设置一个阈值,若两张人脸的特征向量的距离,在阈值范围之内,则认为其是同一个人,最后返回一个Boolean值的list。

compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6)

成员变量:

  • known_face_encodings:人脸解码方法中返回的特征向量,此处是已知人脸的特征向量。
  • face_encoding_to_check:此处是未知人脸的特征向量。
  • tolerance=0.6:比对阈值,即容差,默认为0.6。

4、人脸特征向量距离——distance
跟上面的方法同样原理,不过输出由对错改为数字。

face_distance(face_encodings, face_to_compare)

成员变量:

  • face_encodings:人脸解码方法中返回的特征向量,此处是已知人脸的特征向量。
  • face_to_compare:此处是未知人脸的特征向量。

5、人脸特征提取——landmark

face_landmarks(face_image, face_locations=None, model="large")

成员变量:

  • face_image:输入图片。
  • face_locations=None:这个是默认值,默认解码图片中的每一个人脸。若输入face_locations()[i]可指定人脸进行解码。
  • model=”large”:输出的特征模型,默认为“large”,可选“small”,改为输出5点特征,但速度更快。

6、化妆(简直是恶搞)——think ‘Meitu’
这不是个API,但挺好玩的,就放上来。
think ‘Meitu’是作者自己说的,哈哈,看来天朝的美颜远销海外,连人脸识别专家都忍不住来过一把瘾。不过要是给妹子弄这个,不跪键盘,就是跪榴莲
上代码:

from PIL import Image, ImageDraw
import face_recognition

# Load the jpg file into a numpy array
image = face_recognition.load_image_file("biden.jpg")

# Find all facial features in all the faces in the image
face_landmarks_list = face_recognition.face_landmarks(image)

for face_landmarks in face_landmarks_list:
    pil_image = Image.fromarray(image)
    d = ImageDraw.Draw(pil_image, 'RGBA')

    # Make the eyebrows into a nightmare
    d.polygon(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 128))
    d.polygon(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 128))
    d.line(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 150), width=5)
    d.line(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 150), width=5)

    # Gloss the lips
    d.polygon(face_landmarks['top_lip'], fill=(150, 0, 0, 128))
    d.polygon(face_landmarks['bottom_lip'], fill=(150, 0, 0, 128))
    d.line(face_landmarks['top_lip'], fill=(150, 0, 0, 64), width=8)
    d.line(face_landmarks['bottom_lip'], fill=(150, 0, 0, 64), width=8)

    # Sparkle the eyes
    d.polygon(face_landmarks['left_eye'], fill=(255, 255, 255, 30))
    d.polygon(face_landmarks['right_eye'], fill=(255, 255, 255, 30))

    # Apply some eyeliner
    d.line(face_landmarks['left_eye'] + [face_landmarks['left_eye'][0]], fill=(0, 0, 0, 110), width=6)
    d.line(face_landmarks['right_eye'] + [face_landmarks['right_eye'][0]], fill=(0, 0, 0, 110), width=6)

    pil_image.show()

文章就到这里,本人只是机器视觉的小白,路还有很长,欢迎大家指教!

你可能感兴趣的:(好玩的人脸识别face_recognition安装+尝试+API详细)