选取N幅同类目标物体的二维图像,并用上一篇博文的方法标注轮廓点,这样就得到训练样本集:

由于图像中目标物体的形状和位置存在较大偏差,因此所得到的数据并不具有仿射不变性,需要对其进行归一化处理。这里采用Procrustes分析方法对样本集中的所有形状集合进行归一化。形状和位置的载体还是样本点的空间坐标。

     普氏分析法是一种用来分析形状分布的方法。数学上来讲,就是不断迭代,寻找标准形状(canonical shape),并利用最小二乘法寻找每个样本形状到这个标准形状的仿射变化方式。(可参照维基百科的GPA算法)

本书中,两个形状的归一化过程(一个形状为canonical shape,另一个为样本形状):

(1)    求每个样本点i(i=1,2..,n)在N幅图像中的均值

(2)    对所有形状的大小进行归一化,即将每个样本点减去其对应均值

(3)    根据去中心化数据,计算每幅图像中形状的重心,对于第i幅图像,其重心为:

(4)    根据重心和角度,将标准和样本形状对齐在一起,使得两个形状的普氏距离最小,下式为普氏距离定义:

这个第(4)步的具体做法,不断迭代以下过程:

(a)通过计算每幅图像中所有归一化样本点的平均值得到每个图像的标准形状canonical shape。

(b)利用最小二乘法求每个图像中样本形状到标准形状的旋转角度。根据普氏距离的定义,也就是求:

其中的a和b表示仿射变换里旋转变化的参数:

对上式求偏导数,可以得到所求的a和b:

(c)根据旋转参数,对样本形状做旋转变化,得到和标准形状对齐的新的形状

(d)重复以上步骤,直到达到指定循环次数或者前后两次迭代之间canonical shape的绝对范数满足一定阈值

Procrustesanalysis的作用可以看作是一种对原始数据的预处理,目的是为了获取更好的局部变化模型作为后续模型学习的基础。如下图所示,每一个人脸特征点可以用一种单独的颜色表示;经过归一化变化,人脸的结构越来越明显,即脸部特征簇的位置越来越接近他们的平均位置;经过一系列迭代,尺度和旋转的归一化操作,这些特征簇变得更加紧凑,它们的分布越来越能表达人脸表情的变化。【剔除刚性部分、保留柔性部分】

上图为不同大小、不同长宽比的矩形,经过归一化过程后,各个样本点分布服从一定概率分布趋势。

具体代码实现:

函数:Mat shape_model::procrustes(const Mat &X,const int itol,constfloat ftol)

矩阵X:2n*N维矩阵,即有N副图像,每幅图像有n个特征点(2n是因为x和y坐标)

Itol:迭代次数

Ftol:求绝对范数的阈值

返回值:矩阵P,存放对齐后的形状坐标

 Mat shape_model::procrustes(const Mat &X,const int itol,const float ftol)
{
/* X.cols:特征点个数,X.rows: 图像数量*2 */
int N = X.cols,n = X.rows/; //remove centre of mass
Mat P = X.clone();
for(int i = ; i < N; i++)
{
/*取X第i个列向量*/
Mat p = P.col(i);
float mx = ,my = ;
for(int j = ; j < n; j++)
{
mx += p.fl(*j);
my += p.fl(*j+);
}
/*分别求图像集,2维空间坐标x和y的平均值*/
mx /= n;
my /= n;
/*对x,y坐标去中心化*/
for(int j = ; j < n; j++)
{
p.fl(*j) -= mx;
p.fl(*j+) -= my;
}
}
//optimise scale and rotation
Mat C_old;
for(int iter = ; iter < itol; iter++)
{
/*计算(含n个形状)的重心*/
Mat C = P*Mat::ones(N,,CV_32F)/N;
/*C为2n*1维矩阵,含n个重心,对n个重心归一化处理*/
normalize(C,C);
if(iter > )
{
if(norm(C,C_old) < ftol)//norm:求绝对范数,小于阈值,则退出循环
break;
}
C_old = C.clone();
for(int i = ; i < N; i++)
{
//求当前形状与归一化重心之间的旋转角度,即上式a和b
Mat R = this->rot_scale_align(P.col(i),C);
for(int j = ; j < n; j++)
{
float x = P.fl(*j,i),y = P.fl(*j+,i);
/*仿射变化*/
P.fl(*j ,i) = R.fl(,)*x + R.fl(,)*y;
P.fl(*j+,i) = R.fl(,)*x + R.fl(,)*y;
}
}
}
return P;
} http://blog.csdn.net/jinshengtao/article/details/43376049

