java常规普氏分析法_人脸对齐:Procrustes analysis 普氏分析
概述
在人脸相关应用中,获得的人脸图像常常形状各异,这时就需要对人脸形状进行归一化处理。人脸对齐就是将两个不同的形状进行归一化的过程,将一个形状尽可能地贴近另一个形状。
值得注意的是,在英语文献中,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 普氏分析相关推荐
- Procrustes Analysis(普氏分析)
Procrustes Analysis普氏分析法 选取N幅同类目标物体的二维图像,并用上一篇博文的方法标注轮廓点,这样就得到训练样本集: 由于图像中目标物体的形状和位置存在较大偏差,因此所得到的数据并 ...
- Procrustes Analysis普氏分析法
选取N幅同类目标物体的二维图像,并用上一篇博文的方法标注轮廓点,这样就得到训练样本集: 由于图像中目标物体的形状和位置存在较大偏差,因此所得到的数据并不具有仿射不变性,需要对其进行归一化处理.这里采用 ...
- ahp层次分析法_基于层次分析法(AHP)的店铺选址应用研究
导读 在连锁行业,店铺选址是其中很重要的一个方面.影响店铺选址的指标(因素)很多,决策中经常需要对店铺影响各指标进行量化分析.本文应用层级分析法(AHP),对影响店铺选址的指标(因素)权重进行量化分析 ...
- python 股票图表_k线图分析法_【趣味案例】用Python绘制K线图,一眼看清股市状况...
本文介绍关于[趣味案例]用Python绘制K线图,一眼看清股市状况及神一般的裸k交易法,精髓就这三步,一目了然!精髓就这三步,一目了然!(附图解析)的相关内容. [趣味案例]用Python绘制K线图, ...
- ahp层次分析法_层次分析法在历史街区研究中的应用简析
摘要 AHP (Analytic Hierarchy Process)层次分析法通常被运用于解决多目标.多标准.多要素.多层次的非结构化的复杂决策性问题,特别是战略决策性问题,在建筑.规划.风景园林等 ...
- matlab层次分析法程序购置设备,[转载]MATLAB实现层次分析程序
层次分析法(AHP)适用于那些难于完全定量分析的问题.运用层次分析建模,大体上可按下面四个步骤进行: (1)建立递阶层次结构模型: (2)构造出各层次中的所有判断矩阵: (3)层次单排序及一致性检验: ...
- 一阶电路暂态响应的结果分析。_反激式DCDC变换器的分析、计算与仿真精讲
功率变压器模型 在分析Flyback电路之前,我觉得有必要把变压器模型做一个总结,因为我们对变压器的分析其实是在一定的模型上面进行分析的.这里阐述我的一个观点, 如果说实际测试和实验是非常重要的话 ...
- 一阶电路暂态响应的结果分析。_【技术】关于开关电源的分析、计算、仿真
功率变压器模型 在分析Flyback电路之前,我觉得有必要把变压器模型做一个总结,因为我们对变压器的分析其实是在一定的模型上面进行分析的.这里阐述我的一个观点, 如果说实际测试和实验是非常重要的话,对 ...
- python人脸识别特征脸法_人脸识别经典算法一 特征脸方法(Eigenface)
这篇文章是撸主要介绍人脸识别经典方法的第一篇,后续会有其他方法更新.特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在另一篇博客里:特征脸(Eig ...
最新文章
- sql server 作业收缩数据库
- python list 底层实现的数据结构_Python数据结构大起底——list篇
- java绕过加密密码_JAVA中使用MD5加密实现密码加密
- orchard学习,
- rxjava结合_RxJava结合最新,与最新发件人
- Ubuntu18.04图片信息查看器
- 系统学习机器学习之半参数方法(一)--基于距离
- 计算机组装内部线的整理,计算机组装与维护笔记整理.doc
- 关于N82后摄像头拍照无法启动的超强技术解决方案
- 安徽省月度降水量分布数据
- 家用计算机存储容量,计算机内存储器容量有多大?
- 最新抖音视频无水印解析接口-突破频率限制
- 关于Ubuntu双击打不开文件夹的解决方案
- vue出生日期转年龄
- inventor如何钣金出弧面_Inventor钣金造型教程
- 英雄联盟手游发布!我却从中总结了4个万能PPT公式
- T3出行快手首秀直播PK赛项目总曝光破亿
- 启明云端基于乐鑫ESP32-S2的智能86盒新品发布--WT-86-32-3ZW1
- Echarts 实现折线图自定义折点样式
- 现行〖金融帝国实验室〗(Capitalism Lab)官方正版游戏『销售政策指引』(2022.02.01~02.28)
热门文章
- mysql 免密码进入_MySQL 5.7 三种免密码登录
- php小数点不足两位补零,PHP数字补零的两种方法
- 如何在docker中运行MySQL实例(转载)
- 基于JAVA+SpringMVC+Mybatis+MYSQL的停车场管理系统
- c面向对象 java_JAVA基础--面向对象08
- $.ajax()方法
- ADO.Net中DataSete的应用
- ubuntu 16.04 nfs服务的搭建
- 解决mysql大小写敏感问题
- ArcGIS 10.2数字化线状要素时自己主动拼接成一条线