EmoPy
EmoPy 是一款基于深度神经网络的 Python 开源工具包,专为面部表情识别(FER)设计,能够通过分析人脸图像自动预测人类的情绪分类。它致力于解决情绪分析领域长期依赖昂贵私有数据集和商业闭源算法的痛点,让开发者能够利用公开数据免费构建、研究并集成自己的情绪识别模型。
这款工具特别适合人工智能开发者、学术研究人员以及希望探索情感计算应用的设计师使用。EmoPy 的核心亮点在于其模块化架构,内置了多种基于 Keras 和 TensorFlow 后端的神经网络结构,用户可以根据需求灵活切换不同架构以测试最佳性能。同时,它提供了预训练模型接口,让用户能快速上手运行。
需要注意的是,由于坚持使用公开数据集(如 Microsoft FER+),EmoPy 在光线均匀、构图与训练数据风格相近的环境下表现最佳。虽然其在复杂现实场景中的精度可能不及拥有百万级私有数据的商业方案,但它为社区提供了一个透明、可复现且易于扩展的研究基准,极大地降低了情绪识别技术的入门门槛。
使用场景
某在线教育平台希望实时分析网课中学生的面部表情,以评估课堂专注度并优化教学内容。
没有 EmoPy 时
- 开发团队需从零收集百万级标注人脸数据并训练深度学习模型,耗时数月且成本高昂。
- 缺乏现成的开源架构参考,工程师必须手动编写复杂的神经网络代码,技术门槛极高。
- 难以快速验证想法,任何算法调整都需要重新经历漫长的数据清洗与模型训练周期。
- 商业闭源方案授权费用昂贵,且无法根据特定教学场景进行定制化修改。
使用 EmoPy 后
- 直接调用预训练的 FER 模型接口,仅需几行 Python 代码即可在数小时内完成部署。
- 利用内置的多种 Keras/TensorFlow 神经网络架构,轻松对比不同模型在当前光线环境下的表现。
- 基于公开的 Microsoft FER+ 数据集快速迭代,针对教室均匀光照场景微调参数,显著缩短研发周期。
- 完全开源免费的特性允许团队深入修改底层逻辑,将表情识别无缝集成到现有的直播流处理管道中。
EmoPy 通过提供开箱即用的深度神经网络工具包,让中小团队也能低成本、高效率地落地人脸情绪识别应用。
运行环境要求
- macOS
- Linux
- Windows
未说明 (基于 Keras/TensorFlow 后端,通常支持 CPU 或 GPU,但 README 未明确指定显卡型号或 CUDA 版本)
未说明

快速开始
EmoPy
EmoPy 是一个基于 Python 的工具包,包含深度神经网络类,能够根据人脸图像预测人类的情感表达类别。该项目的目标是利用现有的公开数据集探索 面部表情识别 (FER) 领域,并构建免费、开源、易于研究且便于集成到其他项目中的神经网络模型。

