程序员用「美貌」突破二维图像的人脸识别

GitChat 作者:于航
原文: 如何利用“女装术”突破基于二维图像的人脸识别
关注微信公众号:「GitChat 技术杂谈」 一本正经的讲技术

【不要错过文末彩蛋】

首先声明,这并不是一篇认真严肃地讨论某种IT技术的文章,但这并不代表本文所描述的内容和观点没有任何技术含量。其次,本人在撰写这篇文章时已经征得女朋友的同意,本人也无任何精神类疾病史,所以请诸位放心阅读。

传统的人脸识别技术主要包括“基于几何特征的方法”、“基于模板的方法”和“基于模型的方法”,“基于几何特征的方法”是通过将面部几个重要器官的特征点位置作为分类特征进而推导出一组特征向量,向量中包含如距离和角度等信息,每一幅人脸画面之间通过各自的特征向量来计算对应的相似度进而进行人脸识别和判断,但由于特征点的数量过少,并且特征点的敏感性不高,因此该方法的准确率并不高。

“基于模板的方法”作为“几何特征方法”的改进,加入了一个“损失函数”(Cost Function),通过调节和优化该损失函数,使该函数最小化时对应模型的准确率最高,但这种方式的计算量过大并且需要大量的预处理和精细的参数选择,神经网络便是“基于模板的方法”中的一种。“基于模型的方法”中效果较好的弹性图匹配技术是通过几何特征和对灰度分布信息进行小波纹理分析相结合的识别算法,但该算法的时间复杂度较高,速度较慢,实现复杂。如果将这些种方法根据计算成本、准确率等方面综合对比下来,基于“神经网络”的人脸检测方案会更具有优势。但这些技术仅仅基于二维图片信息所给出的特征而作出的人脸判断结果,其鲁棒性是否可靠呢?

原始

在化妆之前,我们先用未经加工的原始图片来进行人脸检测,记录一下化妆前的效果。这里我直接选用了头像的照片,人脸检测平台选用了 Face++。可以看到检测结果中的性别正确,但是年龄推断的准确率并不高,脸部的各个特征点定位准确。

程序员用「美貌」突破二维图像的人脸识别_第1张图片

化妆

化妆这部分我主要以简单介绍自己常用的基础护肤和彩妆流程为主,具体的化妆教程和产品大家还是通过相关视频来学习和选购比较详细清楚,毕竟很多需要注意的细节是很难用几张图片来描述清楚的。

妆前护肤

一个精致的妆容最重要的就是底妆,底妆的好坏直接决定了彩妆最后的效果。而底妆之前的妆前护肤过程也直接决定了底妆的好坏。一个简单通用的妆前护肤流程如果用 Flowchart 来描述的话是这样的:

程序员用「美貌」突破二维图像的人脸识别_第2张图片

其中虚线框代表可选过程。第一步通常都是用清水洁肤,也就是俗称的洗脸。在洁肤的过程中是否需要使用洗面奶要看个人,由于洗面奶具有较强的洁面去油功效,因此大部分都含有表面活化剂,不建议一天使用超过两次。一般我们都是在睡前使用洗面奶来进行彻底的洁肤,如果是隔天早上需要化妆,则第二天早上的洁肤过程便不建议再使用洗面奶了。当然这个具体还是要因人而异,如果你的皮肤出油情况特别严重影响了上妆的过程,那可能还是需要一次彻底清洁的过程。

在洁肤之后是可选的敷面膜过程,这个过程并不是必要的。但如果你是很严重的干皮,可以考虑加入一个补水面膜的过程。后续的水、精华和乳液则是常用的套路,也是日常护肤中需要的步骤。我自己使用的是 Innisfree 的绿茶水加乳液和红石榴的精华,当然你也可以选择一些男士专用的产品,但基本上都差不多。

这里大致说下精华、水和乳液的基本作用。这里的水一般指化妆水或者爽肤水,主要是用来为肌肤迅速补充水分同时恢复皮肤的酸碱平衡。乳液的主要作用是用来保湿和补充营养。精华一般含有高浓度的护肤成分,主要用于除皱、保湿、美白和抗衰老等作用,在一定程度上可以修正肌肤的问题。

彩妆

彩妆是一个很大的话题,每一个部位的彩妆画法都有很大的学问。首先还是通过一个 Flowchart 来概括下我自己化妆时彩妆部分的大致流程:

程序员用「美貌」突破二维图像的人脸识别_第3张图片

