人脸检测进阶:更快的5点面部标志检测器(代码片段)

AI浩 AI浩     2023-02-22     578

关键词:

人脸检测进阶:更快的5点面部标志检测器

今天在这里的目标是向您介绍新的 dlib 面部标志检测器,它比原始版本更快(提高 8-10%)、更高效、更小(10 倍)。

在这篇博文的第一部分,我们将讨论 dlib 的新的、更快、更小的 5 点面部标志检测器,并将其与随库分发的原始 68 点面部标志检测器进行比较。

然后我们将使用 Python、dlib 和 OpenCV 实现面部标志检测,然后运行它并查看结果。

最后,我们将讨论使用 5 点面部标志检测器的一些限制,并重点介绍一些您应该使用 5 点版本的 68 点面部标志检测器的场景。

68 点检测器定位沿眼睛、眉毛、鼻子、嘴巴和下颌线的区域共68个点,5 点面部标志检测器将此信息简化为:

  • 左眼2分

  • 右眼2分

  • 鼻子1分

5 点面部标志检测器最合适的用例是面部对齐。

在加速方面,我发现新的 5 点检测器比原始版本快 8-10%,但这里真正的胜利是模型大小:为 9.2MB 。

同样重要的是要注意面部标志检测器开始时往往非常快(特别是如果它们被正确实现,就像它们在 dlib 中一样)。

dlib的安装教程:

https://wanghao.blog.csdn.net/article/details/121470556

人脸检测器模型:

https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/50939290

使用 dlib、OpenCV 和 Python 实现面部标志

打开一个新文件,将其命名为 fast_facial_landmarks.py ,并插入以下代码:

# import the necessary packages
from imutils.video import VideoStream
from imutils import face_utils
import argparse
import imutils
import time
import dlib
import cv2

导入了必要的包,特别是 dlib 和 imutils 中的两个模块。

imutils 包已更新以处理 68 点和 5 点面部标志模型。 确保通过以下方式在您的环境中升级它:

pip install --upgrade imutils

同样,更新 imutils 将允许您使用 68 点和 5 点面部标志。

解析命令行参数:

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--shape-predictor", required=True,
	help="path to facial landmark predictor")
args = vars(ap.parse_args())

我们有一个命令行参数:–shape-predictor。 此参数允许我们更改将在运行时加载的面部标志预测器的路径。

然后,让我们加载形状预测器并初始化我们的视频流:

# initialize dlib's face detector (HOG-based) and then create the
# facial landmark predictor
print("[INFO] loading facial landmark predictor...")
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args["shape_predictor"])
# initialize the video stream and sleep for a bit, allowing the
# camera sensor to warm up
print("[INFO] camera sensor warming up...")
vs = VideoStream(src=1).start()
# vs = VideoStream(usePiCamera=True).start() # Raspberry Pi
time.sleep(2.0)

初始化 dlib 的预训练 HOG + 线性 SVM 人脸检测器并加载 shape_predictor 文件。

访问相机,我们使用 imutils 中的 VideoStream 类。

您可以选择(通过注释/取消注释第 25 和 26 行)是否使用:

​ 1、内置/USB 网络摄像头

​ 2、或者,如果您将在 Raspberry Pi 上使用 PiCamera

从那里,让我们遍历帧并做一些工作:

# loop over the frames from the video stream
while True:
	# grab the frame from the threaded video stream, resize it to
	# have a maximum width of 400 pixels, and convert it to
	# grayscale
	frame = vs.read()
	frame = imutils.resize(frame, width=400)
	gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
	# detect faces in the grayscale frame
	rects = detector(gray, 0)
	# check to see if a face was detected, and if so, draw the total
	# number of faces on the frame
	if len(rects) > 0:
		text = " face(s) found".format(len(rects))
		cv2.putText(frame, text, (10, 20), cv2.FONT_HERSHEY_SIMPLEX,
			0.5, (0, 0, 255), 2)

首先,我们从视频流中读取一帧,调整其大小,然后转换为灰度。

然后让我们使用我们的 HOG + 线性 SVM 检测器来检测灰度图像中的人脸。

从那里,我们首先确保至少检测到一张人脸,从而在原始帧上绘制图像中的人脸总数。

接下来,让我们循环面部检测并绘制标记:

	# loop over the face detections
	for rect in rects:
		# compute the bounding box of the face and draw it on the
		# frame
		(bX, bY, bW, bH) = face_utils.rect_to_bb(rect)
		cv2.rectangle(frame, (bX, bY), (bX + bW, bY + bH),
			(0, 255, 0), 1)
		# determine the facial landmarks for the face region, then
		# convert the facial landmark (x, y)-coordinates to a NumPy
		# array
		shape = predictor(gray, rect)
		shape = face_utils.shape_to_np(shape)
 
		# loop over the (x, y)-coordinates for the facial landmarks
		# and draw each of them
		for (i, (x, y)) in enumerate(shape):
			cv2.circle(frame, (x, y), 1, (0, 0, 255), -1)
			cv2.putText(frame, str(i + 1), (x - 10, y - 10),
				cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)

