Python基于Dlib的人脸识别系统的实现


Posted in Python onFebruary 26, 2020

之前已经介绍过人脸识别的基础概念,以及基于opencv的实现方式,今天,我们使用dlib来提取128维的人脸嵌入,并使用k临近值方法来实现人脸识别。

人脸识别系统的实现流程与之前是一样的,只是这里我们借助了dlib和face_recognition这两个库来实现。face_recognition是对dlib库的包装,使对dlib的使用更方便。所以首先要安装这2个库。

pip3 install dlib
pip3 install face_recognition

然后,还要安装imutils库

pip3 install imutils

我们看一下项目的目录结构:

.
├── dataset
│   ├── alan_grant [22 entries exceeds filelimit, not opening dir]
│   ├── claire_dearing [53 entries exceeds filelimit, not opening dir]
│   ├── ellie_sattler [31 entries exceeds filelimit, not opening dir]
│   ├── ian_malcolm [41 entries exceeds filelimit, not opening dir]
│   ├── john_hammond [36 entries exceeds filelimit, not opening dir]
│   └── owen_grady [35 entries exceeds filelimit, not opening dir]
├── examples
│   ├── example_01.png
│   ├── example_02.png
│   └── example_03.png
├── output
│   ├── lunch_scene_output.avi
│   └── webcam_face_recognition_output.avi
├── videos
│   └── lunch_scene.mp4
├── encode_faces.py
├── encodings.pickle
├── recognize_faces_image.py
├── recognize_faces_video_file.py
├── recognize_faces_video.py
└── search_bing_api.py
 
10 directories, 12 files

首先,提取128维的人脸嵌入:

命令如下:

python3 encode_faces.py --dataset dataset --encodings encodings.pickle -d hog

记住:如果你的电脑内存不够大,请使用hog模型进行人脸检测,如果内存够大,可以使用cnn神经网络进行人脸检测。

看代码:

# USAGE
# python encode_faces.py --dataset dataset --encodings encodings.pickle
 
# import the necessary packages
from imutils import paths
import face_recognition
import argparse
import pickle
import cv2
import os
 
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--dataset", required=True,
	help="path to input directory of faces + images")
ap.add_argument("-e", "--encodings", required=True,
	help="path to serialized db of facial encodings")
ap.add_argument("-d", "--detection-method", type=str, default="hog",
	help="face detection model to use: either `hog` or `cnn`")
args = vars(ap.parse_args())
 
# grab the paths to the input images in our dataset
print("[INFO] quantifying faces...")
imagePaths = list(paths.list_images(args["dataset"]))
 
# initialize the list of known encodings and known names
knownEncodings = []
knownNames = []
 
# loop over the image paths
for (i, imagePath) in enumerate(imagePaths):
	# extract the person name from the image path
	print("[INFO] processing image {}/{}".format(i + 1,
		len(imagePaths)))
	name = imagePath.split(os.path.sep)[-2]
 
	# load the input image and convert it from RGB (OpenCV ordering)
	# to dlib ordering (RGB)
	image = cv2.imread(imagePath)
	rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
 
	# detect the (x, y)-coordinates of the bounding boxes
	# corresponding to each face in the input image
	boxes = face_recognition.face_locations(rgb,
		model=args["detection_method"])
 
	# compute the facial embedding for the face
	encodings = face_recognition.face_encodings(rgb, boxes)
 
	# loop over the encodings
	for encoding in encodings:
		# add each encoding + name to our set of known names and
		# encodings
		knownEncodings.append(encoding)
		knownNames.append(name)
 
# dump the facial encodings + names to disk
print("[INFO] serializing encodings...")
data = {"encodings": knownEncodings, "names": knownNames}
f = open(args["encodings"], "wb")
f.write(pickle.dumps(data))
f.close()

输出结果是每张图片输出一个人脸的128维的向量和对于的名字,并序列化到硬盘,供后续人脸识别使用。

识别图像中的人脸:

这里使用KNN方法实现最终的人脸识别,而不是使用SVM进行训练。

命令如下:

python3 recognize_faces_image.py --encodings encodings.pickle 	--image examples/example_01.png

看代码:

# USAGE
# python recognize_faces_image.py --encodings encodings.pickle --image examples/example_01.png 
 
# import the necessary packages
import face_recognition
import argparse
import pickle
import cv2
 
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-e", "--encodings", required=True,
	help="path to serialized db of facial encodings")
ap.add_argument("-i", "--image", required=True,
	help="path to input image")
