如何以正确的姿态让@微信官方给我戴一个圣诞帽与技术实现原理剖析

853 阅读6分钟

昨天到今天,朋友圈在刷屏这样一句话:

给我一个圣诞帽!@微信官方

当然啦,我也发现了许多好友头像戴着一顶红色的圣诞帽(也有部分是一顶绿色的帽子)。但是让人想不到的是,这么简单的互动产生了两类质疑:

  1. 发个朋友圈就真的可以给头像加个圣诞帽,假的吧?
  2. 为什么我发了朋友圈,头像没有变呢?

那么告诉你,在阅读完这篇原理介绍之后,并按照指导规范,相信你一定能顺利的带上圣诞帽,在朋友面前炫耀一番。下面就进入详细的解答模式。

首先我们来看,微信究竟是怎么做到的呢,从发布这段话到实际给头像戴上圣诞帽都历经了些什么?从技术角度实现来看,要实现这样一个功能,需要历经如下几个步骤:

  1. 读取用户发布文字,识别操作指令;
  2. 获取用户头像图片资源,进行人脸识别与定位;
  3. 针对用户需求与实际的识别结果进行图层添加,并更新;

所以这么看,整体来说还是很简单的。我相信有一部分同学肯定想了解的更多,那么我就再多介绍些上线上的细节与原理。

1. 识别“添加圣诞帽”的指令

首先是根据用户发布的内容进行操作指令的识别。由于这是微信官方在圣诞节为大家发布的一个互动新功能(即日后不会变成常驻功能),所以不涉及到复杂的逻辑,正则表达式足以 handle 这里的所有难题。

一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列匹配某个句法规则的 字符串。例如:HandelHändelHaendel这三个字符串,都可以由“H(a|ä|ae)ndel”这个模式来描述。 —— 维基百科

正则表达式的强大之处在于它可以通过一个模式匹配批量的“变种”文字内容,例如我们可以通过如下表达式匹配一个 Email 地址:

[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?

根据大家在朋友圈发布的内容和效果来看,微信采取的正则匹配策略包含如下几点:

  1. 识别文字尾部的“@微信官方”触发器(作为内容结尾,匹配一次);
  2. 识别文字开头到触发器之间的文字,必须包含“圣诞帽”字样(匹配一次),个数以及颜色作为可选项(匹配任意次数)进行匹配;

所以这就是为什么“你也发了朋友圈,但头像没有变”的原因了:

  • 五颜六色这种色系是不能被识别的
  • 为了想快点拿到圣诞帽而修改识别符为昵称“微信爸爸”也是不行的
  • 给他人戴帽子也是不行的,什么颜色的帽子都不行

最标准的做法就是这样

2. 识别人脸与头像姿态

该部分作为整个流程最复杂的部分,也是整个过程技术含量最高的环节。

人脸识别这项技术并不高深,且已经获得了广泛商用。就在刚刚结束在乌镇举办的世界互联网大会上,迅速成长的人脸识别公司 Face++ 将其技术用到了参会者身上。在其展台的一块大屏幕上,软件会确定被识别者的性别,描述他们的头发长度和颜色,以及他们所穿的衣服。

而人脸识别这样技术,从算法角度来看,主流实现基本上可以归结为三类,即:基于几何特征的方法、基于模板的方法和基于模型的方法。

  1. 基于几何特征的方法是最早、最传统的方法,通常需要和其他算法结合才能有比较好的效果;
  2. 基于模板的方法可以分为基于相关匹配的方法、特征脸方法、线性判别分析方法、奇异值分解方法、神经网络方法、动态连接匹配方法等。
  3. 基于模型的方法则有基于隐马尔柯夫模型,主动形状模型和主动外观模型的方法等。

在人脸识别的基础上,为了顺利添加圣诞帽,还需要解决一个问题,即姿态问题。

姿态问题涉及头部在三维垂直坐标系中绕三个轴的旋转造成的面部变化,其中垂直于图像平面的两个方向的深度旋转会造成面部信息的部分缺失。使得姿态问题成为人脸识别的一个技术难题。本次活动中所采用的是基于姿态不变特征的方法,即寻求那些不随姿态的变化而变化的特征。中科院计算所的思路是采用基于统计的视觉模型,将输入姿态图像校正为正面图像,从而可以在统一的姿态空间内作特征的提取和匹配。

官方采用的是 Cascade CNN 模型来实现的人脸识别功能,Cascade CNN 是对经典的 Violajones 方法的深度卷积网络实现,是一种检测速度较快的人脸检测方法。使用 VGA 图片,在 CPU 上达到 14FPS,GPU 上达到 100FPS,在 FDDB 上达到 85.1% 的召回率和 87% 的准确率。

从机器计算的角度来看,该识别流程的一个 detector pipeline 可以划分为如下几个环节:

想了解细节的同学可以翻到最下方参考部分阅读相关文献。

3. 制作新头像

在定位了头像以及姿态之后,所需要做的就是图层的叠加,官方后台存有100多种圣诞帽的素材,后台服务会先新建一个 canvas 图层导入原有头像,然后适配一个合适的圣诞帽进行叠加,针对姿势、大小、颜色作相应的调整,然后将结果导出为 png 图片更新进数据库,并通知前端 fetch 更新用户头像。

据悉,这里的一整套操作流程已经规范化,后续官方将会将这套整合了自然语言处理、人脸识别与后端资源处理自动化的解决方案开源到 GitHub ——全世界最大的同性交友平台上,请持续关注。

写在最后

我们其实也需要对自己的头像进行一翻审视,太难的头像....也会增加微信实现的难度,比如说这种脑袋太多的..

又比如说这种识别不到人脸的..

那么现在就赶快去试试吧,看看你的头像有没有变化。

下面是我的圣诞帽,可爱么?

是的,当然不会有变化了。

因为,以上都是我胡说八道的哈哈哈哈。

个人公众号,微信搜索「 黯晓 」

weixin.qq.com/r/lCgpMZ-EB… (二维码自动识别)

参考

  1. 正则表达式 - 维基百科
  2. Building a Facial Recognition Pipeline with Deep Learning in Tensorflow
  3. A summary of deep models for face recognition
  4. 人脸识别主要算法原理 - liulina603的专栏 - CSDN博客
  5. CascadeCNN人脸检测学习笔记 - CSDN博客
  6. 人脸识别 - 维基百科