1、动机

人类面部表情丰富,但可以总结归纳为 7 类基本表情: happy, sad, surprise, fear, anger, disgust, and neutral。面部表情是通过面部肌肉活动表达出来,有些比较微妙且复杂,包含了大量内心活动信息。通过面部表情识别,我们能简单而低成本地度量出观众/用户对内容和服务的态度。例如,零售商使用这些度量评估客户的满意度。健康医疗提供商能在治疗的过程根据病人的表情状态来提高服务。娱乐厂商能够监控观众的喜欢来持续的生产优质的内容。

“2016 is the year when machines learn to grasp human emotions” --Andrew Moore, the dean of computer science at Carnegie Mellon.

训练过的人类很容易读懂其他人的情绪。事实上,只有 14 个月大的婴儿就可以区别出 happy 和 sad 的区别。但是计算机能够比人类在识别情绪上做的更好吗?为了找到答案,我们设计一个深度神经网络使得机器可以读懂人类情绪。换句话说,给机器以“眼”识别面部表情。

2、语料数据

训练模型的数据集使用的是 Kaggle 面部识别挑战赛的数据集(2013 年)。它由 35887 张面部图片组成,48x48像素灰度图片,标注为 7 类基本表情: happy, sad, surprise, fear, anger, disgust, and neutral。

图 1 An overview of FER2013

当作者分析语料数据集时,发现“disgust”分类相对于其它分类不均衡(只有113 张样本)。作者将两类相似的情感(disgust 和 anger)合并起来。为了防止数据倾斜,作者构建一个数据生成器 fer2013datagen.py [1],该生成器很容易分割训练集和保留数据集。本例使用 28709 张面部图片作为训练集,余下的图片作为测试集和验证集(每个数据集 3589 张)。这样我们获得了 6 类均衡的数据集,见图2,包含 happy, sad, surprise, fear, anger, and neutral。

图 2. Training and validation data distribution.

3、算法模型

图3. Mr. Bean, the model for the model.

深度学习在计算机视觉上是非常流行的技术。本文选择卷积神经网络(CNN)层作为构建基础创建模型架构。CNN 是有名的模仿人脑工作的模型。本文使用憨豆先生的图片作为示例来解释如何将图像赋值给卷积神经网络模型。

典型的卷积神经网络包涵输入层,卷积层,稠密层(比如,全联接层)和输出层(见图4)。这些层按序组合,在 Keras [2] 中,使用 Sequential() 函数创建模型,再把其它层加入进来。

图 4. Facial Emotion Recognition CNN Architecture (modification from Eindhoven University of Technology-PARsE).

3.1 输入层

输入层需要预处理,输入固定维度的数据。所以图片需先预处理再传入输入层。作者使用 OpenCV(计算机视觉库)做图像面部识别。OpenCV 的 haar-cascade_frontalface_default.xml 文件包含预训练的过滤器,使用 Adaboost 算法能快速找到面部并裁剪。

使用 cv2.cvtColor 函数将裁剪面部图片转化为灰度图,并使用 cv2.resize 改变图片大小为 48x48 像素。处理完的面部图片,相比于原始的(3,48,48)三色 RGB 格式“瘦身”不少。同时也确保传入输入层的图片是(1,48,48)的 numpy 数组。

3.2 卷积层

numpy 数组传入 Convolution2D 层,指定过滤层的数量作为超参数。过滤层(比如,核函数)是随机生成权重。每个过滤层,(3,3)的感受野,采用权值共享与原图像卷积生成 feature map。

卷积层生成的 feature map 代表像素值的强度。例如,图5,通过过滤层1 和原始图像卷积生成一个 feature map,其它过滤层紧接着进行卷积操作生成一系列 feature map。

图 5. Convolution and 1st max-pooling used in the network

池化(Pooling)是一种降低维度的技术,常用于一个或者多个卷积层之后。池化操作是构建 CNN 的重要步骤,因为增加的多个卷积层会极大的影响计算时间。本文使用流行的池化方法 MaxPooling2D,其使用(2,2)窗口作用于 feature map 求的最大像素值。池化后图像降低 4 个维度。

3.3 稠密层

