3、我们将看一些将面部标记检测应用于图像的结果。
什么是面部标记?
===================================================================
人脸标记点检测是形状预测问题的一个子集。给定一个输入图像(通常是一个指定感兴趣对象的ROI),形状预测器尝试沿形状定位感兴趣的关键点。
在人脸标记的背景下,我们的目标是使用形状预测方法检测人脸上的重要人脸结构。
因此,检测面部标记是一个两步过程:
步骤1:在图像中定位人脸。
步骤2:检测人脸ROI上的关键面部结构。
人脸检测(步骤1)可以通过多种方式实现。
我们可以使用OpenCV内置的Haar级联。
我们可以将预先训练好的HOG+线性SVM对象检测器专门用于人脸检测任务。
或者我们甚至可以使用基于深度学习的算法进行人脸定位。
无论哪种情况,用于检测图像中人脸的实际算法都无关紧要。相反,重要的是,通过某种方法,我们获得了面边界框(即,图像中面的(x,y)-坐标)。
给定面部区域,我们可以应用步骤2:检测面部区域中的关键面部结构。
有多种面部标记检测器,但所有方法基本上都试图定位和标记以下面部区域:
-
嘴
-
右眉
-
左眉
-
右眼
-
左眼
-
鼻
-
颌
dlib库中包含的面部标记检测器是Kazemi和Sullivan(2014)提出的一系列回归树的一毫秒面部校准的实现。
此方法首先使用:
-
图像上标记的面部标记的训练集。这些图像被手动标记,指定每个面部结构周围区域的特定(x,y)坐标。
-
先验,更具体地说,是输入像素对之间距离的概率。
给定该训练数据,训练回归树集合,以直接从像素强度本身估计面部标记位置(即,不进行“特征提取”)。
最终的结果是一个面部标记检测器,可用于实时检测具有高质量预测的面部标记。
dlib的面部标记检测器
=======================================================================
dlib库中预先训练的面部标记检测器用于估计映射到面部结构的68(x,y)坐标的位置。
68个坐标的索引可在下图中显示:
这些注释是68点iBUG 300-W数据集的一部分,dlib面部标记预测器是在该数据集上训练的。
值得注意的是,还有其他风格的面部标记检测器,包括可以在HELEN数据集上训练的194点模型。
无论使用哪一个数据集,都可以利用相同的dlib框架在输入训练数据上训练形状预测器-如果您想训练面部标记检测器或自定义形状预测器,这非常有用。
在这篇博文的剩余部分,我将演示如何在图像中检测这些面部标记。
使用dlib、OpenCV和Python检测面部标记
=====================================================================================
这篇博文使用到了imutils库face_utils.py中的两个函数。
第一个实用函数是rect_to_bb,是“矩形到边框”的缩写:
def rect_to_bb(rect):
#获取dlib预测的边界并将其转换
#按照我们通常使用的格式(x,y,w,h)
#使用OpenCV
x = rect.left()
y = rect.top()
w = rect.right() - x
h = rect.bottom() - y
返回一个元组 (x, y, w, h)
return (x, y, w, h)
此函数接受一个参数rect,该参数假定为dlib检测器(即面部检测器)生成的边框矩形。
rect对象包括检测的(x,y)-坐标。
然而,在OpenCV中,我们通常认为边界框是“(x,y,width,height)”,因此为了方便起见,rect_to_bb函数将这个rect对象转换为4元组坐标。
第二,shape_to_np函数:
def shape_to_np(shape, dtype=“int”):
#初始化(x,y)-坐标列表
coords = np.zeros((68, 2), dtype=dtype)
#在68个面部标记上循环并转换它们
#到(x,y)-坐标的2元组
for i in range(0, 68):
coords[i] = (shape.part(i).x, shape.part(i).y)
#返回(x,y)坐标的列表
return coords
dlib面部标记检测器将返回一个包含面部标记区域68(x,y)坐标的形状对象。
使用shape_to_np函数,我们可以将这个对象转换成一个NumPy数组。
有了这两个辅助函数,我们现在就可以检测图像中的面部标记了。
图像
打开一个新文件,将其命名为facial_landmarks.py,然后插入以下代码:
import the necessary packages
from imutils import face_utils
import numpy as np
import argparse
import imutils
import dlib
import cv2
#构造参数解析器并解析参数
ap = argparse.ArgumentParser()
ap.add_argument(“-p”, “–shape-predictor”, required=True,
help=“path to facial landmark predictor”)
ap.add_argument(“-i”, “–image”, required=True,
help=“path to input image”)
args = vars(ap.parse_args())
导入所需的Python包。
将使用imutils的face_utils子模块访问上面详述的助手函数。
然后将导入dlib。
解析我们的命令行参数:
–shape-predictor:这是通往dlib预先训练的面部标记检测器的路径。你可以在这里下载检测器模型,也可以使用本文的“下载”部分来获取代码+示例图像+预先训练过的检测器。
–image:我们要检测面部标记的输入图像的路径。
既然我们的导入和命令行参数已经处理完毕,让我们初始化dlib的面部检测器和面部标记预测器:
初始化dlib的人脸检测器(基于HOG)然后创建
面部标记预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args[“shape_predictor”])
初始化dlib的预训练人脸检测器,该检测器基于对用于对象检测的定向梯度标准直方图+线性SVM方法的修改。
然后使用提供的shape_predictor的路径加载面部标记预测器。
但是,在我们能够实际检测面部标记点之前,我们首先需要检测输入图像中的面部:
加载输入图像,调整大小,并将其转换为灰度
image = cv2.imread(args[“image”])
image = imutils.resize(image, width=500)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
在灰度图像中检测人脸
rects = detector(gray, 1)
通过OpenCV从磁盘加载我们的输入图像,然后通过调整图像大小使其具有500像素的宽度并将其转换为灰度来预处理图像。
处理检测图像中面的边界框。
探测器的第一个参数是我们的灰度图像(尽管这种方法也可以用于彩色图像)。
第二个参数是在应用检测器之前放大图像时要应用的图像金字塔层的数量(这相当于在图像上计算cv2.N次)。
在人脸检测之前提高输入图像分辨率的好处是,它可能允许我们检测图像中的更多人脸-缺点是输入图像越大,检测过程的计算成本就越高。
给定图像中人脸的(x,y)-坐标,我们现在可以对每个人脸区域应用人脸标记检测:
循环面部检测
for (i, rect) in enumerate(rects):
确定面部区域的面部标志,然后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新文章来源:https://www.toymoban.com/news/detail-849470.html
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
0.png)
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
[外链图片转存中…(img-13Ozzt1z-1711821452906)]文章来源地址https://www.toymoban.com/news/detail-849470.html
到了这里,关于人脸检测进阶:使用 dlib、OpenCV 和 Python 检测面部标记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!