循环遍历 rects 。

我们使用 imutils 中的 face_utils 模块在原始框架上绘制人脸边界框(您可以在此处阅读更多信息)。

然后我们将面部传递给预测器以确定面部标志,随后我们将面部标志坐标转换为 NumPy 数组。

现在是有趣的部分。 为了可视化标记,我们将使用 cv2.circle 绘制小点并对每个坐标进行编号。

遍历标记坐标。 然后我们在原始帧上绘制一个小的实心圆圈以及标记编号。

让我们完成我们的面部标记脚本:

	# show the frame
	cv2.imshow("Frame", frame)
	key = cv2.waitKey(1) & 0xFF
 
	# if the `q` key was pressed, break from the loop
	if key == ord("q"):
		break
# do a bit of cleanup
cv2.destroyAllWindows()
vs.stop()

运行我们的面部标记检测器,执行命令

python fast_facial_landmarks.py --shape-predictor shape_predictor_5_face_landmarks.dat

dlib 的 5 点比68 点面部标志检测器更快吗?

在我自己的测试中,我发现 dlib 的 5 点面部标志检测器比原来的 68 点面部标志检测器快 8-10%。

8-10% 的加速是显着的; 然而,这里更重要的是模型的大小。

原来的68点人脸标记检测器将近100MB。

5 点面部标志检测器不到 10MB,只有 9.2MB——这是一个小 10 倍以上的模型!

当您构建自己的使用面部标志的应用程序时,您现在拥有一个小得多的模型文件,可以与应用程序的其余部分一起分发。

5 点面部标志检测器的局限性

对于面部对齐,可以将 5 点面部标志检测器视为 68 点检测器的直接替代品——适用相同的通用算法:

计算 5 点面部标志

分别根据每只眼睛的两个界标计算每只眼睛的中心

利用眼睛之间的中点计算眼睛质心之间的角度

通过应用仿射变换获得人脸的规范对齐

虽然 68 点面部标志检测器可能会为我们提供更好的眼睛中心近似值,但在实践中您会发现 5 点面部标志检测器也能正常工作。

5 点面部标志检测器肯定更小(分别为 9.2MB 和 99.7MB),但它不能在所有情况下使用。比如睡意检测时,我们需要计算眼睛纵横比 (EAR),它是眼睛界标宽度与眼睛界标高度的比率。

当使用 68 点面部标志检测器时,我们每只眼睛有六个点,使我们能够执行此计算。

然而,使用 5 点面部标志检测器,我们每只眼睛只有两个点——这不足以计算眼睛纵横比。

如果您的计划是构建一个睡意检测器或任何其他需要面部更多点的应用程序,包括沿以下方向的面部标志:

眼睛

眉毛

鼻子

下颌线

总结

在今天的博客文章中,我们讨论了 dlib 新的、更快、更紧凑的 5 点面部标志检测器。

这个 5 点面部标志检测器可以被认为是最初与 dlib 库一起分发的 68 点标志检测器的替代品。

在讨论了两个面部标志检测器之间的差异后,我提供了一个应用 5 点版本来检测我面部的眼睛和鼻子区域的示例脚本。

在我的测试中,我发现 5 点面部标志检测器比 68 点版本快 8-10%,同时小 10 倍。
完整的代码:
https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/57183149

人脸检测进阶:使用dlibopencv和python检测面部标记(代码片段)

...教程:https://wanghao.blog.csdn.net/article/details/121470556人脸检测器模型:https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/50939290人脸标记已成功应用于人脸对齐、头部姿势估计、人脸交换、眨眼检测等领域。在今天的博客文章中࿰... 查看详情

opencv-python实战(15)——面部特征点检测详解(仅需5行代码学会3种面部特征点检测方法)(代码片段)

...点4.使用face_recognition检测面部特征点小结系列链接0.前言人脸处理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法 查看详情

给定 dlib 的 68 点面部标志,确定它们有多好

...面部地标检测。一般来说,这很有效。但是,dlib的人脸检测器有时会检测到(例如)只有一只眼睛可见或人的嘴巴不可见(或在极少数情况下是非人脸)的人脸。显然 查看详情

有没有办法在使用 dlib 检测面部标志后选择面部的特定点?

...间】:2021-07-2511:01:18【问题描述】:我正在使用Dlib的68点人脸界标预测器,它有68个点标记在人脸的各个区域,如下图所示:我已经设法从预测的地标中访问特定点,例如,我可以通过以 查看详情

使用 Dlib 进行面部标志检测

