(三)混合边缘AI人脸对齐

article/2025/9/23 14:34:27

目录

介绍

对齐算法

算法的实现

向检测器添加人脸对齐

修改对齐算法

下一步


在这里,我们将简要说明如何在Raspberry Pi上安装MTCNNTensorFlowKeras。然后我们在视频文件上启动人脸检测以测试性能,然后简要说明如何在实时模式下运行检测。最后,我们看看如何使用运动检测器加快检测速度。

  • 下载源 - 152.7 KB
  • 下载帧 - 3.1 MB
  • 下载面孔 - 2.7 MB
  • 下载数据库 - 531.6 KB

介绍

人脸识别是人工智能(AI)的一个领域,深度学习(DL)在过去十年中取得了巨大成功。最好的人脸识别系统可以以与人类相同的精度识别图像和视频中的人物,甚至更好。人脸识别的两个主要基础阶段是人员验证和身份识别。

在本系列文章的前半部分(当前)中,我们将:

  • 讨论现有的AI人脸检测方法并开发程序来运行预训练的DNN模型
  • 考虑面部对齐并使用面部标志实现一些对齐算法
  • 在Raspberry Pi设备上运行人脸检测DNN,探索其性能,并考虑可能的方法来更快地运行它,以及实时检测人脸
  • 创建一个简单的人脸数据库并用从图像或视频中提取的人脸填充它

我们假设您熟悉DNNPythonKeras TensorFlow

在上一篇文章中,我们实现了基于现代AI方法的通用面部识别系统的第一阶段——面部检测。在本文中,我们将讨论管道的第二阶段——面部对齐——基于OpenCV库中的透视变换函数。这不是强制性阶段。但是,它可以提高识别精度,并且一直用于现实生活中的面部识别软件。

对齐算法

简而言之,人脸对齐是一种将从图像或视频帧中提取的人脸图片转换为指定方向、位置和比例的算法。在人脸识别必须在现实生活中的图像和框架中,人脸可以在各种角度和各种比例因子下出现。下图显示了相对于相机视图处于不同位置的同一张脸。

1 – 脸向右旋转

2 – 脸向一侧倾斜

3 – 脸向左旋转

4 – 脸向下倾斜

人脸对齐的目标是将人脸拟合到相同大小的图像中,并标准化人脸视图:将人脸居中于图像内;相对于图像缩放面部,依此类推。

面部对齐可以使用各种算法,具体取决于有关面部及其位置的可用信息。我们将使用MTCNN模型,因为我们知道人脸的边界框在2D图像中并且有五个面部标志位置(关键点)。我们需要开发一种转换,使用面部的关键点将其带入标准视图。

幸运的是,我们不需要重新发明轮子。在计算机视觉中,这种变换被称为透视变换,用OpenCV库实现起来相对容易。我们只需要在源图像中选择四个点,在目标图像中选择四个匹配点。

看看下面的图片。在左侧,我们绘制了使用MTCNN算法找到的关键点。在右侧,我们显示了可以根据三个关键点的已知坐标计算的三个点:12 3

6位于点1和点2之间。点78与关键点12一起形成平行四边形。点17之间的距离与点28之间的距离相同,是点63之间距离的两倍。所以点3是平行四边形的中心。

算法的实现

让我们使用平行四边形的四个角来实现透视变换算法:

