人脸识别

您还可以阅读此文件的翻译版本in Chinese 简体中文版in Korean 한국어in Japanese 日本語

使用世界上最简单的人脸识别库从Python或命令行识别和操作人脸

使用以下方式构建dlib基于深度学习的最先进的人脸识别技术。该模型在人脸识别系统上的准确率为99.38%。Labeled Faces in the Wild基准测试

这也提供了一个简单的face_recognition命令行工具,可以让你从命令行对图像文件夹进行人脸识别!

功能

在图片中查找面孔

查找图片中出现的所有面孔:

import face_recognition image = face_recognition.load_image_file("your_file.jpg")
face_locations = face_recognition.face_locations(image)

查找和操作图片中的面部特征

获取每个人眼睛、鼻子、嘴巴和下巴的位置和轮廓

import face_recognition image = face_recognition.load_image_file("your_file.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)

找到面部特征对很多重要的东西都非常有用。但是你也可以用它来做一些非常愚蠢的事情,比如申请digital make-up(想想“美图”):

识别图片中的面孔

识别每张照片中出现的人

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)

您甚至可以将此库与其他Python库配合使用,以进行实时人脸识别:

看见this example以获取代码

在线演示

用户贡献的共享Jupyter笔记本演示(不受官方支持):Deepnote

安装

要求

  • Python 3.3+或Python 2.7
  • MacOS或Linux(Windows不受官方支持,但可能可以使用)

安装选项:

在Mac或Linux上安装

首先,确保已经安装了带有Python绑定的dlib:

然后,确保您安装了cmake:

brew install cmake

最后,使用以下命令从pypi安装此模块pip3(或pip2对于Python 2):

pip3 install face_recognition

或者,您可以使用以下命令尝试此库Docker,请参见this section

如果您在安装时遇到问题,您还可以尝试使用pre-configured VM

安装在NVIDIA Jetson纳米板上

  • Jetson Nano installation instructions
    • 请仔细按照文章中的说明操作。Jetson Nano上的CUDA库中当前存在一个错误,如果您不按照本文中的说明注释掉dlib中的一行并重新编译它,该库将会静默失败

在树莓PI 2+上安装

在FreeBSD上安装

pkg install graphics/py-face_recognition

在Windows上安装

虽然Windows不受官方支持,但有帮助的用户已经发布了如何安装该库的说明:

安装预配置的虚拟机映像

用法

命令行界面

当您安装时face_recognition,您会得到两个简单的命令行程序:

  • face_recognition-识别照片中的面孔或装满照片的文件夹
  • face_detection-在照片或装满照片的文件夹中查找面孔

face_recognition命令行工具

这个face_recognition命令使您可以识别照片中的面孔或已满的文件夹中的照片

首先,您需要提供一个文件夹,其中包含您已经认识的每个人的一张照片。每个人都应该有一个图像文件,这些文件根据图片中的人命名:

known

接下来,您需要第二个文件夹,其中包含要标识的文件:

unknown

然后,您只需在中运行命令face_recognition,传入已知人员的文件夹和包含未知人员的文件夹(或单个图像),它会告诉您每个图像中有哪些人:

$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person

每个面的输出中都有一行。数据用逗号分隔,其中包含文件名和找到的人员的姓名

一个unknown_person图像中的面孔与您的已知人员文件夹中的任何人都不匹配

face_detection命令行工具

