点击上方“”,选择加""或“”
重磅干货,第一时间送达
这是一个全面、互动的人脸识别初学指南。接下来,我们将创建一个定制的人脸识别程序,可以在视频或实时网络摄像头中检测和识别人脸。
在一个繁忙的市场上,7月份的烈日照耀在头顶上,炎热的天气并没有阻止顾客的到来。在人群不知情的情况下,一个恶意的人藏在他们中间一件正常的外套来实现他的邪恶目的。
在一个角落里,一个监控摄像头会定期扫描这个区域,然后它会瞥见这个家伙,它会立即识别每一张脸,碰巧这个家伙是一个通缉犯,几毫秒内,他附近的警察得到了警报,他们开始消除威胁。
这个故事曾经出现在科幻小说中,但现在情况大不相同了。事实上,中国使用人工智能监控工具来监控自己的公民来维护人们的安全,智能手机的创造者也在积极使用人脸识别来验证手机用户的身份。
人脸识别有许多不同的应用程序。无论你想用什么目的,我都会指导你在视频或网络摄像头中创建一个定制的人脸识别系统来识别你选择的人脸。
就像你看到的,这是我们想要得到的效果图。
在这篇文章中,我们将建立一个定制的人脸识别程序。这篇文章很容易理解,也激励了你对这个机器学习项目的理论知识。女性可以阅读目录来确定重点并浏览文章。
专业提示:如果您想快速完成任务,请跳过理论部分,直接进入第二部分。
i. Facenet是什么?
ii. Facenet怎样工作?
iii. 三重损失
i. 先决条件
ii. 下载数据
iii. 下载Facenet
iv. 对齐
v. 预训模型
vi. 使用我们的数据培训模型
vii. 在视频源上测试我们的模型
Facenet
在这个项目中,我们将使用一个名称Facenet为我们制作人脸识别程序的模型。
Facenet是什么?
Facenet是由Florian Schroff、Dmitry Kalenichenko和James Philbin他们还写了一篇了一篇论文。
它直接从人脸图像中学习图像到欧洲空间点的映射,其中距离直接对应于人脸相似度的测量。一旦创建了这些嵌入,这些嵌入就可以用作完成人脸识别和验证的特征。
Facenet怎样工作?
Facenet用卷积层直接从人脸像素中学习。该网络在一个大数据集上进行训练,以实现对光照、姿态和其他可变条件的不变性。该系统是在 Labelled Faces in the wild(http://vis-www.cs.umass.edu/lfw/) 这个数据集包含了13000多张从网络上收集的不同人脸的图片,每张人脸都有一个名字(标签)。
Facenet从图像中创建128维嵌入并插入特征空间,使相同身份之间的特征距离尽可能小,而不同身份之间的特征距离尽可能大。下图描述了模型的系统结构:
模型结构:模型包括批处理输入层、深度学习结构和L2层。
三重损失
该系统使用一种特殊的损失函数,称为三重损失。三重损失使同一身份图像之间的图像L2距离最小,使人脸图像具有不同的特征L2距离最大。
该系统采用的三重损失更适合人脸验证。使用三重损失的动机是鼓励将所有身份图像投影到嵌入空间的点。
三重损失:学习前后
创作者设计了一种高效的三重选择机制,可以一次巧妙地选择三种图像:
锚:随机人脸。
正图:同一个人的另一张脸。
负图:另一个人的脸。
测量了两个欧几里德之间的距离个是锚与正图之间的距离,我们称之为A;另一种是锚与负图之间的距离,我们称之为B。训练过程旨在减少A,最大化B,使相似的图像相互靠近,不同的图像在嵌入空间中相距很远。
最精彩的部分开始了!我们可以使用它Facenet嵌入我们选择的人脸,然后训练支持向量机(Support Vector Machine)对这些嵌入物进行分类,让我们开始建立自定义的人脸识别程序吧!
你可以看看这个项目Github存储库,因为它包含了一个自定义的数据集和在视频中检测人脸的脚本。
Github存储库
https://github.com/AssiduousArchitect/face-recognition
先决条件
请确保以下库安装在您的系统上:
tensorflow==1.7
scipy
scikit-learn
opencv-python
h5py
matplotlib
Pillow
requests
psutil
下载数据
在这个项目中,我们将创建一个人脸识别程序,它将能够识别20世纪90年代情景喜剧《老朋友》的核心人物。如果你想识别一组不同的人脸,用你的图像代替它,确保遵循类似的目录结构——创建一个文件夹来识别每个身份,并将它们存储在名为raw文件夹。
数据集目录:注意每个角色如何拥有相应的文件夹
把角色的照片放在每个文件夹里,请注意,每张图片只有一张清晰可见的脸。虽然我只需要很少的图像,但我为每个角色添加了20个图像,每个文件夹都有相同数量的图像。您可以从这里下载我创建的《老朋友》的数据集,如下所示:Chandler文件夹的样子:
下载Facenet
现在收集数据,下载并提取Facenet repo,将“Dataset将文件夹放入其中。
Facenet repo下载地址
https://github.com/davidsandberg/facenet
对齐
该模型的一个问题是,它可能会错过一些面部标志。为了解决这个问题,我们必须对齐所有数据集中的图像,使眼睛和嘴唇在所有图像中显示在同一位置。我们将使用它M.T.C.N.N.(多任务C.N.N.)执行相同的操作,并将所有对齐的图像存储在名称中processed的文件夹中。
打开终端/命令提示符Facenet然后运行目录align_dataset_mtcn.py以下参数。
python src/align_dataset_mtcnn.py \ ./Dataset/Friends/raw \ ./Dataset/Friends/processed \ --image_size 160 \ --margin 32 \ --random_order \ --gpu_memory_fraction 0.25
该命令将对齐所有图像并将其存储在各自的文件夹中,然后将所有内容存储在processed文件夹中。下图将向您介绍对齐的工作原理:
所有图像都被切割并与标准160相匹配x对齐160像素图像。
预训模型
现在,为了在自己的图像上训练模型,需要下载预训练模型。请从这里下载。
https://drive.google.com/file/d/1EXPBSXwTaqrSC0OhUdXNmKSh9qJUQ55-/view
在Facenet在根目录中创建一个名称Models下载文件夹后,将zip解压缩文件的内容称为facenet将该文件夹放在目录中Models文件夹中。
这个模型是在LFW数据集训练,所以所有的面部嵌入都存储在这些文件中,这给了我们冻结图像并在自己的图像上训练它的机会,这将我们提供的所有面部嵌入到维度空间中。
使用我们的数据培训模型
我们都准备好了!我们有预训好的模型,我们的自定义数据集已经对齐并准备好了,现在,是时候训练模型了!
python src/classifier.py TRAIN \
./Dataset/Friends/processed \
./Models/facenet/20180402-114759.pb \
./Models/Friends/Friends.pkl \
--batch_size 1000
执行上述命令将加载预先训练的模型并启动训练过程,训练结束后,新图像的嵌入将导出到/Models/Friends/中。
由于我们使用的是预先训练的模型和相对较少的图像数量,因此训练过程很快就结束了。
在视频源上测试我们的模型
为了测试我们的模型,我使用的是来自《老友记》的视频,你也可以用自己的视频来代替,甚至可以用摄像头。在本节中,我们将编写脚本,以便于在视频源中进行人脸识别。
切换到“src”文件夹并创建一个新的python脚本,我给它起名为 faceRec.py。
接下来,我们导入所有必需的库。
此脚本只接受一个参数,即视频文件的路径,如果没有提到路径,那么我们将通过网络摄像头传输视频,此时参数的默认值为0。
我们将初始化一些变量,请确保根据文件夹结构更改路径。
加载自定义分类器。
设置Tensorflow图,然后加载Facenet模型,使用GPU可以加快检测和识别过程。
设置输入和输出张量。
pnet、rnet和onet是M.T.C.N.N.的组成部分,将用于检测和对齐人脸。
接下来,我们将创建一个集合和一个来跟踪检测到的每个角色的集合。
设置视频捕获对象。
因此,如果在运行程序时未将VIDEO_PATH作为参数传递,则它将假定默认值为0,如果发生这种情况,视频捕获对象将从网络摄像机流式传输视频。
然后逐帧捕获视频,并且由检测人脸模块在这些帧中检测人脸,找到的人脸数存储在faces\u found变量中。
如果找到人脸,那么我们将迭代每个人脸并将边界框的坐标保存在变量中。
然后提取、裁剪、缩放、重塑这些人脸并输入字典。
我们将使用该模型来预测人脸的身份。我们提取最佳类的概率或置信度,这是用来衡量我们的模型是如何确定预测的身份属于给定的脸。
最后,我们将在人脸周围画一个边界框,并在边界框旁边写下预测的身份和置信度,如果置信度低于某个阈值,我们将把名字填为未知。
一定要放一个except语句,这将确保成功忽略抛出的任何错误,确保放置except语句,这样做有助于我们忽略错误。
except: pass
显示视频并在过程结束后关闭视频显示窗口,因为每一帧都要经过大量的处理,所以视频回放可能会很慢。
恭喜你,你的耐心得到了回报!我们已经完成了脚本,准备好了!快速启动并执行以下命令以启动人脸识别程序,请确保将要测试的视频的路径作为参数传递,或将其留空以从网络摄像机流式传输视频。
python src/faceRec.py --path ./Dataset/Friends/friends.mp
但是这个系统还不完善,还有一些缺点。
系统总是试图将每个人脸都匹配到一个给定的身份中。如果屏幕上出现新人脸,系统将为其分配一个或另一个身份,这个问题可以通过仔细选择一个阈值来解决。
身份的混淆。在上面的gif中,你可以观察到Joey和Chandler之间的预测有时是波动的,而且置信度得分也很低。需要使用更多图像训练模型来解决此问题。
无法在一定距离识别人脸(如果距离很远使得人脸看起来很小)。
无论是判断你的员工是否出席或在野外寻找违法者,人脸识别技术可以证明是一个真正的保障。这个项目包括创建一个人脸识别程序,可以识别你选择的人脸。你创建了一个自定义数据集,训练了模型,并编写了脚本以在视频剪辑上运行人脸识别系统,然而,也有一些缺点,但我们的系统功能还是比较完整的。
https://arxiv.org/abs/1503.03832
原文链接:https://towardsdatascience.com/s01e01-3eb397d458d
在「」公众号后台回复:即可下载全网第一份OpenCV扩展模块教程中文版,涵盖等二十多章内容。
在「」公众号后台回复:即可下载包括等31个视觉实战项目,助力快速学校计算机视觉。
在「」公众号后台回复:即可下载含有个基于实现20个,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。在群内发送广告,否则会请出群,谢谢理解~