人脸识别中常用的人脸检测和人脸对齐

article/2025/9/23 14:56:05

人脸检测和人脸对齐是人脸识别的前提,也是进行一切人人脸相关的人脸项目的开始步骤,本文将从常用的人脸检测的数据集,以及现在公用的比较好的方法开始讲述。

人脸检测常用的数据集

人脸检测的测试数据库有很多,这里仅选择FDDB和WIDER FACE,这个两个数据库都有官方长期维护,各种算法都会提交结果进行比较,而且很多早期数据库目前都已经饱和,没有比较意义。

第一个是2010年非约束环境人脸检测数据库FDDB:
FDDB总共2845张图像,5171张,人脸非约束环境,人脸的难度较大,有面部表情,双下巴,光照变化,穿戴,夸张发型,遮挡等难点,是目标最常用的数据库。有以下特点:

图像分辨率较小,所有图像的较长边缩放到450,也就是说所有图像都小于450450,最小标注人脸2020,包括彩色和灰度两类图像;

每张图像的人脸数量偏少,平均1.8人脸/图,绝大多数图像都只有一人脸;数据集完全公开

有其他隔离数据集无限制训练再FDDB测试,和FDDB十折交叉验证两种,鉴于FDDB图像数量较少,近几年论文提交结果也都是无限制训练再FDDB测试方式,所以,如果要和published methods提交结果比较,请照做。山世光老师也说十折交叉验证通常会高1~3%。

结果有离散分数discROC和连续分数contROC两种,discROC仅关心IoU是不是大于0.5,contROC是IoU越大越好。鉴于大家都采用无限制训练加FDDB测试的方式,detector会继承训练数据集的标注风格,继而影响contROC,所以discROC比较重要,contROC看看就行了,不用太在意。

FDDB在非深度学习的年代是极具挑战性的,很少能做到2000误检0.9以上,经典VJ detector在2000误检也只有0.6593,但在深度学习的年代,这个数据库目前也快接近饱和了,FDDB可以看做是资格赛,选手的正式水平请看下面的WIDER FACE。

第二个是目前2016年提出的,目前难度最大的WIDER FACE WIDER FACE: A Face Detection Benchmark:

Yang S, Luo P, Loy C C, et al. Wider face: A face detection benchmark [C]// CVPR, 2016: 5525-5533.

WIDER FACE总共32203图像,393703标注人脸,目前难度最大,各种难点比较全面:尺度,姿态,遮挡,表情,化妆,光照等。有以下特点有:

图像分辨率普遍偏高,所有图像的宽都缩放到1024,最小标注人脸10*10,都是彩色图像;

每张图像的人脸数据偏多,平均12.2人脸/图,密集小人脸非常多;

分训练集train/验证集val/测试集test,分别占40%/10%/50%,而且测试集的标注结果(ground truth)没有公开,需要提交结果给官方比较,更加公平公正,而且测试集非常大,结果可靠性极高;

根据EdgeBox的检测率情况划分为三个难度等级:Easy, Medium, Hard。

WIDER FACE是目前最常用的训练集,也是目前最大的公开训练集,人工标注的风格比较友好,适合训练。总之,WIDER FACE最难,结果最可靠(顶会论文也有不跑WIDER FACE的,即使论文中用WIDER FACE训练),论文给出经典方法VJ, DPM, ACF和Faceness在这个库上的性能水平,可以看出难度确实很大。

参考链接:https://blog.csdn.net/App_12062011/article/details/80537518

人脸识别中常用的人脸检测算法

人脸识别中经常用到dlib以及opencv封装的人脸检测函数主要介绍两个:HOG特征的人脸检测,具体介绍参考连接,一个是CNN人人脸检测,使用的方法是基于 Maximum-Margin Object Detector ( MMOD ),该模型训练的过程比较简单,不需要大量的训练集,[更多的训练内容可以参考连接]( Maximum-Margin Object Detector ( MMOD )),模型参数下载连接.更多的opencv以及dlib人脸检测的方法以及性能对比参考网页,更多的dlib的操作和示例代码参考连接

dlib 中常用的CODE