Procrustes Analysis普氏分析法的更多相关文章

  1. python AI换脸 用普氏分析法(Procrustes Analysis)实现人脸对齐

    1.图片效果 2.原代码 # !/usr/bin/python # -*- coding: utf-8 -*- # Copyright (c) 2015 Matthew Earl # # Permis ...

  2. face alignment[Ordinary Procrustes Analysis]

    人脸识别,大致可以分为以下四个步骤: 人脸检测:从图片中准确定位到人脸,并以矩形框将其裁剪出来: 人脸矫正(对齐): 检测到的人脸,可能角度不是很正,需要使其对齐,比如旋转,缩放: 特征提取:对矫正后 ...

  3. 帕累托分析法(Pareto Analysis)(柏拉图分析)

    帕累托分析法(Pareto Analysis)(柏拉图分析) ABC分类法是由意大利经济学家帕雷托首创的.1879年,帕累托研究个人收入的分布状态图是地,发现少数人收入占全部人口收入的大部分,而多数人 ...

  4. 2017人生总结(MECE分析法)

    试着用MECE分析法对人生的整个规划做一下总结.作为技术人员,其实除了编码架构能力之外,分析问题的能力的重要程度也会随着职业发展越来越重要.<美团点评技术博客>说这几天要在黄金时段头版头条 ...

  5. Principal components analysis(PCA):主元分析

    在因子分析(Factor analysis)中,介绍了一种降维概率模型,用EM算法(EM算法原理详解)估计参数.在这里讨论另外一种降维方法:主元分析法(PCA),这种算法更加直接,只需要进行特征向量的 ...

  6. 三大分析法——SWOT、PEST、波特五力

    SWOT分析法 「SWOT分析模型简介」 (也称TOWS分析法.道斯矩阵).在现在的战略规划报告里,SWOT分析应该算是一个众所周知的工具.来自于麦肯锡咨询公司的SWOT分析,包括分析企业的优势(St ...

  7. 5whys分析法在美团工程师中的实践

    转载美团博客:https://tech.meituan.com/5whys-method.html 前言 网站的质量和稳定性对于用户和公司来说至关重要,但是在网站的快速发展过程中,由于各种原因导致事故 ...

  8. 从Elo Rating System谈到层次分析法

    1. Elo Rating System Elo Rating System对于很多人来说比较陌生,根据wikipedia上的解释:Elo评分系统是一种用于计算对抗比赛(例如象棋对弈)中对手双方技能水 ...

  9. AX中四种库存ABC分析法原理研究

    库存ABC分类,简单的说就是抓大放小,是为了让我们抓住重点,用最大精力来管理最重要的物料,而对于不太重要的物料则可以用较少的精力进行管理.它和我们平常说的八二法则有异曲同工之妙. 既然要应用库存ABC ...

随机推荐

  1. promise与aysnc 与EventProxy

    promise 已经是 es6推荐的内置的东西了,所以我们需要清楚. promise的使用类似与jquery的链式操作,.then()  .then()中不断使用.回调看上去清晰明了,建议使用. as ...

  2. [CH#58解题报告]

    题目:http://206.contesthunter.org/contest/CH%20Round%20%2358%20-%20OrzCC%E6%9D%AFnoip%E6%A8%A1%E6%8B%9 ...

  3. [USACO2002][poj1946]Cow Cycling(dp)

    Cow CyclingTime Limit: 1000MS Memory Limit: 30000KTotal Submissions: 2468 Accepted: 1378Description ...

  4. 每天一个linux命令(23): chown命令

    chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷贝 ...

  5. 分布式Web服务器架构

    最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们只关注架构的演变历程,因此就假设这个时候已经是托管了一台主机,并且有一定的带宽了,这个时候由于网 ...

  6. 从topcoder赚钱的方法

    1. 算法1.1  SRM 钱少($30左右),而且很难.1.2  Tournament 钱多($1000~$10000),太难~ 2. 设计和开发2.1  构件设计和开发 钱比较多($1000左右) ...

  7. iOS开发小技巧--利用运行时得到隐藏的成员变量

    一.关于运行时,已经从网络上摘抄了一片文章,这里只有项目中自己的简单使用 -- 查找隐藏的成员变量 导入头文件 可以获得隐藏的成员变量,方法,属性等 代码: 打印效果图:

  8. iOS边练边学--GCD的基本使用、GCD各种队列、GCD线程间通信、GCD常用函数、GCD迭代以及GCD队列组

    一.GCD的基本使用 <1>GCD简介 什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数   GCD的优势 G ...

  9. java.lang.NoClassDefFoundError: javax/transaction/UserTransaction

    在运行定时任务的时候报错: Java.lang.NoClassDefFoundError: javax/transaction/UserTransaction 原因:缺少jta的jar包 解决方法:下 ...

  10. nopCommerce 安装失败: 引发类型为“System.OutOfMemoryException”的异常。

    如果你在安装nopCommerce 3.00版本的时候报如上异常,解决方案: 1.在服务器上检查内存是否已经满了,因为nopCommerce 在安装的时候需要很多内存. 2.关闭占用内存大的进程,保证 ...