|||
有段时间我一直满足于在脸上画个框,后来又满足于在脸上标些点,再后来在这方面就没有进展了。剩下不多的东西包括硬盘某个文件夹里不同时期下载的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
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-8-17 22:16
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社