【something】简单的平均脸制作
首先声明,平均脸制作的方法一般都是使用AAM算法,但是我对这个算法不了解,所以在制作的时候,使用的是简单的加权的方法,高手勿喷。
我所用到的:
1.visual studio 2010 (openCV, 2.4以上好像才有 contrib这个module).
2.python (需要安装PIL)
3.Matlab
我的步骤:
1.首先,要有图
我是很想把课程网站给黑了,然后把学生图片全搞下来的,但是,第一点:我不会;第二点:我发现课程网站上的照片根本不用我做什么,几乎直接就能拿到。于是使用刚学习不久的Python,把新生照片给扒了下来,没扒完,具体原因不说了,总过扒了2000多张吧。
这里不会Python的同学可以查一下,主要用 urllib2模块。
2.怎么对齐?
既然是直接图片叠加,至少要把脸大概对对齐吧。我用了以下几个步骤来做:
2.1 人眼识别
openCV 2.4提供了一个Facerecognizer类,官方文档,就是我的另一篇文章【opencv】人脸识别、人眼识别and性别识别里面说的,这里再次对其中借用的文章的原作者表示感谢。
2.2 裁剪与标准化(为了进行性别分类)
这里openCV给的那个crop_face.py确实不错,进行了裁剪,又将眼睛的位置对齐了,否则又要费老半天劲来做矩阵变换,想想都烦。将上一步计算出的人眼的位置传给CropFace函数,OK。如果你问我为什么不在VS里面做这些,还非要又用C++,又用Python,这个主要是因为人家给了现成的CropFace的函数,我才懒得用C++再写一遍。既然我选择了这种方式,那就涉及到了exe程序与Python程序之间的通信问题,我使用的方法见我的另一篇文章【python】python运行exe,并获取exe的output,于是将所有图片都标准化了。
2.3 性别识别
性别识别使用的还是openCV,具体还是看我的文章【opencv】人脸识别、人眼识别and性别识别 里面说的吧,openCV的document里面关于gender classify的部分帮助其实更大一点,这里推荐的是去Google Image上,直接搜明星的人脸来作为训练数据,但是我发现使用openCV自带的人脸识别和人眼识别的XML并不能很好地识别多种场景下的人脸,尤其是人眼!我不是搞这方面研究的,也不想深究,于是果断换成用自己扒的证件照来train一个classifier,效果一般,男生被误分成女生的情况还是很多的,手动挑拣出来之后女生约有700张,男生1100张,就这样吧...
2.4 裁剪与标准化(用来进行加权)
这里重新裁剪,因为2.2用的裁剪图要小很多,只有一张脸而已,要做加权的话,还是大一点比较好看,于是就使用不同的参数重新crop,OK
3.使用Matlab计算平均脸
使用Matlab是因为Matlab比较简单而且处理图片相加这种操作还比较快(我对Python的PIL不熟,本来想尝试一下,后来放弃了)
得到结果:
这里的平均脸其实真是算术平均的结果,效果比起AAM自然是要差不少,尤其是距离眼睛比较远的地方比较模糊,就这样罢。