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中zip()函数用法实例教程
Jul 31 Python
python的keyword模块用法实例分析
Jun 30 Python
Python之Scrapy爬虫框架安装及简单使用详解
Dec 22 Python
django 多数据库配置教程
May 30 Python
Python通过调用有道翻译api实现翻译功能示例
Jul 19 Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 Python
python元组和字典的内建函数实例详解
Oct 22 Python
Python自动化完成tb喵币任务的操作方法
Oct 30 Python
python 实现保存最新的三份文件,其余的都删掉
Dec 22 Python
如何实现更换Jupyter Notebook内核Python版本
May 18 Python
Python爬虫防封ip的一些技巧
Aug 06 Python
利用Python函数实现一个万历表完整示例
Jan 23 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中str_replace函数使用小结
2008/10/11 PHP
PHP实现微信红包金额拆分试玩的算法示例
2018/04/07 PHP
JavaScript 的方法重载效果
2009/08/07 Javascript
javascript event 事件解析
2011/01/31 Javascript
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
vuex提交state&&实时监听state数据的改变方法
2018/09/16 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
python基于queue和threading实现多线程下载实例
2014/10/08 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
python去除文件中重复的行实例
2018/06/29 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
python随机在一张图像上截取任意大小图片的方法
2019/01/24 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
Python的形参和实参使用方式
2019/12/24 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
3分钟看懂Python后端必须知道的Django的信号机制
2020/07/26 Python
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
中学老师的自我评价
2013/11/07 职场文书
大学班长的职责
2014/01/27 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
道路交通事故人身损害赔偿协议书
2014/11/19 职场文书
经理聘任证明
2015/03/02 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python
Python移位密码、仿射变换解密实例代码
2021/06/27 Python
HttpClient实现表单提交上传文件
2022/08/14 Java/Android