python程序生成平均脸

python程序生成平均脸

简介

项目代码LiuRoy/pokerface

写这个项目的本来目的是通过构建一个神经网络来训练人脸图片,最后达到能根据图片自动判断美丑的效果。可能是因为数据集过小,或者自己参数一直没有调正确,无论我用人脸关键点训练还是卷积神经网络训练,最后都没有得到任何效果。为了不让自己前期写的代码变成无用代码,就参考网上的一些资料写了一份平均脸生成代码,感觉也还挺有意思的。

数据准备

数据来源是上海市毕业生图像采集网,2013年自己马上要毕业的时候网站公开了下载自己毕业照的链接,但是因为下载有漏洞,被很多无聊的人(包括我)跟风下了一波,有一个同学还用这些图片做了一个facemash,结果被教务处请去喝了茶(美国的扎克伯克比我们不知道高哪儿去了)。当时只是自己觉得有意思,把同届的人的照片下了一份,它们一直静静的躺在硬盘里,直到最近又把它们翻了出来。

因为是证件照,所有的照片尺寸都是640*480,背景是蓝布,正脸,素颜,非常适合用来训练模型或者做平均脸。之前也说了原本目的是训练模型用,所以也需要给照片里的每张脸打一个标签,此处没有采用当下十分流行的十分制,只是按照自己的审美观把照片分为丑、一般和漂亮三个等级(本人审美观十分普通,五官不协调或者脸型太差的直接认为丑,看着顺眼的认为一般,五官十分精致的认为是漂亮)。运行时如下:


此桌面程序(judge.py)还会把调用face++的API接口检测人脸关键点,这些关键点也是平均脸制作的关键所在,最后所有的标签和关键点数据都存放在face.sqlite中。大家可以注册face++账号尝试一下,关键点检测效果如下。


平均脸制作

一种比较简单的制作方式就是把所有的图片关键点对其之后做均值叠加,详细的可以看一下这个博客,这种方法的弊端也很明显,例如把所有的图片中眼睛对齐,最终合成的图片眼睛稍微清楚,但是其他地方就会模糊的一塌糊涂。这当然不是我们想要的结果,另外一种方法通Delaunay triangulation 把人脸关键点对齐,然后再做均值叠加,最终生成的照片会清晰很多,详细的过程和理论何以参考Average Face : OpenCV ( C++ / Python ) Tutorial

平均脸生成的代码是average.py,最后我把从4100照片里面挑选出来认为漂亮的49张照片做了一个平均脸,最后的生成结果如下:


效果还是挺不过的,我猜这就是我的梦中情人了吧,不过这也太像刘诗诗了!用face++的相似脸检查一下,果然就是刘诗诗。


PS1:本来想做的没有做出来,白花了一天时间给四千多张图片打标签,想想还是挺郁闷的。
PS2:为什么不把所有的人做一个平均脸,因为对我来说没什么意义,我就是想单纯的想看一下我觉得漂亮的女生是什么样子。

作者:腩啵兔子

出处:腩啵兔子的博客专栏

最近很多人私信问我问题,平常知乎评论看到不多,如果没有及时回复,大家也可以加小编微信:tszhihu,进知乎大数据分析挖掘交流群,可以跟各位老师互相交流。谢谢。

编辑于 2017-02-05

文章被以下专栏收录