一个用于面部表情识别的情感分析的深层神经网络工具包(FER)

Emo的Python项目详细描述


情绪化

emopy是一个python工具包,它具有深度神经网络类,可以根据人脸图像准确预测情绪。

labeled fer images
图来自@chen2014facialer

本项目的目标是使面部表情识别(FER)模型更精确、更自由、更开放、更易于使用、更易于集成到不同的项目中。

emopy的开发人员编写了两个您可能会发现有用的指南:

我们的目标是扩大我们的发展社区,我们愿意接受建议和贡献。请与我们联系以进行讨论。

概述

emopy包括几个模块,这些模块被连接在一起以构建一个经过训练的fer预测模型。

  • fermodel.py
  • neuralnets.py
  • dataset.py
  • 数据加载程序.py
  • csv数据加载程序.py
  • 目录数据加载程序.py
  • 数据发生器.py

fer model.py模块使用预先训练的模型进行fer预测,使其成为最容易获得训练模型并快速运行的入口点。

每个模块都包含一个类,除了neuralnets.py,它有一个接口和四个子类。这些子类中的每一个子类都使用带有tensorflow后端的keras框架实现了一个不同的神经网络体系结构,允许您进行实验,看看哪一个最适合您的需要。

emopy文档包含有关类及其交互的详细信息。此外,下面还概述了本项目中包含的不同神经网络。

数据集

使用您自己的数据集或我们在examples/image\u data子目录中提供的小数据集试用系统。我们提供的样本数据集由于体积小,不会产生好的结果,但它们是一个很好的入门方法。

理想情况下,预测在FER研究中看到的各种数据集、照明条件和标准7种情绪标签(快乐、愤怒、恐惧、惊讶、厌恶、悲伤、平静/中性)的子集上表现良好。一些很好的公共数据集示例是扩展的cohn-kanade和ferer+

环境设置

emopy使用python 3.6运行,理论上是在任何与python兼容的操作系统上。我们在osx上使用python 3.6.6测试了emopy。您可以从python网站安装python 3.6.6。

请注意,这不是最新版本的python,但是tensorflow包还不能与python 3.7一起工作,因此emopy不能与python3.7一起运行。

python兼容多种操作系统。如果你想在其他操作系统,请转换这些指令以匹配目标环境。让我们知道您的进展,我们将尽力支持您并分享您的结果。

如果未安装自制程序,请运行以下命令进行安装:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

可视化功能需要图形化。

brew install graphviz

下一步是使用virtualenv建立一个虚拟环境。使用sudo安装virtualenv。

sudo pip install virtualenv

创建并激活虚拟环境。运行:

python3.6 -m venv venv

其中第二个venv是虚拟环境的名称。要激活,请从同一目录运行:

source venv/bin/activate

现在,终端命令行的前缀应该是(venv)