detector= dlib.get_frontal_face_detector() # HOG特征检测人脸
faceRects = detector(frameDlibHogSmall, 1) # 参数1表示我们对图像进行向上采样1倍,这将使一切变的更大,进而让我们检测出更多的人脸
for faceRect in faceRects: #输出检测框x1 = faceRect.left()y1 = faceRect.top()x2 = faceRectdetector.right()y2 = faceRect.bottom()dnnFaceDetector = dlib.cnn_face_detection_model_v1("./mmod_human_face_detector.dat")
faceRects = dnnFaceDetector(frameDlibHogSmall, 0)
for faceRect in faceRects:x1 = faceRect.rect.left()y1 = faceRect.rect.top()x2 = faceRect.rect.right()y2 = faceRect.rect.bottom()

进一步得到人脸检测框后可以根据已经训练好的人脸68个点的特诊检测器来对检测到的人脸的轮廓特征提取。具体使用的函数为dlib.shape_predictor(‘shape_predictor_68_face_landmarks.dat’),模型下载链接
具体实现代码:

import numpy as np
import cv2
import dlibdetector = dlib.get_frontal_face_detector() # 使用HOG特征得到人脸框,同样可以使用dlib中的cnn
predictor = dlib.shape_predictor('/home/zhoujie/model/dlib_model/shape_predictor_68_face_landmarks.dat')# cv2读取图像
img = cv2.imread("picture.jpg")# 取灰度
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)# 人脸数rects
rects = detector(img_gray, 0)
for i in range(len(rects)):landmarks = np.matrix([[p.x, p.y] for p in predictor(img, rects[i]).parts()]) # 使用predictor来获取人脸中的轮廓部分for idx, point in enumerate(landmarks):# 68点的坐标pos = (point[0, 0], point[0, 1])print(idx+1, pos)# 利用cv2.circle给每个特征点画一个圈,共68个cv2.circle(img, pos, 2, color=(0, 255, 0))# 利用cv2.putText输出1-68font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img, str(idx+1), pos, font, 0.8, (0, 0, 255), 1,cv2.LINE_AA)cv2.namedWindow("img", 2)
cv2.imshow("img", img)
cv2.waitKey(0)

在这里插入图片描述
得到人脸轮廓中的数据后根据之前加载的68个点的模板进行对齐,具体的实现代码如下。PS:当检测到的人脸为侧脸的时候提取到的关键点不足以进行仿射变换的时候,将不对其进行处理。所有一般要保证编号为10-37,43-47的关键点,也就是鼻子、左眼、右眼及上嘴唇部分的基准关键点存在,然后根据这些基准关键点集合计算相似变换矩阵。具体实现代码如下:

import cv2
import dlib
import sys
import numpy as np
import ospredicter_path =  '/model/shape_predictor_68_face_landmarks.dat'
face_file_path =  '/faces/inesta.jpg'# 要使用的图片,图片放在当前文件夹中
# 导入人脸检测模型
detector = dlib.get_frontal_face_detector() 
# 导入检测人脸特征点的模型
sp = dlib.shape_predictor(predicter_path)# 读入图片
bgr_img = cv2.imread(face_file_path)
if bgr_img is None:print("Sorry, we could not load '{}' as an image".format(face_file_path))exit()# opencv的颜色空间是BGR,需要转为RGB才能用在dlib中
rgb_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2RGB)
# 检测图片中的人脸
dets = detector(rgb_img, 1)
# 检测到的人脸数量
num_faces = len(dets)
if num_faces == 0:print("Sorry, there were no faces found in '{}'".format(face_file_path))exit()# 识别人脸特征点,并保存下来
faces = dlib.full_object_detections()
for det in dets:faces.append(sp(rgb_img, det))# 人脸对齐,当关键点较少时不做对齐处理
images = dlib.get_face_chips(rgb_img, faces, size=320)
# 显示计数,按照这个计数创建窗口
image_cnt = 0
# 显示对齐结果
for image in images:image_cnt += 1cv_rgb_image = np.array(image).astype(np.uint8)# 先转换为numpy数组cv_bgr_image = cv2.cvtColor(cv_rgb_image, cv2.COLOR_RGB2BGR)# opencv下颜色空间为bgr,所以从rgb转换为bgrcv2.imshow('%s'%(image_cnt), cv_bgr_image)cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
更多的dlib人脸检测以及opencv中的人来鸟检测和对齐方法参考githuh

