java常规普氏分析法_Procrustes Analysis普氏分析法

标签:

bfd7aaf261a9f93eee98e7c624251ea7.png

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

0f0bfd73f147c1675c919ff4cc7de2eb.png

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

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

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

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

f6b383e7727f16d5ca4d69180f173c3d.png

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

54a6369072b57df9d6e0190622dfcfc8.png

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

4f047da3db9a8d5f43d0fc8c84e175ae.png

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

420e46536287c1f2228090d955139436.png

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

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

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

89843eeb1f32c91e81264acb15d365ac.png

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

75199d1655feb97be52f27ba41492cad.png

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

7a7115dfa26c86c22e15e81fc770d26c.png

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

a5e047fbf6440624b2bc6d7e24e7c1bf.png

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

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

4e7974ccfd9b222aef682c7f08787587.png

01fb6ac5e7f5652dfcc10027791d0984.png

84c4df50ff7d9d502bb2e3af18a5b402.png

a26e6c1017558b60399643e682bee1ab.png

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

具体代码实现:

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

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

Itol:迭代次数

Ftol:求绝对范数的阈值

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

1 Mat shape_model::procrustes(const Mat &X,const int itol,const floatftol)2 {3 /*X.cols:特征点个数,X.rows: 图像数量*2*/

4 int N = X.cols,n = X.rows/2;5

6 //remove centre of mass

7 Mat P =X.clone();8 for(int i = 0; i < N; i++)9 {10 /*取X第i个列向量*/

11 Mat p =P.col(i);12 float mx = 0,my = 0;13 for(int j = 0; j < n; j++)14 {15 mx += p.fl(2*j);16 my += p.fl(2*j+1);17 }18 /*分别求图像集,2维空间坐标x和y的平均值*/

19 mx /=n;20 my /=n;21 /*对x,y坐标去中心化*/

22 for(int j = 0; j < n; j++)23 {24 p.fl(2*j) -=mx;25 p.fl(2*j+1) -=my;26 }27 }28 //optimise scale and rotation

29 Mat C_old;30 for(int iter = 0; iter < itol; iter++)31 {32 /*计算(含n个形状)的重心*/

33 Mat C = P*Mat::ones(N,1,CV_32F)/N;34 /*C为2n*1维矩阵,含n个重心,对n个重心归一化处理*/

35 normalize(C,C);36 if(iter > 0)37 {38 if(norm(C,C_old) < ftol)//norm:求绝对范数,小于阈值,则退出循环

39 break;40 }41 C_old =C.clone();42 for(int i = 0; i < N; i++)43 {44 //求当前形状与归一化重心之间的旋转角度,即上式a和b

45 Mat R = this->rot_scale_align(P.col(i),C);46 for(int j = 0; j < n; j++)47 {48 float x = P.fl(2*j,i),y = P.fl(2*j+1,i);49 /*仿射变化*/

50 P.fl(2*j ,i) = R.fl(0,0)*x + R.fl(0,1)*y;51 P.fl(2*j+1,i) = R.fl(1,0)*x + R.fl(1,1)*y;52 }53 }54 }55 returnP;56 }

标签:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值