...ip安装它。pipinstalldlib会这样做。而this是一个使用dlib提取人脸地标的例子【讨论】: 查看详情

在基于 JavaScript 的面部标志检测中查找所有点的坐标

】在基于JavaScript的面部标志检测中查找所有点的坐标【英文标题】:Findingco-ordinatesofallpointsinJavaScriptBasedfaciallandmarkdetection【发布时间】:2020-11-0701:59:00【问题描述】:我必须使用JavaScript编程语言检测面部标志。为此,我看过thi... 查看详情

图像处理中面部标志点的归一化

...、愤怒等)相关的项目。我正在使用dlib库中的面部标志检测器,它检测到68个兴趣点。对于相同的情绪,这些兴趣点可能会因人脸的朝向、眼睛的大小、嘴唇的大小等在不同的脸上而有所不同。我想规范化 查看详情

人脸检测实战高级:使用opencvpython和dlib完成眨眼检测(代码片段)

...记和OpenCV检测视频流中的眨眼次数。为了构建我们的眨眼检测器,我们将计算一个称为眼睛纵横比(EAR)的指标,该指标由Soukupová和Čech在他们2016年的论文《使用面部标记的实时眨眼检测》中介绍。与计算眨眼的传统图像... 查看详情

地标检测与人脸识别

】地标检测与人脸识别【英文标题】:landmarkdetectionvsfacerecognition【发布时间】:2021-07-2613:37:36【问题描述】:人脸地标检测和人脸识别一样吗?或者它们是两个不同的东西?如果是,它们之间有何不同?任何澄清将不胜感激。... 查看详情

python深度学习实战:人脸关键点(15点)检测pytorch实现(代码片段)

引言人脸关键点检测即对人类面部若干个点位置进行检测,可以通过这些点的变化来实现许多功能,该技术可以应用到很多领域,例如捕捉人脸的关键点,然后驱动动画人物做相同的面部表情;识别人脸的面... 查看详情

将Vision人脸检测VNFaceLandmarkRegion2D点转换为要缩放的帧坐标

】将Vision人脸检测VNFaceLandmarkRegion2D点转换为要缩放的帧坐标【英文标题】:ConvertVisionfacedetectionVNFaceLandmarkRegion2Dpointsintoframecoordinatestobescale【发布时间】:2019-07-1407:01:41【问题描述】:我正在使用视觉框架来检测面部标志,它工... 查看详情

dlib的人脸地标检测程序中如何获取点坐标位置?

】dlib的人脸地标检测程序中如何获取点坐标位置?【英文标题】:Howtogetpointscoordinatepositioninthefacelandmarkdetectionprogramofdlib?【发布时间】:2017-02-0903:49:36【问题描述】:dlib中有一个示例python程序来检测面部标志位置。face_landmark_de... 查看详情

人脸检测实战终极:使用opencv和python进行人脸对齐(代码片段)

使用OpenCV和Python进行人脸对齐这篇博文的目的是演示如何使用OpenCV、Python和面部标志对齐人脸。给定一组面部标志(输入坐标),我们的目标是将图像扭曲并转换为输出坐标空间。在这个输出坐标空间中,整个数... 查看详情

面部特征点评价标准:

...)分别表示真实的面部特征点位置和检测的位置。ll是人脸检测器检测到的人脸box的宽度,如果误差大于5%,则认为检测失败。 查看详情

pyhton,opencv对象检测之——haar级联人脸及眼睛检测(代码片段)

...客将介绍如何使用预训练的模型——基于Haar特征的级联检测器进行人脸及眼睛检测。使用基于Haar特征的级联分类器的对象检测是一种有效的对象检测方法。它是一种基于机器学习的方法&# 查看详情

使用面部标志检测的numpy数组创建一个文本文件。?

】使用面部标志检测的numpy数组创建一个文本文件。?【英文标题】:Createantextfilewithnumpyarrayoffaciallanmarkdetection.?【发布时间】:2019-05-2502:45:13【问题描述】:我正在尝试制作具有面部标志检测代码的面部交换应用程序。但是,... 查看详情

面部特征点评价标准:

...)分别表示真实的面部特征点位置和检测的位置。ll是人脸检测器检测到的人脸box的宽度,如果误差大于5%,则认为检测失败。瞳孔距离也通常用作检测误差的标准化,但是对于侧脸的情况,瞳孔之间的距离比前侧人脸的瞳孔之间... 查看详情

人脸检测实战进阶:使用opencv进行活体检测(代码片段)

...您将学习如何使用OpenCV执行活体检测。您将创建一个活体检测器,该检测器能够在人脸识别系统中发现假人脸并执行反人脸欺骗。在教程的第一部分,我们将讨论活体检测,包括它是什么以及我们为什么需要它来改进... 查看详情