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

【不要错过文末彩蛋】

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

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

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

原始

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

化妆

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

妆前护肤

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

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

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

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

彩妆

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

基本流程如上图所示:

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

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

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

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

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

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

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

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

服饰

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

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

拍照

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

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

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

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

出门

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

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

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

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

检测

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

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

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

可见,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. 知名互联网公司安卓工程师 · 张拭心:《安卓工程师跳槽面试全指南》

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

  1. 从国企到互联网,一个初入职场将近一年半工作经验程序员的「得」与「失」

    写在前面 2020 年 7 月 29 日,我只身一人来到北京,开始人生中的第一份工作,在一家国企从事软件开发工作. 2021 年 6 月底,我从国企离职,然后进入了一家互联网公司,从事软件开发工作. ...

  2. 从国企到互联网,一个六年程序员的「得」与「失」

    程序员,六年,四段工作经历,这也许是一份会被很多 HR 刷掉的简历. 从学生时代至今,我经历了两次大的方向转型和一次大的技术转型:从偏理论推导的数学学科到重工程实践的计算机学科:从「安稳固化」的国企到 ...

  3. 那些进大厂的程序员,「简历」都是怎么写的?我决定分享出来

    你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和 ...

  4. 开源的恶果,程序员正在「自掘坟墓」

    大家好,我是校长. 最近开源社区里发生了一件大事,在 IT 圈引起了轰动,那就是:faker.js 开源项目的作者删除了该项目的所有代码. 01 事情是这样的 作为一个著名的 nodejs 工具库,F ...

  5. 程序员与「中台」的爱恨交错

    大家好,我是Z哥. 这篇文章比较长,有5200+字,不过希望你能耐心看完,特别是程序员. 中台这个词,最近两年特别火,它的爆发源于2015年张勇在阿里发出的内部信中提到的"大中台,小前台&q ...

  6. 8个月打磨,一份送给程序员的「分布式系统」合集

    这里是Z哥的个人公众号 每周五早8点 按时送达 当然了,也会时不时加个餐- 我的第「75」篇原创敬上 整理好的文章目录在文末,可直接拉到最后 是的,这份礼物最佳受众是程序员.但是,如果你不是程序员,相 ...

  7. 周鸿祎称不理解35岁程序员被「抛弃」,网友:你招吗?

    中年危机,已是一个普遍的社会问题.而对程序员这个群体来说,35 岁的危机感似乎格外沉重.但危机,从来只有正视才能发现问题的根源.阿里 CEO 张勇表示"可以创造条件",360 创始 ...

  8. 大厂程序员普遍「农村」出身,所以爱内卷?

    提起程序员,很多人的脑海中会飘过两个词:高薪和加班.互联网行业更新换代速度快,程序员在拿着高薪酬的同时,为了"跟上趟"加班也是常有的事. 最近,播妞在某平台上看到一个帖子,有位网友 ...

  9. [参考C3程序员] - C语言贪吃蛇(二维数组)

    感谢C3程序员的课程,讲的很详细.下面是贪吃蛇的具体代码,与视频教程相比略有改动,大部分子程序都加了详细的注释. #include <stdio.h> #include <stdli ...

最新文章

  1. suse安装MySQL-python_python2.7.9安装mysql-python模块
  2. 040_Tooltip文字提示
  3. VTK:绘图之StackedPlot
  4. 【微信小程序】使用Hystrix的插件机制
  5. 选出你最喜欢的Linux操作系统吧
  6. USACO(含training section)水题合集[5/未完待续]
  7. Java快速入门学习笔记5 | Java语言中的while循环语句
  8. Java并发编程 ReentrantLock 源码分析
  9. asp.net 母版页使用方法
  10. 从源码解析LinkedList集合
  11. 分光光度计的使用及注意事项
  12. 最大流最小割定理证明
  13. html毕业答辩ppt,毕业论文答辩ppt(要求和制作技巧)
  14. OpenCV的Mat格式和IplImage格式的使用
  15. 外包,你是外包,麻烦你不要偷吃公司零食,注意素质...
  16. python 使用公司邮箱发邮件_python 使用腾讯企业邮箱发送邮件
  17. matlab质心原理图,matlab:绘制质心
  18. 火车进站问题-HDUOJ
  19. 几款常见开源php博客体验
  20. dede采集过滤规则

热门文章

  1. 解决windows防火墙拦截FTP连接
  2. 转不撞南墙不回头——树规总结
  3. C++11 auto自动推导
  4. CTO、技术总监、技术经理的区别 互联网技术团队的角色区分
  5. 数据加密-国密SM2对数据进行加解密
  6. 怎样计算机表格中算出平均值,怎样设置excel自动计算平均值
  7. android朋友圈发文字换行,微信朋友圈全文展开 朋友圈文字怎么换行朋友圈发多行文字...
  8. 【艾琪出品】-【计算机】《办公自动化基础》-韩伟颖(2002)南开离线作业学习资料
  9. 使用docker安装mysql5.7
  10. 如何在 Linux 系统中添加桌面图标