欢迎光临来到来看看! [加入收藏] [设为首页]

程序猿是如何算出你的“颜值”的?

2015-01-14 10:44 点击:

某日偶遇同窗好友在用某款测颜值的APP。问他得了几分,他微微一笑,“必须是9分男神。”诧异间我又随手搜了张凤姐的照片一试,竟然得了9.4分。这次轮到我大笑了。“哈哈,男神女神果真般配啊。”

后来笔者听闻好友玩的那款测颜值APP竟然也风靡一时。我一时好奇间就先拿两款APP做了测试。第一组测试对象是高圆圆和凤姐。结果嘛,呵呵。凤姐以9.4的高分力压女神高圆圆呢!第二组测试对象是我家沙发。这些APP再次显示了自己的无能为力。同一个沙发得分基本上均匀的分布在1-10分之间。没错,一张沙发的照片有时候都能得到9分以上。这种简单的颜值APP甚至都不太能进行面孔识别。还要它们来进行标准化打分,实在是为难了。

话说回来,即使人工来打分,大家也口味各异,御姐萝莉各有所爱。一款APP又岂能判断美丑呢?所以用APP测了颜值的大家,高分玩家勿要得意,低分玩家也不用暗自神伤,当成饭后娱乐笑笑便好了。

虽说这些APP性能还不够强大,但是实际上的确有科学家研究过人脸的美丽程度,并试图以此为依据开发“颜值算法”。这里就简单介绍一下吧。那就是广为流传的“平均脸”效应了。科学家曾做过这样的实验,找来志愿者看大量的人脸照片,给照片打分。实验结果表明,人们更喜欢对称的脸。另外研究表明,将大量人脸取平均得到“标准脸”,脸的指标和这种“标准脸”越接近,越是让人觉得好看。

韩国仁济大学整形外科教授李承哲在2010于国际美容整形外科学会(ISAPS)下属刊物《美容整形外科》中发表一篇论文,发布了使用全球多名最漂亮女艺人的照片合成的五张平均脸。即使是跨人种,我们也依然能发现美貌的一致性。其中中国人的面孔是不是很像某位明星?

大概就是“丑人多作怪,美人一个胚”的感觉吧。而正是这种“美人一个胚”的现象让颜值算法有了可行性。至于为什么APP表现不太好,请吐槽不靠谱的码农吧。

从进化角度来看,“美人都似一个模子里出来的”也并不让人意外。进化是经过漫长自然选择的结果,拥有平均性状的个体也更容易幸存。

最后再Geek地介绍一下“颜值算法”。

刚才我们说了,长得对称又标准,是基因正常、健康状态良好的体现和保证,从进化的角度来看是很合理的。因此,如果得到了这些人脸的数据,我们可以通过计算人脸的对称性和与“标准脸”的差距,定性计算“颜值”。

接下来的问题是,怎么用软件得到这些测量指标呢?或者说,怎么让软件“认出”人的脸呢?其实,人脸检测是计算机科学领域一个重要方向,已经有了诸多发展。在人脸检测算法中, 按发展顺序有基于知识的模板匹配,纹理特征,颜色特征,基于统计的PCA特征脸,支持向量机,AdaBoost方法等等。

想想看我们自己是怎么识别出人脸的呢?很多时候我们看到一些石头或云,也会觉得像人的脸,不论总体上有多么大差距,那往往是因为恰好有什么东西构成了眼睛、鼻子和嘴。再想一想我们怎么堆雪人的?最后是不是往往要弄个眼睛鼻子嘴什么的才有“人”的感觉?没错了!其实眼睛、鼻子和嘴对我们识别人脸有非常重要的作用。我们对人的脸有一些先验知识,知道眼睛鼻子嘴等等的形状、特征,知道它们之间相互位置,和这些先验知识符合程度高的,我们的大脑就会判断为是人脸。

这也是计算机人脸检测的两大类方法其中之一,基于知识的方法。这类方法检测人脸的过程和我们的大脑类似,都是根据轮廓、颜色、纹理等等,判断是否是人脸。例如,我们简单推理一下就能得到一种思路:先找眼睛鼻子或者嘴巴的轮廓。当然这对计算机还是有点难,但计算机有方法可以找到边界线,或者椭圆直线等几何图形。用这些方法可以找到图像中的线条和形状,再从中提取脸的明显轮廓,比如鼻子眼睛和下巴的轮廓来定位人脸。即先用对图像进行边缘提取,再判断哪些边缘是脸的轮廓哪些边缘是眼睛鼻子等等。

但和人脑不同,这样灵活的分析对计算机来说仍然有点吃力。人的五官各种各样,很难制定出一套规则教会计算机正确识别;现实生活是3D的,而照片是2D的,这些增加了人脸检测的难度。所以科学家们找到了另外一类方法来检测人脸——基于统计的方法。这就属于近些年非常火热的机器学习了。

这类“人脸人工智能”方法放弃了具体分析人的眉眼,而是把人脸看作一个整体,不用区分是五官还是脸颊,“鼻子眉毛一把抓”,整张照片的所有像素点都交给计算机分析。通过大量的人脸图片,构建出计算机能理解的人脸模式空间,再根据相似度来判断人脸。这里的“通过大量的人脸图片”就是一个人脸识别机进行学习的过程。

1991年MIT科学家发表了基于主成份分析(PCA)的特征脸方法,通过一个变换矩阵进行投影,将高维图像信息变到低维子空间,提高了计算效率与准确率。2001年P. Viola和M.J. Jones发表了经典的《Rapid Object Detection using a Boosted Cascade of Simple Features》和《Robust Real-Time Face Detection》提出了基于哈尔特征积分图方法 和AdaBoost级联的著名方法,从此计算机真正做到了可以实时监测人脸。

哈尔特征是挺有意思的特征,从这个特征就我们很容易就能看出人类思维和计算机算法有多么大的差别。

哈尔特征在图像中取大大小小很多矩形,将矩形分成两份或三份,用黑白两种颜色标记,将黑白两色矩形里的像素值和相减得到差值。然后用这些差值来对图像的子区域进行分类。通过不同的黑白矩形组合,就能提取边缘特征、线性特征、中心特征和对角线特征,共同构成特征模板。除了平行的矩形框,还可以取45度的矩形框。通过改变特征模板的大小和位置,可在图像子窗口中提取出大量的特征。哈尔特征值反映了图像的颜色灰度变化情况,由于通常眼睛、嘴要比脸颜色深,鼻梁两边比鼻梁颜色要深,所以一部分面部特征能由哈尔特征描述。这种方法更好得利用了五官之间的相互位置信息,所以能得到很好的检测准确度。

好啦,看不懂也没关系。这正是因为计算机思维和人类思维存在巨大差异。这样的方法看上去傻瓜又繁琐,算那么多矩形似乎即费时间又漫无目的,我们判断人脸的时候是不会这么做的,但计算机就适合这样简单繁琐的工作。

再简单总结一下算法过程,理论上可以实现对“颜值”的打分:1)通过计算机算法在照片中检测到人脸;2)定位五官,提取人脸的各项数据、指标;3)根据指标计算脸的对称性、与“标准脸”的差距,计算“颜值”。

希望下一代颜值APP们可以用上更好的算法。至少要能告诉我们高圆圆比沙发美多了吧。