这个face_detection命令允许您查找图像中任何面的位置(像素坐标

只需运行该命令face_detection,传入要检查的图像文件夹(或单个图像):

$ face_detection  ./folder_with_pictures/

examples/image1.jpg,65,215,169,112
examples/image2.jpg,62,394,211,244
examples/image2.jpg,95,941,244,792

它为检测到的每个面打印一行。报告的坐标是面的上、右、下和左坐标(以像素为单位)

调整公差/灵敏度

如果同一个人有多个匹配项,则照片中的人可能看起来非常相似,需要较低的容差值才能更严格地进行面部比较

您可以使用--tolerance参数。默认公差值为0.6,较小的数字会使面比较更加严格:

$ face_recognition --tolerance 0.54 ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person

如果要查看为每个匹配计算的面距离以调整容差设置,可以使用--show-distance true

$ face_recognition --show-distance true ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama,0.378542298956785
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person,None
更多例子

如果您只想知道每张照片中人物的名字,而不关心文件名,您可以这样做:

$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/ | cut -d ',' -f2

Barack Obama
unknown_person
提高人脸识别速度

如果您的计算机具有多个CPU内核,则可以并行进行人脸识别。例如,如果您的系统有4个CPU核心,通过并行使用所有CPU核心,您可以在相同的时间内处理大约4倍的图像

如果您使用的是Python 3.4或更高版本,请传入--cpus <number_of_cpu_cores_to_use>参数:

$ face_recognition --cpus 4 ./pictures_of_people_i_know/ ./unknown_pictures/

您也可以传入--cpus -1要使用系统中的所有CPU核心,请执行以下操作

Python模块

您可以导入face_recognition模块,然后只需几行代码就可以轻松地操作面。超级简单!

接口文档:https://face-recognition.readthedocs.io

自动查找图像中的所有人脸
import face_recognition image = face_recognition.load_image_file("my_picture.jpg")
face_locations = face_recognition.face_locations(image)

# face_locations is now an array listing the co-ordinates of each face!

看见this example试试看

您还可以选择采用稍微更精确的基于深度学习的人脸检测模型

注:这款机型需要GPU加速(通过NVIDIA的CUDA库)才能获得良好的性能。编译时还需要启用CUDA支持dlib

import face_recognition image = face_recognition.load_image_file("my_picture.jpg")
face_locations = face_recognition.face_locations(image, model="cnn")

# face_locations is now an array listing the co-ordinates of each face!

看见this example试试看

如果您有大量图像和GPU,您还可以find faces in batches

自动定位图像中人的面部特征
import face_recognition image = face_recognition.load_image_file("my_picture.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)

# face_landmarks_list is now an array with the locations of each facial feature in each face. # face_landmarks_list[0]['left_eye'] would be the location and outline of the first person's left eye.

看见this example试试看

识别图像中的人脸并识别他们是谁
import face_recognition picture_of_me = face_recognition.load_image_file("me.jpg")
my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]

# my_face_encoding now contains a universal 'encoding' of my facial features that can be compared to any other picture of a face! unknown_picture = face_recognition.load_image_file("unknown.jpg")
unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0]

# Now we can see the two face encodings are of the same person with `compare_faces`! results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding)

if results[0] == True:
    print("It's a picture of me!")
else:
    print("It's not a picture of me!")

看见this example试试看

Python代码示例

所有的例子都是可用的here

人脸检测

面部特征

面部识别

创建独立的可执行文件

如果要创建无需安装即可运行的独立可执行文件pythonface_recognition,您可以使用PyInstaller但是,它需要一些自定义配置才能与该库一起使用。看见this issue关于如何做这件事

涵盖以下内容的文章和指南face_recognition

人脸识别的工作原理

如果您想了解人脸定位和识别如何工作,而不是依赖于黑匣子库,read my article

注意事项

  • 人脸识别模型是在成人身上训练的,在儿童身上效果不是很好。如果使用默认的比较阈值0.6,它往往很容易混淆孩子
  • 不同民族的准确度可能会有所不同。请看this wiki page有关更多详细信息,请参阅

Deployment to Cloud Hosts (Heroku, AWS, etc)

因为face_recognition取决于dlib它是用C++编写的,因此将使用它的应用程序部署到Heroku或AWS等云主机提供商可能会很棘手

为了简单起见,此repo中有一个示例Dockerfile,它展示了如何运行用face_recognition在一个Docker集装箱。这样,您就应该能够部署到任何支持Docker映像的服务

您可以通过运行以下命令在本地试用Docker镜像:docker-compose up --build

还有一些several prebuilt Docker images.

具有图形处理器的linux用户(驱动程序>=384.81)和Nvidia-Docker可以在GPU上运行该示例:打开docker-compose.yml文件并取消注释dockerfile: Dockerfile.gpuruntime: nvidia线条

有问题吗?

如果您遇到问题,请阅读Common Errors在提交GitHub问题之前,请访问维基百科

谢谢

  • 非常,非常感谢Davis King(@nulhom)用于创建dlib,并用于提供在该库中使用的经过训练的面部特征检测和面部编码模型。有关支持面部编码的ResNet的更多信息,请查看他的blog post
  • 感谢所有致力于所有出色的Python数据科学库(如Numpy、Scipy、SCRICKIT-IMAGE、Pillow等)的人,正是这些库使这类事情在Python中变得如此简单和有趣
  • 感谢Cookiecutter以及audreyr/cookiecutter-pypackage一种使Python工程打包方式更具容忍性的工程模板
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。