源自 [@Chen2014FacialER]
系统的性能高度依赖于可用的数据,而 EmoPy 的开发者仅使用公开可用的数据集来创建和测试该系统。
为了更好地了解该项目,您可以参考以下文章:
我们希望扩大开发社区,并欢迎各种建议和贡献。通常这类算法多用于商业场景,因此我们致力于将其以最佳开源形式呈现,从而提升公众在这一领域的参与度和可及性。如需讨论,请联系 EmoPy 的维护者(见下文)。
概述
EmoPy 包含多个模块,这些模块相互连接以构建经过训练的 FER 预测模型。
fermodel.pyneuralnets.pydataset.pydata_loader.pycsv_data_loader.pydirectory_data_loader.pydata_generator.py
其中,fermodel.py 模块使用预先训练好的模型进行 FER 预测,使其成为快速启动并运行训练模型的最简单入口。
除 neuralnets.py 外,每个模块都包含一个类;而 neuralnets.py 则包含一个接口和五个子类。这些子类分别实现了不同的神经网络架构,基于 Keras 框架与 TensorFlow 后端,允许您进行实验并找到最适合自身需求的模型。
EmoPy 文档 提供了关于各个类及其交互的详细信息。此外,下方还列出了本项目中包含的不同神经网络概述。
运行限制
商业化的 FER 项目通常会在数百万张带标签的图像上进行训练,这些数据往往来自庞大的私有数据集。相比之下,为了保持免费和开源,EmoPy 只能使用公开数据集进行训练,这对其获得准确结果构成了重大限制。
EmoPy 最初是为满足 RIOT 项目 的需求而设计的,在该项目中,观众的面部表情是在受控光照条件下被记录的。
基于以上两点,EmoPy 在输入图像满足以下条件时效果最佳:
- 光线均匀,阴影较少;或
- 图像风格、构图和裁剪与训练数据集中的图像有一定相似性。
截至目前,我们所找到的最佳公开数据集是 Microsoft FER+,约包含 3 万张图像。使用该数据集进行训练时,若输入图像与数据集中图像的风格较为接近,则效果更佳。
如需深入了解 EmoPy 的起源与运作方式,以便评估其对您需求的适用性,请阅读我们的 EmoPy 完整介绍。
数据集选择
您可以尝试使用自己的数据集,或使用我们在 Emopy/examples/image_data 子目录中提供的小型数据集来测试系统。虽然我们提供的示例数据集由于规模较小,可能无法产生理想效果,但它们却是入门的好方法。
理想的预测效果应在多种数据集、光照条件下,以及 FER 研究中常见的 7 种情绪标签(快乐、愤怒、恐惧、惊讶、厌恶、悲伤、平静/ neutral)的子集上表现良好。一些优秀的公开数据集包括 Extended Cohn-Kanade 和 Microsoft FER+。
环境设置
Python 兼容多种操作系统。如果您希望在其他操作系统上使用 EmoPy,请将以下说明调整为适合您的环境。请随时告知我们您的进展,我们将尽力为您提供支持并分享您的成果。
开始之前,如果尚未安装 Homebrew,请运行以下命令进行安装:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
EmoPy 使用 Python 3.6 及以上版本运行,理论上可在任何兼容 Python 的操作系统上运行。我们已在 OSX 上使用 Python 3.6.6 对 EmoPy 进行了测试。
您可以通过以下两种方式安装 Python 3.6.6:
$ brew install pyenv
$ pyenv install 3.6.6
GraphViz 是可视化功能所必需的工具。
brew install graphviz
下一步是使用 virtualenv 设置虚拟环境。请以 sudo 权限安装 virtualenv。
sudo pip install virtualenv
创建并激活虚拟环境。运行:
python3.6 -m venv venv
或者,如果您使用 pyenv:
$ pyenv exec python3.6 -m venv venv
其中第二个 venv 是您的虚拟环境名称。要激活它,请在同一目录下运行:
source venv/bin/activate
此时,您的终端命令行前应显示 (venv) 前缀。
(要停用虚拟环境,请在命令行中输入 deactivate。当 (venv) 前缀消失时,即表示已成功停用。)
安装
从 PyPI 安装
虚拟环境激活后,您可以通过以下命令安装 EmoPy:
pip install EmoPy
从源代码安装
克隆仓库并在终端中打开。
git clone https://github.com/thoughtworksarts/EmoPy.git
cd EmoPy
使用 pip 安装剩余的依赖项。
pip install -r requirements.txt
现在您已经准备就绪!
运行测试
您可以运行以下命令来执行测试:
python EmoPy/tests/run_all.py
我们鼓励大家改进和补充这些测试!
运行示例
您可以在 examples 目录中找到当前每种神经网络类别的示例代码。您可以将示例目录下载到本地的任意位置,也可以直接使用安装包中包含的示例目录。
如果您选择使用已安装的包,可以从您创建的虚拟环境目录开始,输入以下命令来找到示例目录:
cd lib/python3.6/site-packages/EmoPy/examples
最佳的入门示例是 FERModel 示例。以下是该示例代码:
from EmoPy.src.fermodel import FERModel
from pkg_resources import resource_filename
target_emotions = ['calm', 'anger', 'happiness']
model = FERModel(target_emotions, verbose=True)
print('Predicting on happy image...')
model.predict(resource_filename('EmoPy.examples','image_data/sample_happy_image.png'))
print('Predicting on disgust image...')
model.predict(resource_filename('EmoPy.examples','image_data/sample_disgust_image.png'))
print('Predicting on anger image...')
model.predict(resource_filename('EmoPy.examples','image_data/sample_anger_image2.png'))
上述代码加载了一个预训练模型,并对一张示例图像进行情绪预测。正如您所见,这个示例只需要提供一组目标情绪和一张示例图像即可。
完成安装后,您可以在 examples 文件夹中通过运行示例脚本运行此示例:
python fermodel_example.py
示例首先加载并初始化模型。接着,它会打印出给定每张示例图像的情绪概率分布。输出应如下所示:

