dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码
请直接访问原文章 dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码 https://hotdog29.com/?p=595
dlib 在今天的博客文章中,您将学习如何使用以下方法在图像和视频流中执行人脸识别:
OpenCV
python
深度学习
正如我们将要看到的,我们今天在这里使用的基于深度学习的面部嵌入都是(1)高度准确 和(2)能够实时执
使用OpenCV,Python和深度学习进行人脸识别
在本教程中,您将学习如何使用OpenCV,Python和深度学习进行面部识别。
我们将首先简要讨论基于 深度 学习的面部识别,包括“深度量学习”的概念。
了解深度学习人脸识别嵌入
那么,深度学习+面部识别是如何工作的呢?
接受单个输入图像
并输出该图像的分类/标签
但是,深度量度学习是不同的。
相反,我们尝试输出单个标签(甚至是图像中对象的坐标/边界框),而是输出实值特征向量。
对于dlib面部识别网络,输出特征向量是128-d(即,128个实数值的列表),其用于量化面部。使用三元组训练网络:
从那里,一般的想法是我们将调整我们的神经网络的权重,以便两个Will Ferrel的128-d测量将彼此更接近并且远离Chad Smith的测量。
我们用于人脸识别的网络架构基于He等人的深度残留学习图像识别论文中的ResNet-34 ,但是层数较少,滤波器数量减少了一半。
该网络本身由Davis King在大约300万张图像的数据集上进行了训练。在野外标记面(LFW)数据集中,网络与其他最先进的方法进行比较,准确率达到99.38%。
Davis King(dlib的创建者)和Adam Geitgey( 我们将很快使用的face_recognition模块的作者)都写了详细的文章,介绍了基于学习的面部识别的深度:
深度度量学习的高质量人脸识别(戴维斯)
深度学习的现代人脸识别(Adam)
我强烈建议您阅读上述文章,了解有关深度学习面部嵌入的工作原理的详细信息。
安装面部识别库
为了使用Python和OpenCV执行面部识别,我们需要安装两个额外的库:
dlib
face_recognition
由Davis King维护的 dlib 库包含我们实现的“深度量学习”,用于构建用于实际识别过程的面部嵌入。
我假设您已在系统上安装了OpenCV。如果没有,不用担心 – 只需访问我的OpenCV安装教程页面,然后按照适合您系统的指南进行操作。
从那里,让我们安装 dlib 和 face_recognition 包。
dlib 无 GPU支持安装
如果您没有GPU,可以按照本指南 使用pip 安装 dlib
1
2 $ workon # optional
$ workon # optional$ pip install dlib
或者您可以从源代码编译
为此,我建议 您从源代码安装 dlib,因为您可以更好地控制构建
1
2 $ workon # optional
$ pip install imutils
我们的人脸识别数据集
图2:使用Python和Bing Image Search API以编程方式创建了一个示例人脸识别数据集。显示了侏罗纪公园电影系列中的六个角色。
由于侏罗纪公园 (1993)是我有史以来最喜欢的电影,为了纪念侏罗纪世界:堕落王国 (2018年)本周五在美国发行,我们将对电影中角色的样本进行人脸识别。 :
为数据集中的每个面创建128-d嵌入
使用这些嵌入来识别图像和视频流中字符的面部
人脸识别项目结构
通过检查tree 命令的输出可以看到我们的项目结构
图3:通过深度学习的面部识别和使用face_recognition 模块方法的Python 生成每面的128-d实值数字特征向量。
在我们识别图像和视频中的面部之前,我们首先需要量化训练集中的面部。请记住,我们实际上并没有在这里训练网络 – 网络已经过训练,可以在大约300万张图像的数据集上创建128-d嵌入。
我们当然可以从头开始训练网络,甚至可以微调现有模型的权重,但这很可能对许多项目来说都是过度杀伤力。此外,您需要大量图像来从头开始训练网络。
相反,使用预先训练的网络更容易,然后使用它为我们的数据集中的218个面中的每一个构建128-d嵌入。
然后,在分类过程中,我们可以使用简单的k-NN模型+ votes 来进行最终的人脸分类。其他传统的机器学习模型也可以在这里使用。
要构建我们的面部嵌入,请 从与此博客帖子相关联的“下载”中打开 encode_faces .py
首先,我们需要导入所需的包。再次注意,此脚本需要安装 imutils , face_recognition 和OpenCV。向上滚动到“ 安装您的面部识别库”,以确保您的库已准备就绪。
第21行使用输入数据集目录的路径来构建 其中包含的所有imagePath的列表 。
我们还需要在循环之前初始化两个列表, knownEncodings 和 knownNames 。这两个列表将包含数据集中每个人的面部编码和相应的名称(第24和25行)。
该循环将循环218次,对应于数据集中的218个面部图像。我们循环到第28行的每个图像的路径 。
从那里,我们将 在第32行 从imagePath中提取人物 的 名称(因为我们的子目录被恰当地命名) 。
然后让我们 在将imagePath传递 给 cv2的同时 加载 图像。imread (第36行)。
对于循环的每次迭代,我们将检测一个面(或可能是多个面并假设它是图像的多个位置中的同一个人 – 这个假设在您自己的图像中可能或可能不成立,所以要小心这里)。
例如,假设 rgb 包含Ellie Sattler脸部的图片。
第41和42行实际上找到/本地化她的面部,从而产生一个面部框列表 。我们将两个参数传递给face_recognition 。face_locations 方法:
从那里我们只需要将Ellie Sattler 编码 和 名称附加 到适当的列表( knownEncodings 和knownNames )。
除非我们可以 在另一个处理识别的脚本中使用编码,否则编码图像的重点是什么 ?
第56行构造了一个带有两个键的字典 – “编码” 和 “名称” 。
从那里 57-59号线将名称和编码转储到磁盘上以备将来召回。
我该如何 在终端中运行 encode_faces .py脚本?
在我的Titan X GPU上,处理整个数据集只花了一分多钟,但如果您使用的是CPU,请 准备好等待一段时间才能完成此脚本!
在我的Macbook Pro(无GPU)上,编码218张图片需要 21分20秒。
如果您拥有GPU并使用GPU支持编译dlib,您应该期望更快的速度。
图4:使用Adam Geitgey的深度学习face_recognitionPython模块识别John Hammond的脸。
现在我们已经为数据集中的每个图像创建了128维面嵌入,现在我们可以使用OpenCV,Python和深度学习来识别图像中的面部。
打开 recognize_faces_image .py (从这个博客帖子 “下载” 相关的文件和图像数据)
此脚本在第2-5行只需要四次导入 。该 face_recognition 模块将做繁重和OpenCV将帮助我们来加载,转换和显示处理后的图像。
第19行从磁盘加载我们的腌制编码和面名。我们稍后将在实际的面部识别步骤中需要这些数据。
然后,在 第22行和第23行,我们加载并将输入图像转换 为 rgb 颜色通道排序(就像我们在encode_faces .py 脚本中所做的 那样)。
然后我们继续检测输入图像中的所有面,并 在 第29-31行计算它们的128-d 编码(这些线也应该看起来很熟悉)。
现在是初始化 检测到的每个面的名称列表的好时机 – 该列表将在下一步填充。
此函数返回True / False 值列表, 每个图像对应一个数据集。对于我们的侏罗纪公园示例,数据集中有218个图像,因此返回的列表将具有218个布尔值。
在内部, compare_faces 函数计算候选嵌入与数据集中所有面之间的欧几里德距离:
该 变量将最终持有人的姓名串-现在,我们把它作为 “未知” 的情况下有没有“票”(42号线)。
根据我们的 匹配 列表,我们可以计算每个名称的“投票数”( 与每个名称相关联的真值的数量 ),计算投票数,并选择具有最多相应投票的人名
从那里开始,让我们遍历 matchesIdxs 并设置与每个名称相关联的值,同时根据需要递增 计数 。该 计数 字典可能是这样的一个高投得分为伊恩·马尔科姆
1 (Pdb) counts{‘ian_malcolm’: 40}
回想一下,我们在数据集中只有41张Ian图片,因此对于其他任何人而言没有投票的40分是非常高的。
第61行从计数中提取得票最多的名称 ,在这种情况下,它将是 “ian_malcolm” 。
我们的循环的第二次迭代(因为在我们的示例图像中有两个面)主面部编码循环产生以下计数
1 (Pdb) counts{‘alan_grant’: 5}
这绝对是一个较小的投票得分,但仍然,字典中只有一个名字所以我们可能找到了Alan Grant。
注意: PDB Python调试器用于验证计数 字典的值 。PDB的使用超出了本篇博文的范围; 但是,您可以在Python文档页面上发现如何使用它。
如 下面的图5 所示,Ian Malcolm和Alan Grant都已被正确识别,因此脚本的这一部分运行良好。
让我们继续并循环遍历每个人的边界框和标记名称,并在输出图像上绘制它们以进行可视化
要使用OpenCV和Python识别面部,请打开终端并执行我们的脚本
1
$ python recognize_faces_image.py --encodings encodings.pickle \ --image examples/example_01.png
12 $ python recognize_faces_image.py --encodings encodings.pickle \ --image examples/example_03.png
Figure 6: Face recognition with OpenCV and Python.
图7:通过Python,OpenCV和深度学习在视频中进行面部识别。
既然我们已经对图像应用了人脸识别,那么我们也可以对视频进行人脸识别(实时)。
下面的脚本与以前 recognize_faces_image.py 脚本 有许多相似之处 。因此,我将轻松略过已经涵盖的内容,只需查看视频组件,以便了解正在发生的事情
我们在第2-8行导入包,然后继续解析第11-20行的命令行参数。
我们有四个命令行参数,其中两个你应该从上面识别(–encodings和–detection-method)。 另外两个 参数 是:
–output:输出视频的路径。
–display:一个标志,指示脚本将帧显示在屏幕上。 值1显示,值0不显示输出帧到我们的屏幕。
从那里我们将加载我们的编码并启动我们的VideoStream:
我们可以选择将处理后的视频帧写入磁盘,因此我们将writer初始化 为 None (第30行)。睡眠2秒钟可使我们的相机预热(第31行)。
我们的循环从第34行开始,我们采取的第一步是从视频流中获取一个帧(第36行)。
上述代码块中的剩余行40-50几乎与前一个脚本中的行相同,只是这是视频帧而不是静态图像。基本上我们读取 帧 ,预处理,然后检测面边界 框 +计算 每个边界框的编码。
接下来,让我们循环遍历 与我们刚刚找到的面部相关的面部 编码
在下一个块中,我们在已识别的面上循环,然后围绕面部绘制一个框,并在面部上方绘制人物的显示名称
或者,我们将把帧写入磁盘,让我们看看如何使用OpenCV将视频写入磁盘:
假设我们在命令行参数中提供了输出文件路径,并且我们尚未初始化视频编写器(第99行),让我们继续并初始化它。
在第100行,我们初始化VideoWriter_fourcc。 FourCC是一个4字符的代码,在我们的例子中,我们将使用“MJPG”4字符代码。
从那里,我们将该对象与我们的输出文件路径,每秒帧数目标和帧尺寸(第101和102行)一起传递到VideoWriter中。
最后,如果编写器存在,我们可以继续将帧写入磁盘(第106-107行)。
如果我们的显示命令行参数已设置,我们继续显示框架(第112行)并检查是否已按下退出键(“q”)(第113-116行),此时我们将突破 循环(第117行)。
在 第120-125行中,我们清理并释放显示器,视频流和视频编写器。
要演示使用OpenCV和Python实时进行人脸识别,请打开终端并执行以下命令
我将人脸识别代码应用于最初的侏罗纪公园电影中的流行“午餐场景”,演员坐在桌子旁,分享他们对公园的关注
在下面的视频中,我将侏罗纪公园和侏罗纪世界剪辑的“精彩卷轴”放在一起,主要来自预告片:
我们可以看到,我们可以看到,我们的人脸识别和OpenCV代码运行良好!
我可以在Raspberry Pi上使用这个面部识别器代码吗?
可以。但是有一些限制:
好消息是我将在下周回来讨论如何在Raspberry Pi上运行我的人脸识别器,敬请期待!
摘要
在本教程中,您学习了如何使用OpenCV,Python和深度学习进行人脸识别。
此外,我们使用了Davis King的 dlib库 和Adam Geitgey的face_recognition模块 ,该模块包含了dlib的深度度量学习,使面部识别更容易实现。
准确
能够使用GPU实时执行
我希望你喜欢今天关于人脸识别的博客文章!
安装OpenCV。可以参考我的教程 pip 安装 opencv
代码下载
请看 这篇文章 https://hotdog29.com/?p=620
请直接访问原文章 dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码 https://hotdog29.com/?p=595
dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码相关推荐
- python模块cv2人脸识别_手把手教你使用OpenCV,Python和深度学习进行人脸识别
使用OpenCV,Python和深度学习进行人脸识别 在本教程中,你将学习如何使用OpenCV,Python和深度学习进行面部识别.首先,我们将简要讨论基于深度学习的面部识别,包括"深度度量 ...
- python dlib caffe人脸相似度_基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【一】如何配置caffe属性表...
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【六】设计人脸识别的识别类...
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- 基于深度学习的人脸识别与管理系统(UI界面增强版,Python代码)
摘要:人脸检测与识别是机器视觉领域最热门的研究方向之一,本文详细介绍博主自主设计的一款基于深度学习的人脸识别与管理系统.博文给出人脸识别实现原理的同时,给出Python的人脸识别实现代码以及PyQt设 ...
- 基于Python的(拍照签到+网课在线检测)深度学习的人脸识别系统
摘 要 近年来,网络技术日新月异,我们已经进入了大数据的时代并成为其中第一员,由此带来数据量的飞跃式的增长,而如何利用这些数据产生实际的生产价值则成为了大数据时代的一个重要问题.而人脸识别技术是一份对 ...
- 开发基于深度学习的人脸识别【考勤/签到】系统
开发基于深度学习的人脸识别[考勤/签到]系统 人脸识别介绍 平台环境需求 技术点 系统流程 细节设计 人脸检测 人脸关键点定位 人脸特征提取 模型的训练 模型的部署 MySQL数据库的使用 MFC工程 ...
- 【深度学习】人脸识别和口罩检测的应用
[深度学习]人脸识别和口罩检测的应用 文章目录 1 概述 2 人脸识别模型搭建与训练 3 口罩检测3.1 数据来源3.2 YoloV4简介3.3 数据集处理3.4 开始训练3.5 测试 1 概述 1. ...
- 毕业设计-基于深度学习的人脸识别方法
目录 前言 课题背景和意义 实现技术思路 一.人脸识别介绍 二.基于深度学习的人脸识别方法 实现效果图样例 最后 前言
最新文章
- [Android]上传到多个Maven仓库的Gradle插件RapidMavenPushPlugin
- ML之LSOLS:LSOLS算法的简介、论文、算法的改进(最佳子集选择OFSS法、前向逐步回归FSR法)、代码实现等详细攻略
- 简单的总是好的,在这个复杂的世界: java simple log
- python读取excle表格数据,将数据编辑到图像上工程
- 【C++学习笔记三】C++多态、抽象(接口)
- 客户将数据库迁移上云的常用办法
- 动态路由选择协议(二)距离矢量路由选择协议
- Ruby on Rails 和 J2EE:两者能否共存?
- n级阶梯,人一步只能上1~2级,求一共有几种走法?
- 可用的免费公开的DNS
- MTK:NICODE与ASCII码使用
- [转载] C++ std::vector指定位置插入
- C语言--输入一个数判断是否为素数(多种方法)
- 银河麒麟V10服务器系统安装教程及注意事项
- 【电泳仪品牌】生科必知的电泳仪品牌
- Keil(MDK)STM32和51版本详细安装
- 纯电阻电路的分析方法——网孔电流法
- 千万不要说联通的网络不好……
- 零基础怎么学习学单片机?单片机软件编程培训
- 手机wem文件转换软件_wem文件如何播放和转换成Ogg或MP3格式?