PHP opencv Dlib,Face_Recognition

Face_Recognition

使用Opencv和Dlib实现基于视频的人脸识别

文件夹介绍

1、Resources\pictures

此文件夹下存放人脸保存结果

2、Resources\video

此文件夹下存放带标注视频保存结果

3、Resources\faceS

此文件夹下存放各个人物的图片,用于人脸库的建立

4、Resources\featureDB

此文件下为各个人物的128D描述符的数据存储文件

5、Resources\featureMean\feature_all.csv

此文件为人脸特征库文件

6、Resources\shape_predictor_68_face_landmarks.dat

人脸关键点标记模型文件

7、Resources\dlib_face_recognition_resnet_model_v1.dat

面部识别模型文件

8、face_recognition.mp4

待检测的视频

9、face_recognition.py

人脸识别代码文件

10、detection.py

人脸检测代码文件

11、face_recognition.py

建立本地人脸库代码文件

介绍

思路介绍

无论是基于视频或者调用摄像头来完成人脸识别,其实是一样,通过使用opencv,来捕获视频或者摄像头传来的图像,每隔若干帧取一帧做人脸识别,调用Dlib中的人脸检测器来检测人脸,并通过Dlib的人脸关键点预测器来获得人脸的关键点,接下来使用Dlib的面部识别模型将获得的68个关键点转换成128D面部描述符,我们通过计算人脸的128D面部描述符与本地人脸库(需要自己建立人脸库)中的人脸128D面部描述符的欧氏距离,来判断是否为同一人,当距离小于特定阈值时,认定识别成功,打上标签。

%E8%BF%87%E7%A8%8B%E5%9B%BE.png

运行环境介绍

操作系统版本:Windows10

运行环境:python3.6+opencv4.1.2+dlib19.8.1

软件:PyCharm

(注:这里下载dlib包最好下载.whl文件,不需要安装cmake以及boost这些麻烦的东西。因为dilib包的没有python3.7版的whl文件,所以建议使用python3.6)

附上opencv和dlib包链接:https://pan.baidu.com/s/1Z33r7SoD5Z0faH96wr7Ecw

提取码:a8gl

模型介绍

这里的人脸识别使用了Dlib已训练成功的两个模型--人脸关键点预测器和面部识别模型。使用时需要加载模型,文件分别为shape_predictor_68_face_landmarks.dat和dlib_face_recognition_resnet_model_v1.dat

模型文件下载地址 http://dlib.net/files/

人脸关键点预测器

Dlib中标记68个特征点采用的是ERT算法,是一种基于回归树的人脸对齐算法,这种方法通过建立一个级联的残差回归树来使人脸形状从当前形状一步一步回归到真实形状。每一个GBDT的每一个叶子节点上都存储着一个残差回归量,当输入落到一个节点上时,就将残差加到改输入上,起到回归的目的,最终将所有残差叠加在一起,就完成了人脸对齐的目的。

用法:

predictor_path = resources_path + "shape_predictor_68_face_landmarks.dat"

#加载人脸关键点预测器

predictor= dlib.shape_predictor(predictor_path)

#获取面部关键点,gary为灰度化的图片

shape = predictor(gray,value)

人脸识别模型

Dlib中使用的人脸识别模型是基于深度残差网络,深度残差网络通过残差块来构建,它有效的解决了梯度消失以及梯度爆炸问题。当网络深度很大时,普通网络的误差会增加,而深度残差网络却有较小的误差。这里的人脸识别通过训练深度残差网络将人脸的68个特征关键点转换成128D面部描述符,用于人脸的识别。

model_path = resources_path + "dlib_face_recognition_resnet_model_v1.dat"

#生成面部识别器

facerec = dlib.face_recognition_model_v1(model_path)

# 提取特征-图像中的68个关键点转换为128D面部描述符,其中同一人的图片被映射到彼此附近,并且不同人的图片被远离地映射。

face_descriptor = facerec.compute_face_descriptor(frame, shape)

效果展示

%E5%9B%BE%E7%89%872.png

%E5%9B%BE%E7%89%871.png

%E5%9B%BE%E7%89%873.png

识别过程

1、本地人脸库建立

%E4%BA%BA%E8%84%B8%E5%BA%93%E5%BB%BA%E7%AB%8B%E5%9B%BE.png