MTCNN 人脸检测

网络基本原理

主要解决的是人脸检测以及人脸对齐的问题。提出了三个层级的网络 PNet、RNet、 ONet三个层级网络。由粗略检测到精细检测。逐步实现最终的人脸检测和人脸对其。在FDDB和WIDER FACE两个数据集中的人脸检测以及AFLW数据集中的人脸对齐任务任务达到 state-of-the-art。在实时应用中达到较好的即时性。
在这里插入图片描述
网络的主要框架如上图所示:首先针对图片中人脸的大小可能不一的情况按照将图片按照一定的比例不断的resize到不同的尺寸作为输入。
MTCNN主要包括三层网络,

  1. 首先第一层P-Net将经过卷积,池化操作后输出两个分支分别是分类(对应像素点是否存在人脸)和回归(回归box)。作者在原文中有三各输出分支,实际应用中两个输出分支即可。
  2. 第二层网络将第一层输出的结果使用非极大抑制(NMS)来去除高度重合的候选框,并将这些候选框放入R-Net中进行精细的操作,拒绝大量错误框,再对回归框做校正,并使用NMS去除重合框,输出分支同样两个分类和回归,作者在原文中有三各输出分支,实际应用中两个输出分支即可。
  3. 最后将R-Net输出认为是人脸的候选框输入到O-Net中再一次进行精细操作,拒绝掉错误的框,此时输出分支包含三个分类:否有人脸,2个输出、回归:回归得到的框的起始点的xy坐标和框的长宽,4个输出、人脸特征点定位:5个人脸特征点的xy坐标,10个输出。
    框架结构如下:
    在这里插入图片描述

根据上述网络结构检测出人脸后得出人脸对应的box以及5个人脸特征点,在给定5个点的temple的基础上进行仿射变换得到对齐的人脸。

网络实现过程

http://chatgpt.dhexx.cn/article/lhoDQToA.shtml

相关文章

人脸对齐—级联回归模型和深度学习模型

人脸对齐任务即根据输入的人脸图像,自动定位出面部关键特征点,如眼睛、鼻尖、嘴角点、眉毛以及人脸各部件轮廓点等,如下图所示。 这项技术的应用很广泛,比如自动人脸识别,表情识别以及人脸动画自动合成等。由于不同的姿…

MTCNN 人脸检测 人脸对齐

MTCNN 人脸检测 人脸对齐 flyfish 总体 Loss Stage 0:Image Pyramid 假设图片的宽度是640,高度是480 MIN_DET_SIZE12 minsize70 factor0.709 0.1714285710.709 那么金字塔窗口大小分别是 wh:110,83 wh:78,59 wh:56,42 wh:40,30 wh:28,21 wh:20,1计算过程如下 从640和480…

人脸检测实战终极:使用 OpenCV 和 Python 进行人脸对齐

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

人脸预处理:人脸检测+人脸对齐

1 简介 对于人脸识别任务,人脸预处理至关重要。首先我们需要检测出图像中的人脸,然后通过人脸相似性变换得到对齐后的标准人脸。然后在对其进行人脸识别。在人脸识别过程中,往往检测到的人脸是倾斜的。相似性变换根据检测到的关键点和目标点…

dlib人脸配准(人脸对齐)

dlib人脸配准有两种方式。 一种是使用 get_face_chip()方法,使用5个关键点模型来进行配准,这种方法Dlib已经提供了完整的接口(imutils里也有类似函数, face_utils.FaceAligner,代码放在最后面)另一种是自己使用68点关键点模型&am…

基于OpenCV的人脸对齐步骤详解及源码实现

目录 1. 前言2. 人脸对齐基本原理与步骤3. 人脸对齐代码实现 1. 前言 在做人脸识别的时候,前期的数据处理过程通常会遇到一个问题,需要将各种人脸从不同尺寸的图像中截取出来,再进行人脸对齐操作:即将人脸截取出来并将倾斜的人脸…

人脸识别 (4) 人脸对齐

参考:FaceDetector/face_align.ipynb at master faciallab/FaceDetector GitHub 中文:从零开始搭建人脸识别系统(二):人脸对齐 - 知乎 Face Alignment Step-by-Step 1、Align Faces by Spatial Transform Operati…

