使用Python、OpenCV和SendGrid建立一个带有电子邮件提示的人脸识别系统

87 阅读5分钟

如果你在半夜醒来调查一个声音,在一瞬间辨认出入侵者是你的妹妹还是陌生人是非常重要的。一到三岁的新生儿就能分辨出已知的面孔。纵观人类历史,人类的大脑在识别人脸方面已经变得非常出色。

另一方面,做人脸检测的软件依靠机器学习算法在图像和视频中定位人脸。 ,然后做 人脸识别的软件分析检测到的面部特征,以确定在现有数据集中是否存在匹配。为了识别一个特定的人脸,我们首先需要训练一个机器学习模型,对现有的人脸数据集进行分类。这种类型的技术被用于各种现代应用中,如机场的生物识别护照或解锁你的手机。

本教程告诉你如何训练一个面部识别模型来识别访客。一旦访客被识别,你将收到一封宣布他们到来的电子邮件。

Face recognition demonstration

教程要求

  • Python 3.6版或更新的版本。如果你的操作系统没有提供Python解释器,你可以去python.org下载一个安装程序。
  • 一个网络摄像头(你的笔记本电脑的内置网络摄像头或一个外部摄像头
  • 一个Twilio SendGrid账户。一个免费的账户允许你每天发送多达100封免费的电子邮件。

设置Python虚拟环境

在命令行中,克隆这个示例项目,并换到目录中。

$ git clone https://github.com/loopDelicious/facial-recognition.git
$ cd facial-recognition

创建一个名为venv 的虚拟环境。激活虚拟环境,然后在虚拟环境中安装所需的 Python 包。如果你在 Unix 或 Mac 操作系统上,在终端输入这些命令。

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $ pip install opencv-python imutils face-recognition sendgrid python-dotenv

如果你在Windows机器上,在一个命令提示符窗口中输入这些命令。

$ python -m venv venv
$ venv\Scripts\activate
(venv) $ pip install opencv-python imutils face-recognition sendgrid python-dotenv

我们使用的Python包是。

face-recognition 包是对C++工具包dlib的封装,它需要在你的计算机上安装C++11编译器和CMake构建系统。如果上面的pip 安装失败是由于dlib ,你可以在下面的文章中找到详细说明。

这个项目使用社区教程中的代码来建立一个自定义的人脸识别数据集用OpenCV做人脸识别,并训练Raspberry Pi进行人脸识别

创建一个自定义的人脸识别数据集

让我们开始收集我们想在面部识别模型中识别的人脸的例子。在dataset 文件夹中添加一个新的子文件夹,以你的名字命名,如Joyce 。比如说。

$ mkdir dataset/Joyce

克隆库中的headshots.py 脚本使用OpenCV来访问我们的网络摄像头,并捕获图像并保存到磁盘中,在一个新的子文件夹中映射到你将作为命令行参数传递的名字。

运行该脚本以打开一个新的网络摄像头窗口。你可能需要为终端授予权限,以便从你的机器偏好设置中访问你的摄像头。

(venv) $ python headshots.py Joyce

现在是时尚和摆姿势的时候了!按空格键来拍摄一张头像。从不同的角度拍下至少10张你的脸。如果你戴眼镜,拍一些戴眼镜和不戴眼镜的照片。当你完成后,按ESC键结束程序。

找到datasets/ 下的新子文件夹,审查这些照片,以确保它们能代表你的脸。如果要在模型中加入更多的人,在datasets 中创建一个新的子文件夹,并在命令行参数中传递新的名称,以捕捉更多的头像。如果你想为一个现有的人添加更多的照片,只需再次运行头像程序,把这个人的名字作为参数。

现在我们有了一个数据集,让我们来训练我们的模型来识别这些脸。

使用基于深度学习的模型对人脸进行编码

每个人的脸都是独一无二的,就像指纹一样。encode_faces.py 脚本使用face_recognition Python包,通过编码和量化我们照片中的每一张脸来分析面部特征。对于人脸检测,你可以使用hog (定向梯度直方图)或cnn (卷积神经网络)方法,这取决于你系统的能力。我们在第30行使用hog ,以加快处理速度,但牺牲了准确性。该脚本输出一个新的文件,名为encodings.pickle ,其中包含识别数据集中所有面孔的标准。

运行这个命令来训练模型并对人脸进行编码。

(venv) $ python encode_faces.py

接下来,让我们看看这个模型是否有效。

测试人脸识别模型

该模型的人脸检测部分依赖于称为Haar Cascades的机器学习对象检测算法。通过这种方法,视频的每一帧都被分解成较小的区域,通过一系列或级联的评估来快速抛弃非人脸。在这个过滤过程中存活下来的区域通过在它们周围画一个方框被识别为人脸。我们使用的是正面人脸检测器,但也有其他Haar Cascade分类器用于检测诸如俄罗斯车牌或猫脸。

facial_req.py 脚本逐帧分析视频,以确定在我们现有的数据集中是否存在匹配。运行这个命令,打开一个网络摄像头窗口,测试模型。

(venv) $ python facial_req.py

如果你的脸在你的名字旁边用一个黄框突出显示,那么模型已经被正确地训练了。在你的测试数据集中有足够广泛的样本,即使你做了一个愚蠢的表情,模型也应该能够识别你。按q 键,退出程序。

Faced that are recognized will have a yellow box drawn around them

设置SendGrid电子邮件通知

send_test_email.py 脚本使用SendGrid Python库来创建和发送电子邮件。确保你设置了单发件人验证域名验证,以便从你自己的地址发送邮件。

登录到控制台,创建一个SendGrid的API密钥。创建一个名为.env (注意这个文件名前面的点)的新文件,以存储以下凭证。

SENDGRID_API_KEY=<your-sendgrid-api-key>
SENDGRID_EMAIL=<your-verified-sender-email>
RECIPIENT_EMAIL=<your-recipient>

运行这个命令来发送一个测试邮件。

(venv) $ python send_test_email.py

一旦你的电子邮件被正确设置,让我们把它放在一起。

为人脸识别添加电子邮件通知

如果你的数据集中的某人被识别出来,facial_req_email.py 脚本会抓拍一张照片,并发送电子邮件通知,以宣布新的到来。

运行这个命令,打开一个网络摄像头窗口,试试吧。

(venv) $ python facial_req_email.py

Email sent when face recognized

进一步探索

现在你可以为办公室做一个前台礼宾员,或者为你的家做一个监控监视器。为了进一步探索,你可以。

  • 在面部识别模型中添加更多的朋友和家人,并根据被识别的人定制通知方式()。

  • 在专用硬件上设置应用程序,如Raspberry Pi和Pi相机

  • 尝试其他机器学习分类器,比如检测猫的模型

如果你想深入了解本教程中探讨的机器学习概念和机制,请查看PyImageSearch的Adrian Rosebrock的《Face Recognition with OpenCV》和《Computer Vision, Deep Learning, and OpenCV》。

乔伊斯喜欢编码、猫和第二次午餐。在以下网站找到她 叽叽喳喳__, 媒介__, 和 媒介__.