概述

在人脸相关应用中,获得的人脸图像常常形状各异,这时就需要对人脸形状进行归一化处理。人脸对齐就是将两个不同的形状进行归一化的过程,将一个形状尽可能地贴近另一个形状。

值得注意的是,在英语文献中,Face Alignment和Facial Landmark Detection常常混用,在我的系列博客里面,Facial Landmark Detection指的是人脸特征点检测,而Face Alignment指的是人脸对齐。人脸特征点检测是人脸对齐的必要步骤,现在有很多端到端(end to end)的方法不需要进行对齐,所以具体要不要对齐这一步需要结合实际分析。

人脸特征点检测的结果如下:

人脸对齐的效果如下,可以看到右边的脸已经和左边的脸形状大体一致:

言归正传,Procrustes analysis是一种用来分析形状分布的统计方法。Procrustes源于古希腊神话中的一个强盗, 他常切断受害者的肢体使其身形与床相匹配,类似地Procrustes分析方法是对两个形状进行归一化处理 。从数学上来讲,普氏分析就是利用最小二乘法寻找形状A到形状B的仿射变换 。

模型

仿射变换

在高中的几何课程中,一定学过平移,放缩和旋转变换。

将这三种变换写成矩阵形式:

这个式子中,s就是缩放比例, 就是旋转角度,最后的t代表平移的位移,其中R是一个正交矩阵。

Procrustes analysis

我们现在要解决如何旋转、平移和缩放第一个向量,使它们尽可能对齐第二个向量的点。一个想法是使用仿射变换将第一个图像变换覆盖第二个图像。如何判断这种对齐的效果呢?使用最小二乘法,使得变化后所有点与目标点距离和最小。

两个形状矩阵分别为p和q,矩阵的每一行代表一个特征点的x,y坐标,假设有68个特征点坐标,则。写成数学形式:

其中就是p矩阵的第i行。写成矩阵形式:

代表Frobenius范数,就是每一项的平方和。

求解

这个最小值问题是有解析解的。

先放上代码:#Procrustes analysisdef transformation_from_points(points1, points2):

points1 = points1.astype(numpy.float64)

points2 = points2.astype(numpy.float64)

c1 = numpy.mean(points1, axis=0)

c2 = numpy.mean(points2, axis=0)

points1 -= c1

points2 -= c2

s1 = numpy.std(points1)

s2 = numpy.std(points2)

points1 /= s1

points2 /= s2

U, S, Vt = numpy.linalg.svd(points1.T * points2)

R = (U * Vt).T    return numpy.vstack([numpy.hstack(((s2 / s1) * R,

c2.T - (s2 / s1) * R * c1.T)),

numpy.matrix([0., 0., 1.])])

根据

可以知道

是有解的。

需要将式子

进行一些变化,写成Wikipedia式子的形状。这里的变化就需要对原始点集p和q进行一些处理,使得最小化式子发生变化。

这里给出了对原始点集的变化步骤。结合代码来看:c1 = numpy.mean(points1, axis=0)

c2 = numpy.mean(points2, axis=0)

points1 -= c1

points2 -= c2

这一步处理消除了平移T的影响。s1 = numpy.std(points1)

s2 = numpy.std(points2)

points1 /= s1

points2 /= s2

这一步处理消除了缩放系数s的影响。

这两步处理以后,R就可以变成求解下面的式子:

这里的A,B不再是原始的数据点集,而是变成了处理以后点集。

根据维基百科,这个式子是可以求解的:

这样就解出了R:U, S, Vt = numpy.linalg.svd(points1.T * points2)

R = (U * Vt).T

源代码最后一步返回的是仿射变换矩阵

