dlib库的68特征原理人脸关键点检测原理

ph-one ph-one     2023-03-21     482

关键词:

摘录一些资料

来自:https://blog.csdn.net/ebzxw/article/details/80441556

shape_predictor_68_face_landmarks.dat是已经训练好的人脸关键点检测器。

dlib_face_recognition_resnet_model_v1.dat是训练好的ResNet人脸识别模型。

(说明:ResNet是何凯明在微软的时候提出的深度残差网络,获得了 ImageNet 2015 冠军,通过让网络对残差进行学习,在深度和精度上做到了比 CNN 更加强大。)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

68特征原理人脸关键点检测

转载:https://blog.csdn.net/jiajinrang93/article/details/72297975

1.概述
文章名称:One Millisecond Face Alignment with an Ensemble of Regression Trees 
文章来源:2014CVPR 
文章作者:Vahid Kazemi ,Josephine Sullivan 
简要介绍:One Millisecond Face Alignment with an Ensemble of Regression Trees算法(以下简称GBDT)是一种基于回归树的人脸对齐算法,这种方法通过建立一个级联的残差回归树(GBDT)来使人脸形状从当前形状一步一步回归到真实形状。每一个GBDT的每一个叶子节点上都存储着一个残差回归量,当输入落到一个节点上时,就将残差加到改输入上,起到回归的目的,最终将所有残差叠加在一起,就完成了人脸对齐的目的。

在逐步详细介绍GBDT之前,按照惯例,先介绍人脸对齐的基本概念和原理。

2.人脸对齐(Face Alignment)基本概念及原理
基本概念:人脸识别(face recognizaton)按顺序可以大体上分为四个部分,即人脸检测(face detection),人脸对齐(face alignment),人脸校验(face verification)和人脸识别(face identification)。 人脸检测就是在一张图片中找到人脸所处的位置,即将人脸圈出来,比如拍照时数码相机自动画出人脸。人脸对齐就是在已经检测到的人脸的基础上,自动找到人脸上的眼睛鼻子嘴和脸轮廓等标志性特征位置。人脸校验就是判断两张脸是不是同一个人。人脸识别就是给定一张脸,判断这张脸是谁。 
本文研究其中的第二部分,人脸对齐。 
人脸对齐中的几个关键词: 
形状(shape):形状就是人脸上的有特征的位置,如下图所示,每张图中所有黄点构成的图形就是该人脸的形状。 
特征点(landmark):形状由特征点组成,图中的每一个黄点就是一个特征点。

人脸对齐的最终目的就是在已知的人脸方框(一般由人脸检测确定人脸的位置)上定位其准确地形状。 
人脸对齐的算法主要分为两大类:基于优化的方法(Optimization-based method)和基于回归的方法(Regression-based method)。 
本文的方法属于基于回归的方法。

3.从“树”的概念开始
树的思想在机器学习算法中可谓是鼎鼎大名,非常常用的决策树、二叉树等,以及由树构成的随机森林等算法,都在各种领域被广泛使用,甚至延伸出了诸如“随机蕨”等类树的结构。树不仅多种多样,其应用也绝不仅仅局限于分类,例如本文就将树的思想应用在回归的领域,而非常流行的CART分类回归树也是其中一种,甚至还有采用树的结构来提取特征的方法(3000FPS)。

如果大家理解随机森林,那么对本文的GBDT可能会更好理解一点。简单来说随机森林就是将很多棵决策树联合在一起,其中每一棵树的训练采用的是随机数量的样本和随机的特征,其实也是集成学习的思想的表现之一。

而本文的GBDT,相比与随机森林,其实本质上差别不是很大,主要差别在于: 
1)每一棵树之间的关系是串行的,并非是并行的关系,也就是说后一棵树的建立在前一棵树的基础之上。 
2)每一棵树的叶子节点上存的是残差,这也是GBDT的特点之一,也只有通过叶子节点上保存的残差,才能使形状不断地回归,从而回归到真实形状。

下面直接介绍这种方法。

4.人脸对齐中的一棵GBDT
假设我要开始构建一棵GBDT,注意,这里的一棵GBDT的概念不是指一棵树,而是指很多棵树,很多棵树构成一个GBDT,所以说GBDT的地位类似与随机森林,都是由树集成构成的。 
构建一棵GBDT要实现的目的是:通过这棵树,将人脸的初始形状回归到其真实形状上去(这是测试时的目的,训练时,也就是构建树时我们是知道其真实形状的,那么目的自然就是用GBDT来表示初始形状和真实形状的关系)。

假设我们一共有N幅图像,将它们作为训练样本,我们知道这N幅图像的每一个真实形状。首先我们要获得一个回归的初始形状,假设我们用所有图像的平均形状来作为这个初始形状(初始形状就是回归的起点,之后在测试时无论给出怎样一幅图像,我们都通过这个初始形状来进行预测和回归)。在原论文中,在训练时,作者并非只使用了初始形状,而是随机挑选另一个真实形状来作为某一幅图像的初始形状,这种做法我们先不讨论,首先讨论如何构建一棵GBDT。

