人脸识别 (4) 人脸对齐

article/2025/9/23 15:48:41

参考:FaceDetector/face_align.ipynb at master · faciallab/FaceDetector · GitHub

中文:从零开始搭建人脸识别系统(二):人脸对齐 - 知乎

Face Alignment Step-by-Step

1、Align Faces by Spatial Transform Operation

import cv2
import matplotlib.pyplot as plt
import numpy as npimg_file = '../tests/asset/images/roate.jpg'
img = cv2.imread(img_file)
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
plt.figure(figsize=(10, 10))
plt.imshow(img)
plt.show()

 2、Load the mtcnn model

import mtcnn
from mtcnn.utils import draw# First we create pnet, rnet, onet, and load weights from caffe model.
pnet, rnet, onet = mtcnn.get_net_caffe('../output/converted')# Then we create a detector
detector = mtcnn.FaceDetector(pnet, rnet, onet, device='cpu')

3、Crop the face from original image.

img = cv2.imread(img_file)
boxes, landmarks = detector.detect(img, minsize=24)
face = draw.crop(img, boxes=boxes, landmarks=landmarks)[0]
face = cv2.cvtColor(face, cv2.COLOR_RGB2BGR)
plt.figure(figsize=(5, 5))
plt.imshow(face)
plt.show()

4、Align face through facial landmark points.

How can we get the transform matrix.

首先假设我们最后要截取一张(112,96)大小的正脸,那么人脸的五个关键点分别在什么位置才算是正脸呢?所以我们需要五个参考点

# Define the correct points.
REFERENCE_FACIAL_POINTS = np.array([[30.29459953,  51.69630051],[65.53179932,  51.50139999],[48.02519989,  71.73660278],[33.54930115,  92.3655014],[62.72990036,  92.20410156]
], np.float32)# Lets create a empty image|
empty_img = np.zeros((112,96,3), np.uint8) 
draw.draw_landmarks(empty_img, REFERENCE_FACIAL_POINTS.astype(int))plt.figure(figsize=(5, 5))
plt.imshow(empty_img)
plt.show()

那么这些特征点在我们图片中的人脸什么位置呢 

img_copy = img.copy()
landmark = landmarks[0]img_copy[:112, :96, :] = empty_img
img_copy = cv2.cvtColor(img_copy, cv2.COLOR_RGB2BGR)
draw.draw_landmarks(img_copy, landmark)plt.figure(figsize=(15, 15))
plt.imshow(img_copy)
plt.show()

 5、需要通过一个变换矩阵将蓝色点转换到红色点位置

我们知道三个参考点可以决定一个变换矩阵,选取一双眼睛对应的两个点和鼻子对应的一个点共的三个点计算变换矩阵,可以通过cv2.getAffineTransform 仿射变换函数获得变换矩阵。仿射变换参考这篇文章.

trans_matrix = cv2.getAffineTransform(landmark[:3].cpu().numpy().astype(np.float32), REFERENCE_FACIAL_POINTS[:3])

Next step, apply transformation to origin image and crop the interested region.

aligned_face = cv2.warpAffine(img.copy(), trans_matrix, (112, 112))
aligned_face = cv2.cvtColor(aligned_face, cv2.COLOR_RGB2BGR)plt.figure(figsize=(5, 5))
plt.imshow(aligned_face)
plt.show()

人脸已经被大致对齐了,但是效果似乎不是很理想,人脸有一些变形 

6、更精准对齐

上面这个简单的算法有几个问题。一是我们有5个点的对应关系,却只用了三个。二是上述操作可能会造成对图像的剪切拉伸变换,这样会使图像变形。怎么解决这个问题呢

首先我们先来回顾一下怎样做一个仿射变换

如果我们想对一个图像在x轴方向平移 tx 个像素,在y轴方向平移ty个像素,我们的变换矩阵长什么样子呢?

如果我们想顺时针旋转一定角度呢

同时平移和旋转(a=cos(\theta ), b=sin(\theta))呢

给定一个点P_{origin}=\left\{ \begin{array}{c} x \\ y \\ 1 \\ \end{array} \right\},经过mctnn转换为对应的点P_{ref}=\left\{ \begin{array}{c} x^, \\ y^, \\ 1, \\ \end{array} \right\},因此我们需要一个最优的参数(a,b,t_x,t_y)满足P_{origin}^T * C^T = P_{ref}^T ,如何解下面这个方程呢?

