基于面部表情识别(FER)的技术是情感识别市场不可或缺的一部分,预计到2024年将达到560亿美元 - 检测情绪?使用人工智能?我们真的能做到吗?答案是肯定的!人们可以很容易地在Python中构建一个面部情感识别项目。继续阅读以找到如何做到这一点的答案。
使用ANN的端到端语音情感识别项目
可下载的解决方案代码||解释性视频技术支持
这一切都始于处理图像以检测物体,后来升级为面部检测和面部表情识别。虽然近年来已经实现了检测物体,但发现人脸等特定物体的问题要早得多。2001年,微软的研究人员给了我们人脸检测技术,该技术仍然以多种形式使用。通过现代深度学习技术,我们已经在检测微笑、眼睛和情绪等困难事物方面取得了进步。本文将讨论Python中面部表情识别项目的源代码。您将学习训练深度神经网络来解决检测情绪等复杂问题。但是,首先,让我们讨论这些项目的一些令人兴奋的应用,以进一步激发您对这个项目的兴趣。
目录
面部表情识别项目应用
基于机器学习的面部表情识别具有广泛的应用,我们在下面讨论了其中的一些应用。
-
面部表情识别技术用于自闭症治疗和Deepfake检测的医学研究。
-
可以利用FER技术来确保在道路上安全驾驶。因此,如果司机感到昏昏欲睡,即将晕倒,乘车服务可以部署一个系统,在阅读他们的面部表情后发出警报。
-
面部情感识别项目解决方案代码广泛用于自动点击自拍。个人必须以美丽的笑容看着相机,设备将在没有任何外部推动的情况下单击图像。
-
另一个日常用例是针对企业的。他们可以使用这项技术来分析客户对其服务的反馈情绪。他们可以利用这些信息来规划下一步行动,以扩大业务增长。例如,可以优先考虑为悲伤的客户提供服务。
这些有趣的应用使面部表情识别成为深度学习工程师的热门研究课题。让我们来探索他们使用哪些模型来构建面部情感识别项目。
通过 150 多个已解决的端到端 ML 项目,更接近您成为数据科学家的梦想
面部表情识别模型
用于面部表情识别的算法跨越了机器学习和深度学习领域;其中一些如下所示。
-
K-最近邻居:我们都遵循特定的面部肌肉运动来表达我们的情绪。例如,我们在颧骨主要肌肉的帮助下抬起脸颊微笑,这使我们的嘴唇形成U形。因此,我们可以通过使用KNN来识别微笑的模式,然后将这种模式与测试图像进行比较来检测快乐的情绪。同样,可以检测其他表达式。
-
支持向量机(SVM):FER的另一种流行方法是SVM。它旨在将超平面定位在N维空间中,该空间分离数据点的类别以发现具有最大裕量分离的平面。识别的效率依赖于特征提取的过程。
-
深度信念网络:该算法要求人脸在图像中完美对齐,并在不同层次中使用贪婪的方法来解决面部表情识别的问题。
-
多层感知器:MLP使用图像的像素值来识别隐藏在其中的每种情绪的模式,并依靠反向传播算法来评估各种超参数。
-
卷积神经网络:卷积操作允许我们在处理图像时节省计算,而不会影响系统的准确性。与MLP一样,它使用像素值来构建面部表情识别系统。
在这些模型中,我们将使用广泛流行的一个:卷积神经网络,来处理人脸表情识别问题。在我们进入代码之前,请允许我们对数据集有一个公平的想法。
新项目
PySpark Project-使用Hive和Cassandra构建数据管道查看项目
用于查询 COVID-19 数据的 AWS Athena 大数据项目查看项目
PySpark Project-使用Kafka和Redshift构建数据管道查看项目
使用LightFM在Python中构建混合推荐器系统查看项目
PySpark Project-使用Hive和Cassandra构建数据管道查看项目
用于查询 COVID-19 数据的 AWS Athena 大数据项目查看项目
PySpark Project-使用Kafka和Redshift构建数据管道查看项目
使用LightFM在Python中构建混合推荐器系统查看项目
人脸表达式识别数据集
网络上有许多流行的数据集可用于面部表情识别,包括扩展的Cohn-Kanade(CK +)数据集,日本女性面部表情(JAFFE),扩展的Cohn-Kanade数据库(CK +),Cohn-Kanade数据集(CK),面部表情研究数据库(FERG),MMI,多媒体理解组(MUG),印度自发表达数据库等。但是我们将在这个面部识别项目中使用的是Kaggle上用于面部表情识别挑战赛的那个。它具有七种情绪的面部图像:愤怒,厌恶,恐惧,快乐,悲伤,惊讶和中性像素大小48x48。测试数据集有 28,709 个样本,训练数据集有 3,589 个样本。数据集中有两列:“情感”和“像素”。情绪使用0-6之间的数字表示,其中0=愤怒,1=厌恶,2=恐惧,3=快乐,4=悲伤,5=惊喜,6=中性。像素列包含表示图像的数字字符串。
现在您已经熟悉 FER 数据集,让我们深入了解面部表情识别项目的代码。
带有源代码的面部表情识别项目
面部表情识别项目将涉及深度学习模型,卷积神经网络的使用。您将学习如何在Google Colab笔记本中使用TensorFlow框架从头开始构建这样的模型。在本文中,我们为您准备了一个分步教程。因此,请系好耐心的安全带,然后跳到本教程的乘车之旅中。
此面部情感识别项目中使用的技术堆栈
我们将使用 Google Colab 中提供的“免费使用”资源来实施该解决方案。以下是我们需要开始的库列表。
-
Tensorflow 2:0:这是Google开发和维护的深度学习框架的最新版本
-
Scikit 学习:使用与 ML 相关的实用程序。
-
Matplotlib:可视化模型性能和数据
-
Kaggle:我们将使用Kaggle的python包来下载数据集。它是可选的,因为您始终可以单独下载数据。
免费访问用于数据清理、数据整理和数据可视化的机器学习示例代码
Python中的面部表情识别项目
我们将不使用预定义的卷积神经网络模型(如 VGG-16、ResNet、ImageNet 等),而是使用 TensorFlow 框架从头开始构建模型的每一层。让我们首先从构建该模型所需的下载数据集开始。
下载数据集
为简单起见,我们将使用带标签的数据集。因此,我们在这个项目中处理的问题属于监督学习类别。我们将使用Kaggle上提供的面部表情识别挑战赛数据集。
请按照以下步骤下载数据集:
-
在浏览器中打开Kaggle网站,然后使用您的帐户登录
-
访问Kaggle挑战网页,然后转到规则部分并接受挑战的条款。接受规则后,它应该看起来像下面的屏幕截图。这是重要的一步。否则,我们稍后可以访问禁止的错误。
-
现在,按照以下步骤使用Kaggle的官方API下载数据。
-
通过在 colab 笔记本中键入以下命令来安装 Kaggle python 包。
-
!pip install kaggle
-
转到Kaggle的帐户部分,然后单击“创建新API”按钮。它应该下载 kaggle.json 文件(在使用 Kaggle API 时对您进行身份验证的秘密文件)。
-
将文件上传到谷歌colab。这是colab上的上传按钮。
(您可能只有一个sample_data文件夹,而不是驱动器文件夹。这绝对没问题;你不需要担心它。)
探索类别
Python 中的数据科学项目 R 中的机器学习项目 深度学习项目 神经网络项目 张量流项目 H2O R 项目 物联网项目 Keras 深度学习项目 网络语言项目 Pytorch
-
创建一个 kaggle 文件夹,并在该文件夹中复制 kaggle.json 文件。
!mkdir ~/.kaggle
!cp kaggle.json ~/.kaggle/
-
由于文件夹中的文件是机密文件,因此我们需要确保只有具有必要权限的用户才能访问它。
!chmod 600 ~/.kaggle/kaggle.json
注意:如果我们跳过此步骤,则不会影响后续步骤。但是您将收到如下警告。
警告:您的Kaggle API密钥可被此系统上的其他用户读取!要解决此问题,您可以运行“chmod 600 /root/.kaggle/kaggle.json”
-
最后,从Kaggle下载数据。
!kaggle竞赛下载-c挑战-在-表现-学习-面部-表情-识别-挑战
请注意,我们已使用挑战的名称来下载与其关联的所有数据。
运行上述命令后,您应该会看到以下消息。
探索性数据分析
现在我们已经下载了数据集,在将其提供给模型之前,我们必须对其进行分析,然后决定应使用哪些方法来使其准备好训练我们的模型。
要从分析开始,首先,通过在colab笔记本中键入以下命令来解压缩文件“icml_face_data.csv.zip”。
!解压缩icml_face_data.csv.zip
接下来,在 Pandas 数据帧中加载数据。这将允许您利用 Pandas 库中提供的有用函数进行数据分析。
icml_faces = pd.read_csv('icml_face_data.csv')
请注意,图像在称为“像素”的列中可用作数字字符串
每个图像的情感在一个名为“情感”的列中给出。
探索更多数据科学和机器学习实践项目。使用 ProjectPro 快速跟踪您的职业过渡
数据集包含表示七种情绪类型的图像,其中每个图像都使用以下架构标记情绪:
0=愤怒,1=厌恶,2=恐惧,3=快乐,4=悲伤,5=惊喜,6=中性。
我们可以在下面的函数的帮助下绘制这些图像以观察数据,该函数获取每个类的随机图像并绘制它。
def plot_images(df, emotion_class):
emo_df = df[df.emotion==emotion_class]
row = emo_df.sample(1)
img = np.fromstring(row[' pixels'].iloc[0], dtype=int, sep=' ')
img = np.reshape(img, (48, 48))
image = np.zeros((48,48,3))
image[:,:,0] = img
image[:,:,1] = img
image[:,:,2] = img
image = np.array(image.astype(np.uint8))
return image
现在,让我们看一下每种情绪的示例图像。下面的代码将遍历所有七个情感类,并绘制从每个类中随机选择的1个图像。
plt.figure(0, figsize=(16,10))
for i in range(7):
plt.subplot(2,4,i+1)
image = plot_images(icml_faces,i)
plt.imshow(image)
plt.title( emotion_num_map[i])
情绪
我们的数据集中是否存在任何类不平衡?我们可以通过使用value_counts()函数来检查它。
“厌恶”情绪很少有图像,同样,许多图像被标记为“快乐”。这是我们应该牢记的。但除此之外,我们看到其他类是均匀分布的。
自信地构建端到端项目。
访问包含 181 多个端到端行业项目的精选库,其中包含解决方案代码、视频和技术支持。
“使用情况”列描述了每个部分中可用的图像数。我们将使用“训练”值进行构建或建模。您可以将具有使用价值的图像用作“公共测试”来验证模型结果。最后,我们将“PrivateTest”值视为看不见的数据。
数据预处理
面部表情识别机器学习项目管道中的关键步骤是以正确的格式转换数据,以便实现深度学习 (DL) 模型。请按照以下步骤为深度学习模型的应用程序准备数据。
-
创建一个空数组,该数组将用作占位符来保存图像。
如果我们有 N 个图像,每个图像的大小为 48 x 48 像素,则数组的大小将为 N X 48 x 48 -
数据集中的每个图像都存储为一串像素值“20 12 15 ...”等。因此,您必须将字符串转换为 python 列表。接下来,将拼合列表转换为 2D 图像(大小 48x48)。对所有图像重复此步骤。
-
由于模型权重是浮点型,因此请将像素值转换为浮点数据类型。
-
此外,情绪使用0,1,2等数字表示,..6. 但是你认为 1 小于 2 吗?不,对吧?如果我们使用这样的序数,模型将是无偏的。因此,为了解决这个问题,我们将使用Python中的to_categorical()函数更改这些值,以便情绪成为分类变量。
您可以将所有四个步骤合并到一个函数中,以便在训练、验证和测试数据集上使用。请注意,在将测试图像传递给模型之前,必须对其进行预处理。
def preprocess(input_data):
input_images = np.zeros(shape=(input_data.shape[0], 48, 48))
for i, row in enumerate(input_data.index):
image = np.fromstring(input_data.loc[row, ' pixels'], dtype=int, sep=' ')
image = np.reshape(image, (48, 48))
input_images[i] = image
input_images = input_images.reshape((input_images.shape[0], 48, 48, 1))
input_images = input_images.astype('float32')/255
input_labels = np.array(list(map(int, input_data['emotion'])))
image_labels = to_categorical(input_labels, 7)
return input_images, image_labels
构建模型:卷积神经网络
现在是时候进入这个面部情感识别项目管道中最有趣的步骤了,即(卷积神经网络(CNN)模型。
CNN 架构主要涉及三种类型的层:
-
卷积层
卷积是一种需要两个输入的数学运算。假设两个输入是 x 和 f。卷积操作采用输入的选择性部分,并使用滤波器输入 f 的值将其转换为 Y。
Y = x f
在我们的例子中,x是图像的2D像素数组,f是2D矩阵。每个滤镜矩阵的内容将评估输出图像 Y 的内容。如何评估这些值?好吧,我们不决定。我们让我们的模型来决定这一点。我们只提到这种过滤器的数量及其尺寸。对于数学计算,这些大小始终是奇数和对称的。
卷积层示例:
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(48, 48, 1)))
该模型使用 32 个筛选器,这些筛选器依次堆叠,每个筛选器的尺寸为 3x3。因此,模型将学习3x3x32,即总共288个参数。
-
池化层
此层不会修改任何模型参数。它只会将以前的图像减少提到的因素。池化的方法有很多种,但在这个深度学习项目中,我们将使用最常见的“最大池化方法”,其中只保留最大的数字,省略其他所有内容。此层有助于减少总训练参数。我们也可以看看这种方法来减少输入的方差。
例如
model.add(MaxPooling2D((2, 2)))
此处,图层将输入图像的宽度和高度减小一半。
-
全连接层
这类似于任何其他神经网络。它有一层神经元;所有这些都是在培训过程中接受培训的。模型的最后一层将是一个完全连接的层,其维度等于分类问题的类别。
例如
model.add(Dense(7, activation='softmax'))
我们的模型将在末尾有上述层,对应于7个类别。
此 FER 项目的 CNN 将类似于上面提到的层序列。请参阅下面的代码,了解如何使用 Python 中的 TensorFlow 框架开发这些层。我们使用顺序函数逐个堆叠每一层。
训练卷积神经网络模型
一旦设计了模型体系结构,就该对其进行编译了。我们将使用特定的学习速率、优化方法、损失函数和梯度下降算法来确定模型参数。这与其他神经网络模型相同。编译模型后,可以使用 model.summary() 函数查看模型的摘要,如下图所示。请注意最后一列中要训练的参数数。正如预期的那样,池化层具有零个参数,而密集层具有最大数量。
下一步是通过解析训练数据来训练模型。为了推广模型,我们将使用数据集的子集进行验证。
history = model.fit(train_x, train_y,
validation_data=(val_x, val_y),
epochs=10,
batch_size=64)
在上面的代码片段中,epoch 是进行训练的迭代次数。在每次迭代中,有限数量的图像将批量传递到模型(定义为batch_size)。
Epoch 1/10
359/359 [==============================] - 112s 310ms/step - loss: 1.6670 - accuracy: 0.3375 - val_loss: 1.5680 - val_accuracy: 0.3995
Epoch 2/10
359/359 [==============================] - 71s 198ms/step - loss: 1.4489 - accuracy: 0.4461 - val_loss: 1.4554 - val_accuracy: 0.4347
Epoch 3/10
359/359 [==============================] - 72s 201ms/step - loss: 1.3217 - accuracy: 0.4966 - val_loss: 1.3635 - val_accuracy: 0.4829
Epoch 4/10
359/359 [==============================] - 71s 198ms/step - loss: 1.2335 - accuracy: 0.5351 - val_loss: 1.3324 - val_accuracy: 0.4955
Epoch 5/10
359/359 [==============================] - 73s 204ms/step - loss: 1.1576 - accuracy: 0.5619 - val_loss: 1.2901 - val_accuracy: 0.5235
Epoch 6/10
359/359 [==============================] - 76s 213ms/step - loss: 1.0941 - accuracy: 0.5877 - val_loss: 1.2699 - val_accuracy: 0.5265
Epoch 7/10
359/359 [==============================] - 70s 196ms/step - loss: 1.0280 - accuracy: 0.6148 - val_loss: 1.2897 - val_accuracy: 0.5268
Epoch 8/10
359/359 [==============================] - 71s 197ms/step - loss: 0.9676 - accuracy: 0.6369 - val_loss: 1.2946 - val_accuracy: 0.5322
Epoch 9/10
359/359 [==============================] - 75s 210ms/step - loss: 0.9006 - accuracy: 0.6650 - val_loss: 1.2973 - val_accuracy: 0.5388
Epoch 10/10
359/359 [==============================] - 85s 237ms/step - loss: 0.8365 - accuracy: 0.6914 - val_loss: 1.3426 - val_accuracy: 0.5357
模型的训练通常需要花费大量时间,因为它是顺序操作。还因为它涉及该误差的优化,损失计算和反向传播。值得庆幸的是,Tensorflow框架在后端默默地执行了这些操作。
到目前为止,我们已经执行了我们的模型,但我们不确定它的性能如何。因此,我们将在下一步中使用准确性和绘制绘图等指标。