class Face_Align:    def __init__(self, size):self.size = sizedef align_point(self, point, M):(x, y) = pointp = np.float32([[[x, y]]])p = cv2.perspectiveTransform(p, M)return (int(p[0][0][0]), int(p[0][0][1]))def align(self, frame, face):(x1, y1, w, h) =  face['box'](l_eye, r_eye, nose, mouth_l, mouth_r) = Utils.get_keypoints(face)(pts1, pts2) = self.get_perspective_points(l_eye, r_eye, nose, mouth_l, mouth_r)s = self.sizeM = cv2.getPerspectiveTransform(pts1, pts2)dst = cv2.warpPerspective(frame, M, (s, s))f_aligned = copy.deepcopy(face)f_aligned['box'] = (0, 0, s, s)f_img = dstl_eye = self.align_point(l_eye, M)r_eye = self.align_point(r_eye, M)nose = self.align_point(nose, M)mouth_l = self.align_point(mouth_l, M)mouth_r = self.align_point(mouth_r, M)f_aligned = Utils.set_keypoints(f_aligned, (l_eye, r_eye, nose, mouth_l, mouth_r))return (f_aligned, f_img)class Face_Align_Nose(Face_Align):    def get_perspective_points(self, l_eye, r_eye, nose, mouth_l, mouth_r):(xl, yl) = l_eye(xr, yr) = r_eye(xn, yn) = nose(xm, ym) = ( 0.5*(xl+xr), 0.5*(yl+yr) )(dx, dy) = (xn-xm, yn-ym)(xl2, yl2) = (xl+2.0*dx, yl+2.0*dy)(xr2, yr2) = (xr+2.0*dx, yr+2.0*dy)s = self.sizepts1 = np.float32([[xl, yl], [xr, yr], [xr2, yr2], [xl2, yl2]])pts2 = np.float32([[s*0.25, s*0.25], [s*0.75, s*0.25], [s*0.75, s*0.75], [s*0.25,s*0.75]])return (pts1, pts2)

上面的代码包含两个类。基类Face_Align使用OpenCV库中的两个函数:getPerspectiveTransformwarpPerspective实现转换算法。第一个函数计算变换矩阵,第二个函数用矩阵变换图像。计算透视图矩阵的点必须由get_perspective_points方法提供。方法的具体实现是在继承的类Face_Align_Nose中实现的。

向检测器添加人脸对齐

现在我们可以将人脸对齐算法添加到上一篇文章中描述的视频人脸检测器中:

class VideoFD:    def __init__(self, detector):self.detector = detectordef detect(self, video, save_path = None, align = False, draw_points = False):detection_num = 0;capture = cv2.VideoCapture(video)img = Nonedname = 'AI face detection'cv2.namedWindow(dname, cv2.WINDOW_NORMAL)cv2.resizeWindow(dname, 960, 720)frame_count = 0dt = 0face_num = 0if align:fa = Face_Align_Nose(160)# Capture all frameswhile(True):    (ret, frame) = capture.read()if frame is None:breakframe_count = frame_count+1t1 = time.time()faces = self.detector.detect(frame)t2 = time.time()p_count = len(faces)detection_num += p_countdt = dt + (t2-t1)if (not (save_path is None)) and (len(faces)>0) :f_base = os.path.basename(video)for (i, face) in enumerate(faces):if align:(f_cropped, f_img) = fa.align(frame, face)else:(f_cropped, f_img) = self.detector.extract(frame, face)if (not (f_img is None)) and (not f_img.size==0):if draw_points:Utils.draw_faces([f_cropped], (255, 0, 0), f_img, draw_points, False)face_num = face_num+1dfname = os.path.join(save_path, f_base + ("_%06d" % face_num) + ".png") cv2.imwrite(dfname, f_img)if len(faces)>0:Utils.draw_faces(faces, (0, 0, 255), frame)if not (save_path is None):dfname = os.path.join(save_path, f_base + ("_%06d" % face_num) + "_frame.png")cv2.imwrite(dfname, frame)# Display the resulting framecv2.imshow(dname,frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcapture.release()cv2.destroyAllWindows()    fps = frame_count/dtreturn (detection_num, fps)

让我们对视频文件启动人脸检测:

d = MTCNN_Detector(50, 0.95)
vd = VideoFD(d)
v_file = r"C:\PI_FR\video\5_2.mp4"save_path = r"C:\PI_FR\detect"
(f_count, fps) = vd.detect(v_file, save_path, True, False)print("Face detections: "+str(f_count))
print("FPS: "+str(fps))

在下图中,我们显示了相同位置的人脸,但现在它们与使用我们的算法对齐。

您可以看到现在所有图片的大小都相同。然而,对齐算法并没有做得很好。当人脸向左或向右旋转时,算法会失败并严重扭曲人脸。这是因为鼻尖与其他点不在同一平面上。当面旋转到一边时,点3不再是平行四边形的中心。

修改对齐算法