基本流程如上图所示:

  1. 修容(遮黑眼圈、胡青)。首先胡子作为男人的第二性特征当然要作为处理的重点,首先要剃干净,对于一些胡青很重,粉底难以遮挡的童鞋来说可以尝试用遮瑕液和遮瑕膏进行遮盖,然后再用遮盖力较高的粉底处理即可。同样的,对于经常熬夜的人来说,黑眼圈也是必须要用遮瑕膏/液处理掉的。遮瑕膏的色号需要比自己的脸部肤色深一个色号。

  2. 粉底/气垫CC。下一步是上粉底的过程,这里可以选择粉底液或者CC气垫,具体使用哪种可以看心情,个人感觉没有明显的区别。上粉底液时可以选择使用手指、气垫或者美妆蛋等工具。手指比较服帖但容易涂不均匀,美妆蛋比较吃粉会使粉底液的遮瑕能力大打折扣,所以气垫是一个很好的选择。选择粉底时建议选一个比自己脸部肤色白一个色号的。

  3. 散粉定妆。到这里我们的底妆就基本完成了,用散粉定一下妆可以使妆容更自然、更持久。为后面上彩妆打好基础。

  4. 修容(阴影、高光、鼻影)。首先我们要对面部的整体轮廓进行调整,包括面部的高光和阴影,以及鼻影。面部的高光和阴影可以使面部的轮廓更加突出,让五官更加立体。同时修饰脸型,让脸部看起来更小、更精致。

  5. 眼妆(眉毛、眼影、眼线、假睫毛、卧蚕)。眼妆可以说是整个彩妆阶段最重要的部分,一个炯炯有神的大眼睛可以掩盖面部的一切问题,因此怎样化妆能够让自己的眼睛显得更大更有神是这个步骤最需要解决的问题。首先是眉毛部分,其实眉毛和眼妆应该是独立开来的,这里为了简化流程所以放到了一起。眉头的位置和自己的虹膜内侧边缘应该在一条垂直线上,眉尾的位置是由眼角到鼻头的直线和眉毛所在直线一起决定的,两条直线所在的交点即为眉尾的位置。接下来画眼线,眼线分为内眼线和外眼线,内眼线是指眼睫毛下部内侧的眼线,同理外眼线是指眼睫毛根部到眼皮方向的外侧眼线。接下来是假睫毛,在黏假睫毛之前需要先把假睫毛专用的胶水涂抹在假睫毛的根部,然后用手指将假睫毛适当弯曲成与自己眼睫毛同样的弧度,接下来再用夹子夹住假睫毛并粘在自己外眼线贴近睫毛根部的地方即可。卧蚕位于眼睛的下眼皮,我们一般先用阴影勾勒出卧蚕的边缘,然后再用高光填充卧蚕的区域即可。

  6. 腮红。建议使用上色力度不强的腮红来进行少量多次的上色。上腮红的位置一般是在眼睛下方一直到颧骨的位置。一般是以水平的方向从鼻梁两侧向颧骨方向上色。

  7. 口红(润唇膏、口红/唇釉)。在涂口红之前需要先涂一层润唇膏,因为化妆品里多少都会含铅,口红也不例外。在擦口红之前擦润唇膏,可以有效的防止口红中的色素渗入唇部纹路,从而减少了铅与皮肤直接接触的机会。除此之外,润唇膏也可以有效的防止嘴唇由于干燥而引起的脱皮问题。

  8. 散粉定妆。在所有的彩妆流程结束之后,我们最后再用一层散粉来定妆,保证妆容的持久性同时让妆容更加自然和服贴。

服饰

关于服装的选择,这里主要强调一下,男性相对于女性,其体型的特点是上肢宽壮,下肢细长,腰跨比基本一致。因此建议选择一些宽松的上衣,比如卫衣,可以很好的隐藏过宽的肩膀和强健的肌肉线条。下身的基本建议就是裙子了,不管是长裙短裙还是苏格兰裙,只要你喜欢就可以。鉴于男性的平均身高一般比女性要高,因此鞋子的话建议无跟或者1-2厘米跟的单鞋即可。

可佩戴的饰品有很多种类,手链、手环、脚链等常见饰品。指甲油可以选择水性型的,这样可以在不需要的时候直接撕扯掉。喷撒适量的香水可以在一定程度上增加自己的魅力,建议选择如淡香水等味道不太重的香水。耳坠可以选择带有耳夹并且可以调节松紧的类型。还有一些纹身贴纸可以根据自己的喜好来使用。头饰尽量选择较为简单的夹子或者头绳。假发建议选择自然黑的梨花中长发,过长的头发并不好打理,很容易打结与掉发。过短的假发达不到遮住肩部的效果。除非你的肤色本来就特别白,否则请尽量不要尝试黄色的假发。中长长度的头发同时也可以很容易的打造出各种各样的发型,比如“半丸子头”等可爱的造型。

拍照