要训练您自己的神经网络,可以使用我们提供的 FER 神经网络类之一作为起点。例如,您可以尝试 convolutional_model.py 示例:
python convolutional_model.py
该示例首先初始化模型。随后会打印出模型架构的摘要信息,包括所有神经网络层及其输出形状的列表。我们的模型基于 Keras 框架构建,该框架提供了这一可视化功能。

在模型对每张示例图像进行训练的过程中,您会看到训练准确率和验证准确率不断更新。由于我们仅使用三张图像进行训练和验证,验证准确率会相对较低。输出应类似于以下内容:

神经网络模型比较
卷积神经网络 (ConvolutionalNN)
卷积神经网络(CNNs)目前被认为是图像分类领域的首选模型,因为它们能够捕捉图像中小区域内的模式,比如眉毛的弧度。EmoPy 中的 ConvolutionalNN 是基于静态图像进行训练的。
时延三维卷积神经网络 (TimeDelayConvNN)
时延三维卷积神经网络模型的灵感来源于伦敦布鲁内尔大学孟红英博士撰写的一篇论文[此处链接]。该模型在训练样本中引入了时间信息。与使用静态图像不同,它会利用序列中的历史图像来提供额外的上下文信息。每个训练样本将包含来自同一序列的 n 张图像,其情绪标签则取自最新的一张图像。这样做的目的是捕捉面部表情从初始状态逐渐发展至峰值情绪的过程。

Cohn-Kanade 数据库中的面部表情图像序列,来源:[@Jia2014]
卷积长短期记忆神经网络 (ConvolutionalLstmNN)
卷积长短期记忆神经网络是一种卷积神经网络与循环神经网络的混合模型。卷积神经网络通过卷积核或滤波器在图像的小区域内寻找模式;而循环神经网络(RNNs)则会考虑先前的训练样本,类似于时延神经网络,以获取上下文信息。因此,该模型既能提取图像中的局部特征,又能利用时间上下文。
时延模型与该模型在如何利用时间上下文方面有所不同。前者仅从单个面部的视频片段中获取上下文信息,如上图所示。而 ConvolutionalLstmNN 则接收彼此无关的静态图像,通过比较过去样本与当前样本之间的模式差异及其对应的情绪标签来进行学习。它不需要连续的同一面部表情序列,只需不同的人脸图像进行对比即可。