现在开始构建GBDT的第一棵树。 
有了初始形状,这里就会发现一个问题,假如使用平均形状来作为每一幅图像的初始形状,那么对所有图像来说,初始输入都是相同的,这如何分裂树呢?是的,对所有图像来说,初始形状相同,但我们分裂树时,采用的输入并非是当前形状,而是依据当前形状从该图片中提取出的特征。对于每一幅图像来说,初始形状虽然相同,但每一幅图片都不同,因此提取出的特征也就不同,论文中是使用的像素差作为特征,下一节会详细讲这种特征的提取方式。我们依据特征来进行节点的分裂操作,直至到达树的叶子节点。

当我们把N张图片都输入这第一棵树,自然每一张图片最终都会落入其中的一个叶子节点,比如第1张图片落入了第3个叶子节点,第2张图片落入了第1个叶子节点,第3张图片落入了第三个叶子节点等等。这样,每一个叶子节点中都会有图片落入,当然也可能没有,这无所谓。这时,我们就要计算残差,计算每一个图片的当前形状和真实形状的差值,之后,在同一个叶子节点中的所有图片的差值作平均,就是该叶子节点应当保存的残差。当所有叶子节点都保存了残差后,第一棵树也就构造完毕了。

在构造第二棵树之前,我们要把每张图片的当前形状做一个更新,也就是要将当前形状更新成:当前形状+残差。对应到第一棵树,即是初始形状加上残差,这样每一张图片的当前形状就从初始形状变成了初始形状加残差,距离真实形状又更近了一步。

之后再用同样的方法构建第二棵树,依据特征进行节点分裂,直到叶子节点。在叶子节点中计算每一张图片当前形状和真实形状的差,然后取平均,将这个平均值保存在该叶子节点中,作为残差。之后更新每一张图片的当前形状,即将叶子节点中保存的残差加上其当前形状,作为新的当前形状,然后就可以建立第三棵树了。

直至建立的树足够多,可以最后的当前形状表示真实形状,那么这一个GBDT也就建立完成了。

还有一个问题没有解决,那就是GBDT中的每一棵树是怎样分裂的,下面详细叙述分裂的方法。

5.树的接点分裂和像素差特征
对于一棵GBDT(很多棵子树构成)而言,我们要建立一个特征池,这个特征池里是我们随机挑选的一些点的坐标,然后对于每一幅图像,这些点都对应着不同的像素值,因此,在树的节点分裂时,我们首先会在这合格特征池中随机挑选两个点,然后计算每一张图片在这两个点处的像素值,然后计算每一张图片的这两个点处的像素值的像素差,之后随机产生一个分裂阈值,根据这个阈值进行判断,如果一幅图像的像素差小于这个阈值,就往左分裂,否则往右分裂,将所有图片都这样判断一次,就将所有图片分成了两部分,一部分在左,一部分在右。我们重复上面这个过程若干次,看看哪一次分裂的好(判断是否分裂的好的依据是方差,如果分在左边的样本的方差小,这说明它们是一类,分的就好),就把这个分裂的好的选择保存下来,即保存下这两个点的坐标值和分裂阈值。这样一个节点的分裂就完成了。然后每一个节点的分裂都按照这个步骤进行,直到分裂到叶子节点。 
6.作者的实验结果 
原论文作者一共建立了10棵GBDT,每一个GBDT中包含500棵树,10棵GBDT的意思就是,每一棵GBDT都是相互独立的,一共有10个相互独立的特征池。作者的每一个特征池中有400个点,在同一棵GBDT中,每次节点分裂,都从这400个点中挑选出20对点并随机产生20个阈值,然后进行分裂,看看哪一对点分裂的结果方差最小,就将其作为分裂的依据。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

原文:https://blog.csdn.net/qq_38409301/article/details/89375062

基于dlib的人脸检测(68关键点)(代码片段)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目目录文章目录前言一、背景(1)环境搭建(2)下载开源数据集二、具体实现效果展示:效果展示:总结前言imutils... 查看详情

dlib实现人脸的68点检测

Dlib实现68点标定效果图展示:主要是通过68点的模型进行提取脸部的68点的特征值。(相应细节都已经注释)//设置人脸的标记点#include<dlibopencv.h>#include<opencv2opencv.hpp>#include<dlibimage_processingfrontal_face_detector.h>#include< 查看详情

图片人脸检测——dlib版

...OpenCVDlib更多的人脸识别模型,可以检测脸部68甚至更多的特征点效果展示人脸的68 查看详情

人脸识别完整项目实战(14):实时人脸特征点标定程序设计

...是《人脸识别完整项目实战》系列博文第14章《实时人脸特征点标定程序设计》,本章内容详细介绍Win10环境下,基于VisualStudio2015+Opencv+Dlib开发环境,如何实现实时视频流人脸特征点标定程序的设计。本文内容已经同步录制成视... 查看详情