2 、视频处理

通过opencv提供的VideoCapture()函数对视频进行加载,并计算视频的fps,以方便人脸标记之后的视频的输出。

3、加载模型

将已经训练好的模型加载进来,将人脸关键点标记模型和面部识别模型加载进来,以便后续使用。

4、人脸检测

对视频进行读取,每隔6帧,取一帧进行人脸检测,先将取得的照片进行灰度处理,然后进行人脸检测,并绘画人脸标记框进行展示,然后通过加载的人脸关键点标记模型识别图像中的人脸关键点,并且标记。

5、人脸识别

将获取的人脸关键点转换成128D人脸描述符,将其与人脸库中的128D面部描述符进行欧氏距离计算,当距离值小于某个阈值时,认为人物匹配,识别成功,打上标签。当无一小于该阈值,打上Unknown标签

%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB%E5%9B%BE.png

6、 保存人脸标记视频

将整个处理过程进行输出,将人脸标记过程保存下来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Examining Open vSwitch Traffic Patterns

In this post, I want to provide some additional insight on how the use of Open vSwitch (OVS) affects—or doesn’t affect, in some cases—how a Linux host directs traffic through physical interfaces, OVS internal interfaces, and OVS bridges. This is somethi…

Docker 面临的安全隐患,我们该如何应对

【编者按】对比虚拟机,Docker 在体量等方面拥有显著的优势。然而,当 DevOps 享受 Docker 带来扩展性、资源利用率和弹性提升的同时,其所面临的安全隐患同样值得重视,近日 Chris Taschner 在 SEI 上撰文进行了总结。本文系 OneAPM …

Oracle从小白到大牛的刷题之路(建议收藏学习)

目录 前言 数据表结构 数据库文件(按照顺序导入) 1基本SQL-SELECT 1.1基本SQL-SELECT语句笔记 1.2 基本SQL-SELECT语句练习 2过滤和排序数据 2.1过滤和排序数据笔记 2.2过滤和排序数据练习 3单行函数 3.1单行函数笔记 3.2单行函数练习 4多表…

3.2 双向链表

1.简介 前面3.1的单链表在操作过程中有一个缺点,就是后面的节点无法直接找到前面的节点,这使很多操作都得从头到尾去搜寻节点,算法效率变得非常低,解决这个问题的方法就是重新定义链表的节点使每个节点有两个指针,一个…

uc通讯不成功php版本过高,Ucenter通信失败排查方法

定位错误来源:1. 使用firebug或类似于firebug的工具审查”通信失败“这几个字2. 会发现包含这几个字的div的同级下方有个script标签,复制该script标签的src值到浏览器的新标签页并打开3. 这个url指向的是ucenter中app模块的onping操作(ucenter/control/a…

敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则

第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法。   这个原则用来处理“胖”接口所存在的缺点。如果类的接口不是内敛的,就表示该类具有“胖”接口。换句话说,类的“胖”接口可以分解成多组方法。每一组方法都服务于一组不…

Java中常用的集合

有序列允许元素重复否Collection否是List是是SetAbstractSet否      否HashSetTreeSet是(用二叉树排序)MapAbstractMap否 使用key-value来映射和存储数据, Key必须惟一,value可以重复 HashMapTreeMap是(用二叉树…

ASP.NET MVC必知必会知识点总结(二)

一、实现Controller的依赖注入: 1.自定义继承DefaultControllerFactory 类的控制器工厂类并重写GetControllerInstance方法;(如:InjectControllerFactory) 2.在Global.asax文件中的Application_Start方法中注册该控制器…

linux客户端无法绑定端口号,为什么Linux客户端的情况下不支持端口共用?

也不是不可以, 如果是socket的话只要设置端口复用就可以实现,随便写一段代码演示一下#/bin/pythonimport sysimport timeimport socketdef start_tcp_client(ip, port):#server port and ipserver_ip ipservr_port porttcp_client socket.socket(socket.AF_INET,…

基于Linux系统的手机,中国最新超算操作系统揭秘:基于Linux

世界第一超级计算机神威太湖之光亮相之后,令世界瞩目。这款超级计算机由中国自主研发,处理器采用64位国产260核CPU申威SW26010,性能几乎是天河2号的三倍,但总功耗反而更低。这款超算不仅有强悍无比的硬件,更有神通广大…