让我们尝试使用其他人脸地标修改对齐算法。在下图中,我们引入了一个新点——9

9计算为点45之间的中间点。我们仍然使用四个点——1287——作为透视变换的基础。但是现在点78的计算是基于点9的坐标。我们假设点69位于平行四边形的中线上。下面的代码实现了这个算法:

class Face_Align_Mouth(Face_Align):    def get_perspective_points(self, l_eye, r_eye, nose, mouth_l, mouth_r):(xl, yl) = l_eye(xr, yr) = r_eye(xml, yml) = mouth_l(xmr, ymr) = mouth_r(xn, yn) = ( 0.5*(xl+xr), 0.5*(yl+yr) )(xm, ym) = ( 0.5*(xml+xmr), 0.5*(yml+ymr) )(dx, dy) = (xm-xn, ym-yn)(xl2, yl2) = (xl+1.1*dx, yl+1.1*dy)(xr2, yr2) = (xr+1.1*dx, yr+1.1*dy)s = self.sizepts1 = np.float32([[xl, yl], [xr, yr], [xr2, yr2], [xl2, yl2]])pts2 = np.float32([[s*0.3, s*0.3], [s*0.7, s*0.3], [s*0.7, s*0.75], [s*0.3, s*0.75]])return (pts1, pts2)

在视频检测器中使用新类Face_Align_Mouth并使用相同的视频文件启动它,我们得到以下对齐的人脸。

您会看到现在没有面部扭曲,并且所有面部都正确对齐。请注意,并非所有对齐的人脸看起来都在镜头前。例如,旋转后的面看起来仍然略微旋转。不幸的是,我们无法在2D图像中重建旋转人脸的前视图。

尽管如此,相对于最终图像,所有面部关键点现在都具有相同的坐标。这正是我们想要的对齐算法——将面部归一化为相同的图像坐标。这种方法确保从数据库中的人脸提取的特征和通过相机输入的人脸属于同一空间。

下一步

在本系列的下一篇文章​​​​​​​中,我们将在Raspberry Pi设备上运行我们的面部检测器。

https://www.codeproject.com/Articles/5306640/Hybrid-Edge-AI-Face-Alignment


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

相关文章

人脸对齐及关键点检测

严格定义上的人脸识别分为四个步骤: ①人脸检测:从图片中准确定位到人脸 ②人脸对齐: 自动定位出面部关键特征点, ③进行特征提取 ④对两张人脸图像的特征向量进行对比,计算相似度。 当今的人脸识别系统如下图所示…

人脸对齐 matlab,常用几种人脸对齐算法ASM/AAM/CLM/SDM

常用几种人脸对齐算法ASM/AAM/CLM/SDM 常用几种人脸对齐算法ASM/AAM/CLM/SDM 转载:http://blog.csdn.net/huneng1991/article/details/51901912 SDM原理 转载:http://blog.csdn.net/linolzhang/article/details/55271815 人脸对齐算法 一、ASM算法 ASM(A…

人脸识别篇---人脸对齐

人脸对齐 安装环境dlib 脚本实现运行代码实现效果运行问题 安装环境 dlib windows10安装dlib 在anaconda3下激活相应的环境 conda install -c conda-forge dlib参考 脚本实现 from imutils.face_utils import FaceAligner from imutils.face_utils import rect_to_bb impo…

人脸对齐算法常用评价标准总结

转载请注明作者和出处: http://blog.csdn.net/john_bh/ 文章目录 1. I O N 和 I P N ION和IPN ION和IPN2. M N E MNE MNE (the mean normalized error)3 A U C a AUCa AUCa(the area-under-the-curve)4. C E D CED CED (the Cumulative Errors Distribution curve)…

python练习3 人脸对齐以及dir、inspect的用法

一、人脸对齐 训练好的模型库文件(替换你的模型文件位置) import cv2 import dlib import matplotlib.pyplot as pltpath"D:\python\Lib\site-packages\cv2\photo.jpg" imgcv2.imread(path) graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#人脸分…

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

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

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

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

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生成规则网格的步骤详细的介绍一下。 首先我有一个工作的范围,比如图一所示的范围: 我要在研…