(要停用虚拟环境,请在命令行中运行deactivate。当前缀(venv)消失时,您将知道它已被停用。

安装

来自PYPI

激活虚拟环境后,您可以使用

pip install EmoPy

从源头

克隆目录并在终端中打开。

git clone https://github.com/thoughtworksarts/EmoPy.git
cd EmoPy

使用pip安装其余依赖项。

pip install -r requirements.txt

现在你可以走了!

运行示例

您可以在示例中找到运行每个当前神经网络类的示例代码。您可以将示例目录下载到计算机上您选择的位置,或查找安装中包含的示例目录。

如果选择使用已安装的软件包,则可以从创建的虚拟环境目录开始,键入:

cd lib/python3.6/site-packages/EmoPy/examples

最好从fermodel示例开始。下面是该代码的列表:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
0

上面的代码加载一个预先训练的模型,然后在一个样本图像上预测一种情绪。如您所见,本例中您只需提供一组目标情绪和一个示例图像。

完成安装后,可以通过运行示例脚本从examples文件夹运行此示例。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
1

这个例子做的第一件事是加载并初始化模型。接下来,它打印出每个给定样本图像的情感概率。应该是这样的:

fermodel training output/p>

要训练自己的神经网络,请使用我们的一个FER神经网络类开始。您可以尝试卷积模型。py示例:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2

该示例首先初始化模型。将打印出模型体系结构的摘要。这包括所有神经网络层及其输出形状的列表。我们的模型是使用Keras框架构建的,它提供了这种可视化功能。

卷积示例输出部分1

在每个样本图像上训练模型时,您将看到模型的训练和验证精度正在更新。由于我们只使用三幅图像进行训练和验证,因此验证精度将非常低。应该是这样的:

卷积示例输出第2部分

神经网络模型的比较

卷积nn

卷积神经网络(CNN)目前是考虑使用神经网络进行图像分类,因为神经网络可以提取图像小部分的模式,例如眉毛的曲线。emopy的卷积神经网络是在静止图像上训练的。

时间延迟convnn

延时三维卷积神经网络模型的灵感来自于本文作者:伦敦布鲁内尔大学孟红英博士。它使用时间信息作为训练样本的一部分。它不使用静态图像作为训练样本,而是使用序列中的过去图像作为附加上下文。一个训练样本将包含一系列图像中的n个数,其情感标签将是最新的图像。我们的想法是捕捉面部表情的发展过程,从而达到情绪的顶峰。

面部表情图像序列
cohn-kanade数据库中的面部表情图像序列来自
@JIA2014

卷积lstmnn

卷积长短期记忆神经网络是一种卷积和递归神经网络的混合。卷积nns使用核函数或滤波器在图像的较小部分找到模式。经常性神经网络(rns)考虑到以前的训练示例,类似于延时神经网络,用于上下文。该模型既能从图像中提取局部数据,又能利用时间上下文。

时滞模型和该模型在使用时间上下文方面有所不同。前者只从一张脸的视频片段中获取上下文,如上图所示。卷积lstmnn给出了互不相关的静止图像。它查找过去图像样本和当前样本之间的模式差异以及它们的标签。没有必要对同一张脸有一个级数,只需要比较不同的脸即可。

7标准面部表情
图来自@vangent2016

传输清除nn

该模型使用了一种称为转移学习的技术,在这种技术中,预先训练的深层神经网络模型被用作起点。它使用的预训练模型是在图像上训练来分类对象的。然后,该模型使用带有情感分类而不是对象分类的面部表情图像来重新训练预先训练的模型。它在原始模型上增加了两个顶层,以匹配我们想要分类的目标情绪的数量,并用一组面部表情图像重新运行训练算法。它只使用静态图像,没有时间上下文。

性能

目前卷积lstmnn模型在对7种情绪进行分类时表现最好,验证准确率为47.5%。下表显示了该模型和transferlearningnn模型在所有七种标准情绪和三种情绪(恐惧、快乐、中性)的子集上训练时的准确度值。他们W我们从fer+数据集中培训了5000张图片。

<表><广告>神经网络模型 7种情绪 < T/>3种情绪 < T/>< /广告><正文>训练精度验证精度训练精度验证精度卷积lstmnn0.61870.47510.91480.6267传输学习nn0.53580.29330.73930.4840

这两个模型都是过度拟合的,这意味着训练的准确性远远高于验证的准确性。这意味着模型在识别和分类训练图像中的模式方面做得非常好,但是过于泛化。在预测新图像的情绪时,它们的准确性较低。

如果您想使用我们的神经网络类来实验不同的参数,我们建议您使用floydhub,一个在云中训练和部署深度学习模型的平台。让我们知道你的模特们怎么样了!目标是优化所有ferpython模型的性能和通用性。

指导原则

这些是我们用来指导项目开发和贡献的原则:

  • 永远是。fer应用程序有可能被用于恶意目的。我们希望通过一个倡导诚信、透明和意识的社区来构建emopy,并希望在整个开发过程中灌输这些价值观,同时维护一个可访问的、高质量的工具包。

  • 用户友好性。emopy优先考虑用户体验,通过最小化基本用例的总用户需求,设计为尽可能容易地启动和运行fer预测模型。

  • 最大化性能的实验。FER预测的最佳性能是首要目标。深层神经网络课程旨在轻松修改训练参数、图像预处理选项和特征提取方法,希望在开源社区中的实验将导致高性能的FER预测。

  • 模块化。emopy包含四个基本模块(fermodelneuralnetsimageprocessorfeatureextractor),这些模块可以很容易地与最小的限制一起使用。

贡献

    把它叉起来!
  1. 创建功能分支:git checkout-b我的新功能
  2. 提交更改:git commit-am'add some feature'
  3. 推到分支:git push origin my new feature
  4. 提交拉取请求:d

这是一个有很大发展空间的新图书馆。查看我们需要帮助解决的公开问题列表!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在Java中使用BufferedReader类读取文本文件的子字符串   java如何在JSP页面上包含来自另一台服务器的动态JSP   使用单表策略的java持久化Hibernate继承映射   java报告状态失败达600秒。谋杀!报告hadoop的进展   java将字符串解析为形状   使用JTable的java ClassCastException?   java在Spring引导中关闭数据库   java Android Studio调试错误(Ubuntu)   java如何区分apache beam中KV实例中的两个键?   java将RealmObjectChangeListener添加到异步下载的RealmObject   java匹配模式之前的所有内容,包括新行和/或回车   java使用JAXB在XML中动态更改元素序列   java如何在MACOS中找到动态库(.dylib文件)的版本   Android中的java Nanohttpd服务器   java libGDX:3d动画不工作