来源:[@vanGent2016]
迁移学习神经网络 (TransferLearningNN)
该模型采用一种称为迁移学习的技术[此处链接],即以预训练的深度神经网络模型作为起点。这些预训练模型原本是用于对物体进行分类的。随后,该模型会使用带有情绪标签的面部表情图像重新训练这些预训练模型,而不是继续进行物体分类。为了匹配我们要分类的目标情绪数量,它会在原始模型的基础上添加几层顶层,并使用一组面部表情图像再次运行训练算法。该模型仅使用静态图像,不涉及时间上下文。
卷积神经网络 Dropout 版本 (ConvolutionalNNDropout)
该模型是 EmoPy 中最新的成员。它是一种二维卷积神经网络,实现了 dropout、批量归一化和 L2 正则化技术。目前,在对 7 种情绪进行分类时,其训练准确率为 0.7045,验证准确率为 0.6536。后续还将进一步训练,以评估其在更小的情绪子集上的表现。
性能
在实现 ConvolutionalNNDropout 模型之前,ConvolutionalLstmNN 模型在对7种情绪进行分类时表现最佳,验证集准确率为47.5%。下表展示了该模型和 TransferLearningNN 模型分别在所有七种标准情绪以及三种情绪子集(恐惧、快乐、中性)上训练时的准确率。这两个模型均基于 [FER+](https://github.com/Microsoft/FERPlus)数据集中的5,000张图像进行训练。
| 神经网络模型 | 7种情绪 | 3种情绪 | ||
|---|---|---|---|---|
| 训练集准确率 | 验证集准确率 | 训练集准确率 | 验证集准确率 | |
| ConvolutionalLstmNN | 0.6187 | 0.4751 | 0.9148 | 0.6267 |
| TransferLearningNN | 0.5358 | 0.2933 | 0.7393 | 0.4840 |
两种模型都存在过拟合现象,即训练集准确率远高于验证集准确率。这表明模型在识别和分类训练图像中的模式方面表现优异,但在泛化能力上有所不足,导致对新图像的情绪预测准确性较低。
如果您希望使用我们的神经网络类尝试不同的参数设置,我们推荐您使用 [FloydHub](https://www.floydhub.com/about),这是一个用于在云端训练和部署深度学习模型的平台。请随时告诉我们您的模型表现如何!我们的目标是优化所有 FERPython 模型的性能和泛化能力。
指导原则
以下是我们指导项目开发及贡献所遵循的原则:
FER向善。FER应用有可能被用于恶意目的。我们希望建立一个倡导诚信、透明与意识的社区来共同开发 EmoPy,并在开发过程中始终秉持这些价值观,同时提供一个易于使用且高质量的工具包。
用户友好性。EmoPy 将用户体验放在首位,旨在通过尽量减少基本用例所需的用户操作步骤,使用户能够轻松地搭建并运行 FER 预测模型。
以实验提升性能。实现 FER 预测的最佳性能是我们的首要目标。深度神经网络类的设计允许用户便捷地调整训练参数、图像预处理选项以及特征提取方法,期望通过开源社区的广泛实验,推动 FER 预测性能的不断提升。
模块化。EmoPy 包含四个基础模块(
fermodel、neuralnets、imageprocessor和featureextractor),这些模块可以灵活组合使用,且限制较少。
贡献方式
- 克隆仓库!
- 创建你的功能分支:
git checkout -b my-new-feature - 提交更改:
git commit -am '添加新功能' - 推送到分支:
git push origin my-new-feature - 发起拉取请求 :D
这是一个尚处于起步阶段的新库,未来还有很大的发展空间。请查看我们列出的待解决事项,欢迎大家一起参与贡献!
[@Chen2014FacialER]: https://www.semanticscholar.org/paper/Facial-Expression-Recognition-Based-on-Facial-Comp-Chen-Chen/677ebde61ba3936b805357e27fce06c44513a455 “基于面部组件检测与 HOG 特征的人脸表情识别”
[@Jia2014]: https://www.researchgate.net/figure/Fig-2-Facial-expression-image-sequence-in-Cohn-Kanade-database_257627744_fig1 “利用 PAD 模型为富有表现力的虚拟人物合成头部及面部动作”
[@vanGent2016]: http://www.paulvangent.com/2016/04/01/emotion-recognition-with-python-opencv-and-a-face-dataset/ “使用 Python、OpenCV 和人脸数据集进行情绪识别。一篇关于 Python 与嵌入式电子技术的趣味技术博客。”
贡献者
感谢以下各位优秀的朋友(表情键):
本项目遵循 all-contributors 规范。欢迎任何形式的贡献!
基于 EmoPy 构建的项目
希望在此列出您的项目吗?请提交一个 issue(或 pull request),并告诉我们 EmoPy 是如何帮助您的。
版本历史
v0.0.52019/02/18常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器