P_{origin}^T * C^T=\left\{ \begin{array}{ccc} ax-by+t_x, & bx+ay+t_y, & 1 \\ \end{array} \right\}=\left\{ \begin{array}{cccc} x & -y & 1 &0 \\ x & y & 0 & 1 \\ \end{array} \right\} * \left\{ \begin{array}{c} a \\ b \\ t_x \\ t_y \\ \end{array} \right\} = \left\{ \begin{array}{c} x^,\\ y^, \\ \end{array} \right\}

这是一个线性方程,我们用Least Squares Method(最小二乘法)来求解五个点的最优估计:

(可以用numpy的内置函数 numpy.linalg.lstsq)

from numpy.linalg import inv, norm, lstsq
from numpy.linalg import matrix_rank as rankdef findNonreflectiveSimilarity(uv, xy, K=2):M = xy.shape[0]x = xy[:, 0].reshape((-1, 1))  # use reshape to keep a column vectory = xy[:, 1].reshape((-1, 1))  # use reshape to keep a column vectortmp1 = np.hstack((x, y, np.ones((M, 1)), np.zeros((M, 1))))tmp2 = np.hstack((y, -x, np.zeros((M, 1)), np.ones((M, 1))))X = np.vstack((tmp1, tmp2))u = uv[:, 0].reshape((-1, 1))  # use reshape to keep a column vectorv = uv[:, 1].reshape((-1, 1))  # use reshape to keep a column vectorU = np.vstack((u, v))# We know that X * r = Uif rank(X) >= 2 * K:r, _, _, _ = lstsq(X, U)r = np.squeeze(r)else:raise Exception('cp2tform:twoUniquePointsReq')sc = r[0]ss = r[1]tx = r[2]ty = r[3]Tinv = np.array([[sc, -ss, 0],[ss,  sc, 0],[tx,  ty, 1]])T = inv(Tinv)T[:, 2] = np.array([0, 0, 1])T = T[:, 0:2].Treturn Tsimilar_trans_matrix = findNonreflectiveSimilarity(landmark.cpu().numpy().astype(np.float32), REFERENCE_FACIAL_POINTS)aligned_face = cv2.warpAffine(img.copy(), similar_trans_matrix, (112, 112))
aligned_face = cv2.cvtColor(aligned_face, cv2.COLOR_RGB2BGR)plt.figure(figsize=(5, 5))
plt.imshow(aligned_face)
plt.show()


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

相关文章

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…

arcgis fishnet渔网功能学习

听说要来跟我请教fishnet功能,吓我一跳,arcgis不就只有个创建渔网功能吗??纳尼?! 赶紧捡捡知识点,避免一问三不知.。 版本12.4后工具位于data management/sampling/create fishnet,12.4之前应…

POJ1408-Fishnet

全解题报告索引目录 -> 【北大ACM – POJ试题分类】 转载请注明出处:http://exp-blog.com ------------------------------------------------------------------------- 大致题意: 一个1X1的正方形,每条边上有n个不同的点(…

关于在ArcGIS里创建fishnet时只有几个网格的解决办法

在ArcGIS里创建渔网时可能会出现以下情况,例如只有两个网格 可以看到在创建渔网的窗口中导入的数据中上下左右的单位是经纬度,不是米制单位。 这是由于在创建渔网时没有将坐标系进行转换,利用的shp数据本身的坐标系是度分秒单位的&#xf…

【ArcGIS微课1000例】0002:创建渔网(Create fishnet)

本文讲解ArcGIS软件中渔网(fishnet)工具的原理,方法及使用技巧。 文章目录 微课目标工具介绍实现过程微课目标 如下图所示,影像为无人机航测生产的DOM,现在需要在ArcGIS平台中进行DLG数据采集(数字化),由于测区较大,需要创建500*500的渔网,并对影像进行裁剪下发给多…

ArcGIS 10.2生成渔网(fishnet)

https://blog.csdn.net/lucky51222/article/details/72514885 工具路径:Data Management Tools→Feature Class→Create Fishnet。 (1)确定输出路径及文件名; (2)选择渔网范围,本例选择北方地区…

ArcGIS创建渔网Create Fishnet工具生成指定大小格网

本文介绍在ArcMap软件中,通过“Create Fishnet”工具创建渔网,从而获得指定大小的矢量格网数据的方法。 首先,我们在创建渔网前,需要指定渔网覆盖的范围。这里我们就以四川省为例,在这一范围内创建渔网;其中…

ArcGIS中ArcMap创建渔网Create Fishnet:生成指定大小的格网矢量文件

本文介绍在ArcMap软件中,通过“Create Fishnet”工具创建渔网,从而获得指定大小的矢量格网数据的方法。 首先,我们在创建渔网前,需要指定渔网覆盖的范围。这里我们就以四川省为例,在这一范围内创建渔网;其中…