稠密层(比如,全联接层)是模仿人脑传输神经元的方式。它输入大量输入特征和变换特征,通过联接层与训练权重相连。

图 6. Neural network during training: Forward propagation (left) to Backward propagation (right).

模型训练时权重前向传播,而误差是反向传播。反向传播起始与预测值和实际值的差值,计算所需的权重调整大小反向传回到每层。采用超参数调优手段(比如,学习率和网络密度)控制训练速度和架构的复杂度。随着灌入更多的训练数据,神经网络能够使得误差最小化。

一般,神经网络层/节点数越多,越能捕捉到足够的信号。但是,也会造成算法模型训练过拟合。应用 dropout 可以防止训练模型过拟合。Dropout 随机选择部分节点(通常,占总节点数的百分比不超过 50%),并将其权重置为 0。该方法能有效的控制模型对噪声对敏感度,同时也保留架构的复杂度。

3.4 输出层

本文的输出层使用 softmax 激励函数代替 sigmoid 函数,将输出每类表情的概率。

因此,本文的算法模型能显示出人脸表情组成的详细组成概率。随后会发现没必要将人类表情表示为单个表情。本文采用的是混合表情来精确表示特定情感

注意,没有特定的公式能建立一个神经网络保证对各种场景都有效。不同的问题需要不同的模型架构,产生期待的验证准确度。这也是为什么说神经网络是个“黒盒算法”。但是也不要太气馁,模型训练的时间会让你找到最佳模型,获得最大价值。

3.5 小结

刚开始创建了一个简单的 CNN 深度学习模型,包括一个输入层,三个卷积层和一个输出层。事实证明,简单的算法模型效果比较差。准确度 0.1500 意味着仅仅是随机猜测的结果(1/6)。简单的网络结构导致不能有效的判别面部表情,那只能说明要“深挖”。。。

下面稍微修改下三部分的组合,增加模型的复杂度:

  • 卷积层的数量和配置

  • 稠密层的数量和配置

  • 稠密层的 dropout 占比

使用 AWS 的 GPU 计算(g2.2xlarge)训练和评估组合的算法模型。这次极大的减少了训练时间和模型调优的效率。最后的网络模型是九层,每三层卷积层接着一个 max-pooling 层,见图 7。

图 7. Final model CNN architecture.

4、模型验证

图 8. Prediction of 24 example faces randomly selected from test set.

4.2 分析

图 9. Confusion matrix for true and prediction emotion counts.

仔细看下每个表情的预测结果。图 9 是测试集的模型预测的混淆矩阵。矩阵给出表情预测的数量和多分类模型的效果展示:

图 10. Correct predictions on 2nd and 3rd highest probable emotion.

图 11. 第二个 max-pooling 池化层后的 CNN (64-filter) feature maps

图 12. 第三个 max-pooling 池化层后的 CNN (128-filter) feature maps

相关链接

  1. https://github.com/JostineHo/mememoji/blob/master/src/fer2013datagen.py

  2. https://keras.io/models/sequential/

  3. https://github.com/JostineHo/mememoji/blob/master/data_visualization.ipynb

看完本文有收获?请转发分享给更多人


欢迎关注“互联网架构师”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们只聊互联网、只聊架构,不聊其他!打造最有价值的架构师圈子和社区。

本公众号覆盖中国主要首席架构师、高级架构师、CTO、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。

  • 长按下方的二维码可以快速关注我们

  • 如想加群讨论学习,请点击右下角的“加群学习”菜单入群