网上有多到看不完的各种各样的拍照技巧,但其实需要注意的点有几个,只要掌握好这几个自拍技巧(只是自拍),基本上大部分情况都可以驾驭:

  1. 记得收紧下巴。记得在每次自拍甚至外拍的时候都要提醒自己一定要收紧下巴。收紧下巴可以让自己的脸更好的对准镜头,同时可以让下巴边缘与脖子有更加明显的分界线,不会产生脸部很大的错觉。

  2. 斜向下45度拍摄。这是一个常用的技巧,相信很多人都听说过。同时再配合第一条收紧下巴的技巧会产生更好的效果。这个角度的照片会给人一种脸小的错觉,同时眼睛距离镜头较近,相对脸部会被放大。脸小眼睛大,这不就是我们想要的效果吗?

  3. 不要刻意笑。刻意笑和发自内心的笑在表情的细节上有很大不同,自然的笑会同时带动脸部的几百块肌肉一起发生变化,而刻意的笑可能只是嘴部周围的部分肌肉发生了变化,这种肌肉的变化体现在照片上并不会给人带来美感。因此不要刻意的笑,微笑也不要过于刻意和夸张,自然的表情最为重要。

出门

这一部分并不包含在人脸识别的实验之内,当然如果你想着女装出门的话可以参考这部分给出的建议:

  1. 夏天出门。夏天出门首先要注意防晒,除了涂抹防晒霜外还可以选择带一把防晒伞。喉结可以选择佩戴一些 Chocker 来遮挡。由于夏天较热很容易出汗花妆,因此可以选择佩戴一副墨镜出门,在某种程度上可以帮你遮挡花掉的妆容。

  2. 冬天出门。冬天出门也要根据天气注意防晒。相较于夏天而言,由于冬天穿着的衣服较多,因此如喉结等部位可以通过围巾来遮挡,这样不仅可以遮挡喉结同时还起到了保暖的作用。另一方面怕花妆的朋友可以选择随身携带一次性口罩,必要的时候会帮助你度过难关。

要注意的是,女装出门不宜时间过长,由于男性的胡子生长速度较快,因此对于一些胡子生长速度较快的人,经过6-10小时后,遮瑕基本已经无法遮挡胡子的颜色。

检测

经过了前面的化妆和拍照阶段,接下来便到了检验成果的时候。

将如下所示已经拍摄好的两张经过轻度美颜处理的照片分别经过同样的 Face++ 人脸识别平台进行处理。

程序员用「美貌」突破二维图像的人脸识别_第4张图片

最后得到的结果如下所示:

程序员用「美貌」突破二维图像的人脸识别_第5张图片

可见,Face++ 对两张图片的人脸识别结果中的性别判断并不准确。这同时也显示了二维/图像人脸识别的一些局限性,在缺少了面部各个部位高度这一特征后,单纯的二维图片可以对其上的像素排列进行任意的改变,并且这种改变的成本并不高。Face++ 的整个人脸识别流程可以归结为:人脸检测 -> 人脸定位 -> 人脸几何校正 -> 人脸光学矫正 -> 特征向量提取 -> 人脸识别

当一张人脸图片输入人脸检测系统后,首先需要通过人脸检测先找到并确认出人脸的位置,然后在这个基础上定位人脸关键点的位置(如眼睛中心或嘴角等)。这些关键点的位置可以用来进行人脸的几何校正,即把人脸通过缩放、旋转、拉伸等图像变化变到一个比较标准的大小位置。这样待识别的人脸区域会更加规整,以便于后续进行匹配。接下来带有标准点的人脸图像会通过一些滤波的方法,去除一些对光照更加敏感的面部特征。在经过这些预处理过程之后,我们就可以通过诸如 Gabor 等边缘检测算法从人脸区域提取各种特征。这些特征数值最后会被拼接成一个特征向量,这个特征向量会经过最后的人脸识别系统进行特征比对,最后得出识别结果。

收尾

我们并不清楚 Face++ 对于人脸性别的判断是基于哪些特征进行的,但无论如何,基于二维图像的人脸识别判断很难达到99%的准确率,并且其鲁棒性也无法达到一个很高的要求,因此也无法用于需要较高准确率的安全验证领域。相对基于简单二维图像的人脸识别技术,增加了基于红外高度测量技术的三维人脸识别技术未来将会有更广阔的应用场景。

【GitChat达人课】

  1. 前端恶棍 · 大漠穷秋 :《Angular 初学者快速上手教程 》
  2. Python 中文社区联合创始人 · Zoom.Quiet :《GitQ: GitHub 入味儿 》
  3. 前端颜值担当 · 余博伦:《如何从零学习 React 技术栈 》
  4. GA 最早期使用者 · GordonChoi:《GA 电商数据分析实践课》
  5. 技术总监及合伙人 · 杨彪:《Gradle 从入门到实战》
  6. 混元霹雳手 · 江湖前端:《Vue 组件通信全揭秘》
  7. 知名互联网公司安卓工程师 · 张拭心:《安卓工程师跳槽面试全指南》

你可能感兴趣的:(人工智能,人工智能专栏)