ap.add_argument("-d", "--detection-method", type=str, default="cnn",
	help="face detection model to use: either `hog` or `cnn`")
args = vars(ap.parse_args())
 
# load the known faces and embeddings
print("[INFO] loading encodings...")
data = pickle.loads(open(args["encodings"], "rb").read())
 
# load the input image and convert it from BGR to RGB
image = cv2.imread(args["image"])
rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
 
# detect the (x, y)-coordinates of the bounding boxes corresponding
# to each face in the input image, then compute the facial embeddings
# for each face
print("[INFO] recognizing faces...")
boxes = face_recognition.face_locations(rgb,
	model=args["detection_method"])
encodings = face_recognition.face_encodings(rgb, boxes)
 
# initialize the list of names for each face detected
names = []
 
# loop over the facial embeddings
for encoding in encodings:
	# attempt to match each face in the input image to our known
	# encodings
	matches = face_recognition.compare_faces(data["encodings"],
		encoding)
	name = "Unknown"
 
	# check to see if we have found a match
	if True in matches:
		# find the indexes of all matched faces then initialize a
		# dictionary to count the total number of times each face
		# was matched
		matchedIdxs = [i for (i, b) in enumerate(matches) if b]
		counts = {}
 
		# loop over the matched indexes and maintain a count for
		# each recognized face face
		for i in matchedIdxs:
			name = data["names"][i]
			counts[name] = counts.get(name, 0) + 1
 
		# determine the recognized face with the largest number of
		# votes (note: in the event of an unlikely tie Python will
		# select first entry in the dictionary)
		name = max(counts, key=counts.get)
	
	# update the list of names
	names.append(name)
 
# loop over the recognized faces
for ((top, right, bottom, left), name) in zip(boxes, names):
	# draw the predicted face name on the image
	cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2)
	y = top - 15 if top - 15 > 15 else top + 15
	cv2.putText(image, name, (left, y), cv2.FONT_HERSHEY_SIMPLEX,
		0.75, (0, 255, 0), 2)
 
# show the output image
cv2.imshow("Image", image)
cv2.waitKey(0)

实际效果如下:

Python基于Dlib的人脸识别系统的实现

如果要详细了解细节,请参考:https://www.pyimagesearch.com/2018/06/18/face-recognition-with-opencv-python-and-deep-learning/

到此这篇关于Python基于Dlib的人脸识别系统的实现的文章就介绍到这了,更多相关Python Dlib人脸识别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python随手笔记第一篇(2)之初识列表和元组
Jan 23 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
python数据类型_字符串常用操作(详解)
May 30 Python
Python人脸识别初探
Dec 21 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
python基础知识(一)变量与简单数据类型详解
Apr 17 Python
详解Python 切片语法
Jun 10 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
解决pyCharm中 module 调用失败的问题
Feb 12 Python
Python中SQLite如何使用
May 27 Python
anaconda升级sklearn版本的实现方法
Feb 22 Python
Django框架之路由用法
Jun 10 Python
python 回溯法模板详解
Feb 26 #Python
python实现信号时域统计特征提取代码
Feb 26 #Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
Feb 26 #Python
python实现逆滤波与维纳滤波示例
Feb 26 #Python
Python全面分析系统的时域特性和频率域特性
Feb 26 #Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 #Python
Python中os模块功能与用法详解
Feb 26 #Python
You might like
汉字转化为拼音(php版)
2006/10/09 PHP
PHP源代码数组统计count分析
2011/08/02 PHP
php图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
CodeIgniter使用smtp服务发送html邮件的方法
2015/06/10 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
15 个 JavaScript Web UI 库
2010/05/19 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
关于jQuery中的each方法(jQuery到底干了什么)
2014/03/05 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
2016/10/10 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
2019/05/09 Javascript
Vue实现手机计算器
2020/08/17 Javascript
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
Python3.7实现中控考勤机自动连接
2018/08/28 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
Python中字符串List按照长度排序
2019/07/01 Python
pandas如何处理缺失值
2019/07/31 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
PyQt 如何创建自定义QWidget
2021/03/24 Python
军训鉴定表自我鉴定
2014/02/13 职场文书
《跨越海峡的生命桥》教学反思
2014/02/24 职场文书
学历公证书范本
2014/04/09 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
企业员工集体活动方案
2014/08/17 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
2015年学校德育工作总结
2015/04/22 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
SpringBoot快速入门详解
2021/07/21 Java/Android
python中pymysql包操作数据库方法
2022/04/19 Python