[译]使用深度学习方法实现面部表情包识别相关推荐

  1. 使用深度学习方法实现面部表情包识别

    1.动机 人类面部表情丰富,但可以总结归纳为 7 类基本表情: happy, sad, surprise, fear, anger, disgust, and neutral.面部表情是通过面部肌肉活 ...

  2. 全面涵盖传统方法和深度学习方法:3D人脸识别的十年发展及未来趋势

    ©作者 | 机器之心编辑部 来源 | 机器之心 人脸识别是机器学习社区研究最多的课题之一,以 3D 人脸识别为代表的相关 ML 技术十年来都有哪些进展?这篇文章给出了答案. 近年来,人脸识别的研究已经 ...

  3. [译]安卓界面导航初识

    原文地址:A Primer on Android navigation 原文作者:Liam Spradlin 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者 ...

  4. IntelliTest(5) - The IntelliTest Reference Manual[译]

      有一套非常棒的工具集将大大提高我们的工作效率,选择一个正确的工具和让这个工具做它擅长的事情也是非常重要的.工具集越大,就越容易找到适合你当前工作的工具.   不管使用任何工具,为了让它发挥更大的性 ...

  5. [译]Windows 古僻汉字输入方法

    周海汉按:原文作者好南儿,采用上海话(吴语)写的blog,有点看不懂吴语. 但他的知识和资料很到位,图文并茂,是篇很好的文章,应该花了不少心血. 本人也不懂吴语,连蒙带猜翻译一下.方便普通话读者.误会 ...

  6. [译]高性能浏览器网络(第九章)--HTTP简史

    超文本传输​​协议(HTTP)是互联网上最普遍并广泛采用的应用协议之一:它是客户端和服务器之间的通用语言,促成了现代网络的形成.最开始它以单关键字和文档路径的简单形式出现,目前已成为不仅仅是浏览器,几 ...

  7. [译]伟大的产品并不是诞生于偶然

    写在前面: Medium 上标记为14min阅读时长的文章,翻译花了大概五六个小时. 看到这篇文章的时候恰好自己在读那本<设计冲刺>.同时也了解到 甘特图 的来源--读到这里的时候记起去年 ...

  8. [译]从形式到功能,设计思维的改变

    原文地址:From Form to Function, Our Thoughts On Design Are Changing 原文作者:Adobe Creative Cloud 译文出自:掘金翻译计 ...

  9. [译]在cocos2d里面如何使用Texture Packer和像素格式来优化 spritesheet

    免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作 ...

  10. 基于深度学习方法的声纹识别(Speaker Recognition)论文综述

    声纹识别(Speaker Recognition),是一项提取说话人声音特征和说话内容信息,自动核验说话人身份的技术. 声纹识别通常分为两类:Speaker Verification (说话人验证)和 ...

最新文章

  1. 网址服务器地址修改,网址服务器地址修改
  2. 5G中网络切片技术是什么?—Vecloud
  3. boost::sort模块实现提供多种分布的灵活随机数生成器的测试程序
  4. Chrome谷歌浏览器私密浏览自动开启功能获批专利
  5. 网络规划设计师论文考察要点
  6. 安装mysql最后一步第二个打叉_Mysql安装到最后一步时。出现start service红叉   亲朋好友帮忙指导一下!谢谢! 百...
  7. android 盒子远程调试,家+TV机顶盒怎么开启ADB/USB远程调试模式,安装软件?
  8. python网络爬虫从入门到精通吕云翔_python爬虫
  9. MySQL的锁到底有多少内容?和腾讯大佬的技术面谈,我真菜
  10. 多址接入技术 FDMA TDMA CDMA NOMA
  11. k8s学习-污点和容忍(概念、模版、创建、删除)
  12. 山东科技大学计算机调剂难吗,山东科技大学 材料专业 调剂 求老师带走 国家线总分单科不都受限 - 考研 - 小木虫 - 学术 科研 互动社区...
  13. windows下安装mingw-w64
  14. 初识LightGBM
  15. office2010 word发布博客 博客园
  16. Longest Substring with Same Letters after Replacement (hard)
  17. GPM降水数据下载及使用简要说明
  18. 常读常新,微服务最强内功心法,这些理论得吃透~
  19. JAVA-Spring Bean作用域
  20. 用 Python 帮财务小妹生成 Excel 报表,小妹直说一辈子。。。

热门文章

  1. 【MySQL性能优化的21个最佳实践】
  2. Docker入门学习四之自己制作Docker镜像
  3. Struts + Spring + Hibernate 进阶开端(一)
  4. JAVA B/S系统实现客户端屏幕截图,Java版的QQ截图
  5. 给java虚拟机增加一个属性,java -D
  6. struts2中常用Result类型(type)的用法
  7. Pr 入门教程,如何创建标题?
  8. 苹果Mac高级文件搜索工具:ProFind
  9. HazeOver For Mac(管理窗口工具)
  10. MacBook随机关机,无法正常工作,如何解决