OpenCV实现人脸对齐

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达 一、人脸对齐介绍 在人脸识别中有一个重要的预处理步骤-人脸对齐,该操作可以大幅度提高人脸识别的准确率与稳定性,但是早期的OpenCV版本不支持人…

人脸对齐(一)--定义及作用

参考: http://www.thinkface.cn/thread-4354-1-1.html http://www.thinkface.cn/thread-4488-1-1.html 人脸对齐任务即根据输入的人脸图像,自动定位出面部关键特征点,如眼睛、鼻尖、嘴角点、眉毛以及人脸各部件轮…

人脸关键点对齐

转:https://www.jianshu.com/p/e4b9317a817f 摘要: 从传统方法到深度学习方法,对人脸关键点定位/人脸对齐的发展进行梳理,对该领域中经典的方法,最新成果进行汇总,并给出相应的paper原文,项目主…

人脸对齐介绍

转自:https://cloud.tencent.com/community/article/532672 一、 人脸对齐,也叫做人脸特征点检测,图为人脸特征点例子 二、 人脸对齐有哪些应用? 1 五官定位 2 表情识别 3 人脸漫画、素描生成 4 增强现实 5 换脸 6 3D建模 三、 人…

常见的人脸对齐方法 python

人脸对齐 1. 通过Dlib库 1.1.环境需求: opencv-python dlib下载dlib库的68关键点文件: http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 然后解压后得到shape_predictor_68_face_landmarks.dat。 其次,下面可能需要有一…

QGIS中也有“fishnet”——QGIS怎么生成渔网

QGIS堪称Mac上的ArcGIS,免费小巧,插件丰富,比ArcGIS更容易上手。今天分享的是如何在QGIS中生成规则网格,也就是ArcGIS中的fishnet功能怎么在QGIS中完美实现。 # 环境声明:QGIS3.10 MacOS10.15.6 # 分享背景&#xff…

ArcMap Fishnet生成规则网格

在利用ArcGIS处理数据时,有时需要对整个工作区域进行规则网格划分,这个在ArcGIS中是一件非常简单的事情,现在就将利用ArcGIS生成规则网格的步骤详细的介绍一下。 首先我有一个工作的范围,比如图一所示的范围: 我要在研…

POJ 1408 Fishnet

题目大意: 有一个1*1的正方形,分别给出下,上,左,右边每个边上的n个点,对边对应点连线,问这些线段相交的最大的四边形面积是多少(面积最大的定义是必须当前面积内没有更小的四边形内…

创建渔网工具

创建渔网(create fishnet)工具是指创建由矩形像元组成的渔网。输出可以是折线或面要素。创建渔网需要三条基本信息:渔网的空间范围、行数和列数以及旋转的角度。要指定这些基本信息可通过多种方法。例如,您可能不确定准确的行数和…

ARCGIS怎么在地图上绘制长宽500m*500m的fishnet

用的是ArcGIS 10.6的版本。 参考教程:https://my.oschina.net/u/4416039/blog/3308651 首先先导入深圳市的shp文件 Layers右键,点击Properties 需要将坐标系改成投影坐标系 点击Projected Coordinate Systems 点击UTM 点击WGS 1984 选择WGS 1984 UT…

fishboat

渔船产品功能说明文档1.0 线上地址:http://101.200.121.215:9090/ git前端: https://gitee.com/cinblx/fishboat-ui.git git后端:https://gitee.com/cinblx/fishboat-server.git 产品介绍 为什么使用该产品 该产品致力于两方面。1.实现基础功能&#xff…

文献阅读笔记5——《Composited FishNet: Fish Detection and Species Recognition From Low-Quality ...》

《Composited FishNet: Fish Detection and Species Recognition From Low-Quality Underwater Videos》 写文章模板论文 Abstact 重要意义:水下视频中鱼类的自动检测和识别对于渔业资源评估和生态环境监测具有重要意义。 问题和挑战:由于水下图像质量…

使用Arc Map创建渔网(fishnet)

使用Arc Map创建渔网(fishnet) 工具位置:ArcToolbox----数据管理工具----采样----创建渔网 (Arcgis 10.2以上版本)(找不到工具可以ControlF选择工具项搜索) 添加图层,设置坐标系&am…