人脸识别
您还可以阅读此文件的翻译版本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以获取代码
在线演示
安装
要求
- 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不受官方支持,但有帮助的用户已经发布了如何安装该库的说明:
安装预配置的虚拟机映像
- Download the pre-configured VM image(适用于VMware Player或VirtualBox)
用法
命令行界面
当您安装时face_recognition
,您会得到两个简单的命令行程序:
face_recognition
-识别照片中的面孔或装满照片的文件夹face_detection
-在照片或装满照片的文件夹中查找面孔
face_recognition
命令行工具
这个face_recognition
命令使您可以识别照片中的面孔或已满的文件夹中的照片
首先,您需要提供一个文件夹,其中包含您已经认识的每个人的一张照片。每个人都应该有一个图像文件,这些文件根据图片中的人命名:
接下来,您需要第二个文件夹,其中包含要标识的文件:
然后,您只需在中运行命令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
人脸检测
- Find faces in a photograph
- Find faces in a photograph (using deep learning)
- Find faces in batches of images w/ GPU (using deep learning)
- Blur all the faces in a live video using your webcam (Requires OpenCV to be installed)
面部特征
面部识别
- Find and recognize unknown faces in a photograph based on photographs of known people
- Identify and draw boxes around each person in a photo
- Compare faces by numeric face distance instead of only True/False matches
- Recognize faces in live video using your webcam – Simple / Slower Version (Requires OpenCV to be installed)
- Recognize faces in live video using your webcam – Faster Version (Requires OpenCV to be installed)
- Recognize faces in a video file and write out new video file (Requires OpenCV to be installed)
- Recognize faces on a Raspberry Pi w/ camera
- Run a web service to recognize faces via HTTP (Requires Flask to be installed)
- Recognize faces with a K-nearest neighbors classifier
- Train multiple images per person then recognize faces using a SVM
创建独立的可执行文件
如果要创建无需安装即可运行的独立可执行文件python
或face_recognition
,您可以使用PyInstaller但是,它需要一些自定义配置才能与该库一起使用。看见this issue关于如何做这件事
face_recognition
涵盖以下内容的文章和指南
- 我的一篇关于人脸识别工作原理的文章:Modern Face Recognition with Deep Learning
- 介绍算法及其一般工作原理。
- Face recognition with OpenCV, Python, and deep learning艾德里安·罗斯布罗克(Adrian Rosebrock)著
- 介绍如何在实践中使用人脸识别
- Raspberry Pi Face Recognition艾德里安·罗斯布罗克(Adrian Rosebrock)著
- 介绍如何在覆盆子PI上使用此功能
- Face clustering with Python艾德里安·罗斯布罗克(Adrian Rosebrock)著
- 介绍如何使用无监督学习根据每张照片中出现的人自动对照片进行聚类
人脸识别的工作原理
如果您想了解人脸定位和识别如何工作,而不是依赖于黑匣子库,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.gpu
和runtime: nvidia
线条
有问题吗?
如果您遇到问题,请阅读Common Errors在提交GitHub问题之前,请访问维基百科
谢谢
- 非常,非常感谢Davis King(@nulhom)用于创建dlib,并用于提供在该库中使用的经过训练的面部特征检测和面部编码模型。有关支持面部编码的ResNet的更多信息,请查看他的blog post
- 感谢所有致力于所有出色的Python数据科学库(如Numpy、Scipy、SCRICKIT-IMAGE、Pillow等)的人,正是这些库使这类事情在Python中变得如此简单和有趣
- 感谢Cookiecutter以及audreyr/cookiecutter-pypackage一种使Python工程打包方式更具容忍性的工程模板