人脸识别完整项目实战:完整项目案例运行演示

...设计篇:从实时视频采集开始,涵盖人脸区域检测、人脸特征点标定、人脸对齐、人脸比对和活体检测等全部技术环节的代码设计、运行演示和执行结果输出;模型训练篇:基于人脸识别区域检测和人俩识别特征点标定两个应用... 查看详情

opencv+dlib实现疲劳检测(代码片段)

目录(1)锁定眼睛部分关键点(2)EAR(2)设置参数(3)对视频的每一帧进行判断本文基于OpenCV并利用dlib工具包,通过实时计算EAR值来统计眨眼次数实现了疲劳检测。步骤:首先对对检测到的人脸进行关键点定位并锁定眼睛部分的关键点... 查看详情

人脸人脸特征点检测

人脸特征点检测算法:PFLD人脸关键点检测之PFLD_pfld优化_AI算法-图哥的博客-CSDN博客特征点数量:正脸68个、侧脸39个特征点Menpo2D数据集:包含正脸和侧脸,正脸特征点标注了68个特征点,侧脸特征点标注了39个... 查看详情

用dlib进行简单的人脸特征提取特征向量到csv文件中,用knn进行预测识别(代码片段)

...大致分为以下过程:1)模型准备:下载并部署一个人脸特征提取模型(功能包括人脸检测、人脸特征提取,不限算法,比如dlib.paddlehub等)需要的准备好的Dlib两个模型为dlib_face_recognition_resnet_model_v1.datshape_predictor_68_face_landm... 查看详情

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

...间】:2018-05-0614:52:48【问题描述】:我正在使用dlib进行人脸检测,然后进行68点面部地标检测。一般来说,这很有效。但是,dlib的人脸检测器有时会检测到(例如)只有一只眼睛可见或人的嘴巴不可见(或在极少数情况下是非... 查看详情

级联分类器原理

...计。基于知识的人脸检测方法主要包括:模板匹配,人脸特征,形状与边缘,纹理特征,颜色特征。基于统计的人脸检测方法主要包括:主成分分析与特征脸法,神经网络模型,隐马尔可夫模型,支持向量机,Adaboost算法。基于... 查看详情

无法安装人脸检测dlib库的解决方法(代码片段)

1.引言dlib库是一个用来人脸关键点检测的Python库,但因为其是C++编写(或需要C++编译?),使得在安装时可能会遇到各种各样问题。笔者在安装时遇到问题后,搜索了一些博客,看到了一些... 查看详情

dlib人脸关键点检测的模型分析与压缩

...m博客原文(排版更精美):https://www.miaoerduo.com/c/dlib人脸关键点检测的模型分析与压缩.htmlgithub项目:https://github.com/miaoerduo/dlib-face-landmark-compression 人脸关键点检测的技术在很多领域上都 查看详情

在线会议中人脸面部轮廓图像提取——dlib库人脸面部轮廓图像特征提取(代码片段)

...部轮廓图像提取(二)——HOG人脸面部轮廓图像特征提取,介绍完HOG特征提取我们继续学习Dlib库提取特征叭!1、人脸轮廓图像提取原理在我们检测到人脸区域之后,接下来 查看详情

基于tensorflow2.x从零训练15点人脸关键点检测模型(代码片段)

一、人脸关键点检测数据集在计算机视觉人脸计算领域,人脸关键点检测是一个十分重要的区域,可以实现例如一些人脸矫正、表情分析、姿态分析、人脸识别、人脸美颜等方向。人脸关键点数据集通常有5点、15点、68点... 查看详情

视频是不能p的系列:使用dlib实现人脸识别

...在此基础上实现了某种相对有趣的应用。譬如,利用人脸特征点提取面部轮廓并生成表情包、将图片中的人脸批量替换为精神污染神烦狗等等。当然,在真实的应用场景中,如果只是检测到人脸,那显然远远不够的,我们更希望... 查看详情

视频是不能p的系列:使用dlib实现人脸识别

...在此基础上实现了某种相对有趣的应用。譬如,利用人脸特征点提取面部轮廓并生成表情包、将图片中的人脸批量替换为精神污染神烦狗等等。当然,在真实的应用场景中,如果只是检测到人脸,那显然远远不够的,我们更希望... 查看详情

dlib代码解读人脸关键点检测器的训练

1.源代码先给出测试的结果,关键点并不是特别准,原因是训练样本数据量太少。以下给出完整的人脸关键点检测器训练代码。详细的代码解读请看第二部分。/*faceLandmarksTrain.cppfunction:借助dlib训练自己的人脸关键点检测器(参考dl... 查看详情

dlib+opencv库实现疲劳检测(代码片段)

文章目录1.关键点检测2.算法实现的核心点3.算法实现(1)人脸的关键点集合(2)加载人脸检测库和人脸关键点检测库(3)绘制人脸检测的框(4)对检测之后的人脸关键点坐标进行转换(5)... 查看详情