机器视觉 增强现实分享 http://blog.sciencenet.cn/u/wanglin193

博文

ASM/AAM手工标定的Matlab脚本

已有 26131 次阅读 2011-5-25 18:57 |个人分类:ASM/AAM|系统分类:科研笔记|关键词:学者| MATLAB, face, alignment, AAM, ASM

有段时间我一直满足于在脸上画个框,后来又满足于在脸上标些点,再后来在这方面就没有进展了。剩下不多的东西包括硬盘某个文件夹里不同时期下载的paper:光流、特征检测、ASM、AAM...... 还有各种版本的人脸检测和跟踪的代码,里面藏着很多垃圾,比如每个版本的文件夹都包含一个debug和release目录。相对来说那些Matlab小程序就挺不错,不太占地方,用几行代码就能实现挺复杂的功能,比如下面这个AAM或者ASM训练用的手工标点的脚本,我把它放在这里晒晒。

程序下载:Edit68CMU_pack.rar

 

对于人脸检测的人脸样本准备,通常需要手工从图像中截取人脸区域,为了程序鲁棒性的考虑,生成的人脸样本需要还要有一定角度的旋转;对基于统计训练的图像自动标定(image alignment,比如Active shape model 或Active appearance model)方法来说,第一步工作就是手工在图上把物体轮廓标出来,这些点一般称为landmark。在没有用过OpenCV之前,要写一个支持鼠标输入交互选点的程序还是挺麻烦的,但是等到我开始使用Matlab,并且知道有个ginput函数后,这事就变得无比简单了。

 

首先,因为ASM的形状(shape)点是有序号的,每个点都对应一个目标上的关键点,是有具体含义的。一个标定的方法是用sh=ginput(68)一口气选取68个点,但是这中间一旦出错就前功尽弃了。所以比较好的办法是先把一个差不多的标准形状铺在输入的图像上,然后交互地调整每个点的位置,直到每个点都放到对应的位置为止,这样就把"标定形状"变成"编辑形状"了。其次,如果一个人脸图像"A.jpg"对应的landmark已经标记好了,并且保存在一个比如叫做"A.lmk"的文件中,过了一阵子我又想重新修改某些点的位置,或者因为不同的应用,形状的配置发生变化需要增加删除某些点,程序也应该满足编辑lmk文件个功能。

 

下面的程序就主要完成这两个功能:


1.先准备个标准形状做参考,比如从论文里找这样一张图,用ginput按顺序选68个点(68个点的定义见CMU那帮人的论文,文献[2],也可以用画图软件事先标好你要的点,比如下图的蓝点,这样的好处是可以保证使用ginput(68)一次成功):
    imshow('meanface.jpg');
    sh = ginput(68);


这样这些点的X,Y坐标就放在sh的两列里。把它作为一个标准形状,存在一个文本文件里。

 

2.程序开始,先要load标准形状。然后通过对话框选取一个图像文件,并显示

 

    [filename, pathname] = uigetfile([pathname,'*.bmp;*.jpg;*.png'], 'Pick an image');
    Aim = imread([pathname,filename]);
    imshow(Aim,[]);

 

检查输入图像是否有对应的lmk文件,即是否做过手工标定了:如果没有进入第3步;如果有lmk,则转入第4步,从lmk文件读取形状数据。

 

3.按顺序选取左眼,右眼,嘴中心3个点,如图。

根据这3点和标准图上对应点计算仿射变换,把标准形状[Xo,Yo]投影到图像中。

 

4.如果对应的lmk文件已经存在,则读入lmk,把形状[Xo,Yo]铺在图像上。

 

5.根据上面的输入信息,粗略计算一个人脸区域box,并且放大显示
   im=imcrop(Aim,box);
   imshow(im,[]); 


 

 

下面就可以编辑这个形状了


   5.1 每次用ginput(1)选择要移动的点,
    [xc,yc,button]=ginput(1);
    %最近点的序号存在ind里
    [val,ind]=min((xc-Xo).^2 + (yc-Yo).^2);


   5.2 再用ginput(1)选择要移动的位置,替换旧的值
    [xc,yc,button] = ginput(1);
    Xo(ind)=xc; 
    Yo(ind)=yc;
  重复这两个步骤,直到满意为止。

 


 
6. 保存形状文件(.lmk) 
   fid = fopen( [pathname,landmarkfile], 'w');
   fprintf(fid,'%6.2f %6.2frn', [X,Y]');
   fclose(fid); 

 

另外利用delaunay函数事先计算平均形状的三角网格(mesh):


    mtri=delaunay(meanshape68(:,1),meanshape68(:,2));
    
mtri的每行存储的是3角形的3个顶点序号,我们也可以利用这个三角剖分信息,把网格画在人脸上。
   


遗憾的是这3个点不都是顺时针或逆时针的,也就是说delaunay输出的这些三角形面片的法线方向不是朝一个方向的,这就需要交换某些三角形内某对点的位置,网格三角剖分工作甚至可以不用delaunay函数,而用手工完成,因为这个步骤都是一次性的。这些三角网格的主要用处是把人脸图像纹理warp到平均形状,叫做shape-free patch,这是AAM的关键步骤之一。如下图所示。左边是原始图的网格,右上角是表示在平均形状位置的每个三角形有一组仿射变换参数(用来到原始图像中采样,每个三角形内的图像采样点相对于该三角形网格的参数是固定的,也只要计算一次即可),右下角是得到的shape-free patch。

这样做,可以有助于实现形状(shape)和纹理(appearance)的的分别训练,具体更进一步实现自动人脸校准(face alignment),就需要好好看看下面两个文章了。

 

[参考]:

1. AAM/ASM创始人Tim Cootes的文章: http://personalpages.manchester.ac.uk/staff/timothy.f.cootes/refs.html

2.CMU的方法,以Lucas-Kanade 算法为基础(同时可参考我之前贡献的Lucas-Kanade 算法的文档)

Active Appearance Models Revisited : http://www.ri.cmu.edu/publication_view.html?pub_id=4601

3.3D电影Avatar就是用了类似的方法进行人脸表情跟踪的。http://www.meraforum.com/showthread.php?t=36119

    
  



https://m.sciencenet.cn/blog-465130-447913.html

上一篇:实验:从图像恢复透视投影参数
下一篇:ASM/AAM形状训练

1 libralibra

发表评论 评论 (16 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-7 02:01

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部