java常规普氏分析法_人脸对齐:Procrustes analysis 普氏分析相关推荐

  1. Procrustes Analysis(普氏分析)

    Procrustes Analysis普氏分析法 选取N幅同类目标物体的二维图像,并用上一篇博文的方法标注轮廓点,这样就得到训练样本集: 由于图像中目标物体的形状和位置存在较大偏差,因此所得到的数据并 ...

  2. Procrustes Analysis普氏分析法

    选取N幅同类目标物体的二维图像,并用上一篇博文的方法标注轮廓点,这样就得到训练样本集: 由于图像中目标物体的形状和位置存在较大偏差,因此所得到的数据并不具有仿射不变性,需要对其进行归一化处理.这里采用 ...

  3. ahp层次分析法_基于层次分析法(AHP)的店铺选址应用研究

    导读 在连锁行业,店铺选址是其中很重要的一个方面.影响店铺选址的指标(因素)很多,决策中经常需要对店铺影响各指标进行量化分析.本文应用层级分析法(AHP),对影响店铺选址的指标(因素)权重进行量化分析 ...

  4. python 股票图表_k线图分析法_【趣味案例】用Python绘制K线图,一眼看清股市状况...

    本文介绍关于[趣味案例]用Python绘制K线图,一眼看清股市状况及神一般的裸k交易法,精髓就这三步,一目了然!精髓就这三步,一目了然!(附图解析)的相关内容. [趣味案例]用Python绘制K线图, ...

  5. ahp层次分析法_层次分析法在历史街区研究中的应用简析

    摘要 AHP (Analytic Hierarchy Process)层次分析法通常被运用于解决多目标.多标准.多要素.多层次的非结构化的复杂决策性问题,特别是战略决策性问题,在建筑.规划.风景园林等 ...

  6. matlab层次分析法程序购置设备,[转载]MATLAB实现层次分析程序

    层次分析法(AHP)适用于那些难于完全定量分析的问题.运用层次分析建模,大体上可按下面四个步骤进行: (1)建立递阶层次结构模型: (2)构造出各层次中的所有判断矩阵: (3)层次单排序及一致性检验: ...

  7. 一阶电路暂态响应的结果分析。_反激式DCDC变换器的分析、计算与仿真精讲

      功率变压器模型 在分析Flyback电路之前,我觉得有必要把变压器模型做一个总结,因为我们对变压器的分析其实是在一定的模型上面进行分析的.这里阐述我的一个观点, 如果说实际测试和实验是非常重要的话 ...

  8. 一阶电路暂态响应的结果分析。_【技术】关于开关电源的分析、计算、仿真

    功率变压器模型 在分析Flyback电路之前,我觉得有必要把变压器模型做一个总结,因为我们对变压器的分析其实是在一定的模型上面进行分析的.这里阐述我的一个观点, 如果说实际测试和实验是非常重要的话,对 ...

  9. python人脸识别特征脸法_人脸识别经典算法一 特征脸方法(Eigenface)

    这篇文章是撸主要介绍人脸识别经典方法的第一篇,后续会有其他方法更新.特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在另一篇博客里:特征脸(Eig ...

最新文章

  1. sql server 作业收缩数据库
  2. python list 底层实现的数据结构_Python数据结构大起底——list篇
  3. java绕过加密密码_JAVA中使用MD5加密实现密码加密
  4. orchard学习,
  5. rxjava结合_RxJava结合最新,与最新发件人
  6. Ubuntu18.04图片信息查看器
  7. 系统学习机器学习之半参数方法(一)--基于距离
  8. 计算机组装内部线的整理,计算机组装与维护笔记整理.doc
  9. 关于N82后摄像头拍照无法启动的超强技术解决方案
  10. 安徽省月度降水量分布数据
  11. 家用计算机存储容量,计算机内存储器容量有多大?
  12. 最新抖音视频无水印解析接口-突破频率限制
  13. 关于Ubuntu双击打不开文件夹的解决方案
  14. vue出生日期转年龄
  15. inventor如何钣金出弧面_Inventor钣金造型教程
  16. 英雄联盟手游发布!我却从中总结了4个万能PPT公式
  17. T3出行快手首秀直播PK赛项目总曝光破亿
  18. 启明云端基于乐鑫ESP32-S2的智能86盒新品发布--WT-86-32-3ZW1
  19. Echarts 实现折线图自定义折点样式
  20. 现行〖金融帝国实验室〗(Capitalism Lab)官方正版游戏『销售政策指引』(2022.02.01~02.28)

热门文章

  1. mysql 免密码进入_MySQL 5.7 三种免密码登录
  2. php小数点不足两位补零,PHP数字补零的两种方法
  3. 如何在docker中运行MySQL实例(转载)
  4. 基于JAVA+SpringMVC+Mybatis+MYSQL的停车场管理系统
  5. c面向对象 java_JAVA基础--面向对象08
  6. $.ajax()方法
  7. ADO.Net中DataSete的应用
  8. ubuntu 16.04 nfs服务的搭建
  9. 解决mysql大小写敏感问题
  10. ArcGIS 10.2数字化线状要素时自己主动拼接成一条线