人脸表情识别实战:你的喜怒哀乐飞桨统统get!

2020-06-10 15:50:07 浏览数 (1)

【飞桨开发者说】李增保,2019年于安徽工业大学取得学士学位,目前在东南大学攻读硕士研究生学位,主要的研究方向为分布式无人机集群协同控制、算法设计与优化等。

面部表情是面部肌肉的一个或多个动作或状态的结果。这些运动表达了个体对观察者的情绪状态。面部表情是非语言交际的一种形式。它是表达人类之间的社会信息的主要手段,不过也发生在大多数其他哺乳动物和其他一些动物物种中。人类的面部表情至少有21种,除了常见的高兴、吃惊、悲伤、愤怒、厌恶和恐惧6种,还有惊喜(高兴+吃惊)、悲愤(悲伤+愤怒)等15种可被区分的复合表情。

随着机器学习和深度神经网络两个领域的迅速发展以及智能设备的普及,人脸识别技术正在经历前所未有的发展,关于人脸识别技术讨论从未停歇。目前,人脸识别精度已经超过人眼,同时大规模普及的软硬件基础条件也已具备,应用市场和领域需求很大,基于这项技术的市场发展和具体应用正呈现蓬勃发展态势。

人脸表情识别(facial expression recognition, FER)作为人脸识别技术中的一个重要组成部分,近年来在人机交互、安全、机器人制造、自动化、医疗、通信和驾驶领域得到了广泛的关注,成为学术界和工业界的研究热点。

在开始深度学习项目之前,选择一个合适的框架是非常重要的,因为选择一个合适的框架能起到事半功倍的作用。研究者们使用各种不同的框架来达到他们的研究目的。百度飞桨有最全面的官方支持的工业级应用模型,涵盖自然语言处理、计算机视觉、推荐引擎等多个领域,更好地满足不同层次的深度学习开发者的开发需求,具备了强大支持工业级应用的能力,已经被中国企业广泛使用,也拥有了活跃的开发者社区生态。

在下文中,我将向大家介绍我是如何用飞桨进行人脸表情识别的。

方案解析

1. 数据采集与数据预处理

数据集对于最终模型的效果非常重要,所以我们要选择稳定且泛化性较好的数据,因此我为系统准备了两个数据集:一个为主流使用的ck 数据集,一个为自定义数据集。

由于ck 数据集的人脸表情比较标准,所以通常在人脸表情识别的实验中,有非常好的效果。我们可以从网上下载这个数据集。本次实验使用的是精简的ck 数据集,里面的人脸已经被截取下来,统一为48*48的数据维度。该数据集共包含七种表情,分别为:生气(anger)、恐惧(fear)、高兴(happy)、惊讶(surprise)、悲伤(sad)、蔑视(contempt)、恶心(disgust)。效果如下:

自定义数据集通过摄像头产生。具体步骤是:首先获取本地摄像头的实时视频流;然后循环遍历视频流中的每一帧图片,检测出图片中的人脸并将其剪裁出来;最后将图片保存到本地硬盘。

通过以上的主要操作,便能制作出自己的数据集,效果如下:

对于这些数据集,我们按照1:9的比例来生成测试数据集和训练集。其中测试数据集为98张图片,训练数据集为883张图片。

2. 配置网络

配置网络包括三个部分:网络模型、损失函数及优化函数。

VGG16网络模型是非常通用的处理图片分类问题的深度神经网络模型。因此在这个项目中,我们选取VGG16作为网络模型结构。VGG卷积神经网络是牛津大学在2014年提出来的模型。这个模型被提出时,由于它的简洁性和实用性,马上成为了当时最流行的卷积神经网络模型。它在图像分类和目标检测任务中都表现出非常好的结果。在2014年的ILSVRC比赛中,VGG在Top-5中取得了92.3%的正确率。VGG16网络结构模型如下:

VGG16网络模型相比于以往的卷积神经网络,具有更深层的特点。其核心是连续的五组卷积操作,每两组卷积操作之间都会设置池化层,对输入的数据进行降维,卷积核的大小一般选取3*3,且浅层组的卷积核数目为64,深层组的卷积核数目为512,属于同一组的卷积核的数目都是相同的。经过系列卷积之后,网络会连接两个全连接神经网络层,最后一层就是全连接分类层。具体代码的实现如下所示:

代码语言:javascript复制
def vgg_bn_drop(image, type_size):
    def conv_block(ipt, num_filter, groups, dropouts):
        return fluid.nets.img_conv_group(
            input=ipt,  
            pool_size=2,
            pool_stride=2,
            conv_num_filter=[num_filter]*groups,
            conv_filter_size=3,
          conv_act='relu',
            conv_with_batchnorm=True,
            conv_batchnorm_drop_rate=dropouts,
            pool_type='max') 
    conv1 = conv_block(image, 64, 2, [0, 0])
    conv2 = conv_block(conv1, 128, 2, [0, 0])
    conv3 = conv_block(conv2, 256, 3, [0, 0, 0])
    conv4 = conv_block(conv3, 512, 3, [0, 0, 0])
    conv5 = conv_block(conv4, 512, 3, [0, 0, 0])
    drop = fluid.layers.dropout(x=conv5, dropout_prob=0.0)
    fc1 = fluid.layers.fc(input=drop, size=512, act=None)
    bn = fluid.layers.batch_norm(input=fc1, act='relu')
    drop2 = fluid.layers.dropout(x=bn, dropout_prob=0.0)
    fc2 = fluid.layers.fc(input=drop2, size=512, act=None)
    predict = fluid.layers.fc(input=fc2, size=type_size, act='softmax')
    return predict

因为我们要解决的问题是分类问题,所以选用交叉熵损失函数是最好的选择。同时我们选取Adam优化算法作为模型的优化器,因为Adam优化算法是现在最为常用的优化算法,因此模型训练的速度能有一定的保证,并且能避免陷入局部最小值。

3. 训练网络

AI Studio平台免费提供基础版(CPU:2 Cores RAM:8GB,Disk:100GB)和高级版(GPU:Tesla V100,Video Mem:16GB;CPU:8Cores,RAM:32GB, Disk:100GB)两种运行环境。由于本项目数据量一般,模型训练过程选用CPU高级版运行环境。

训练分为三步:第一步配置好CPU训练环境;第二步用训练集进行训练;第三步保存好训练的模型。

第一步,定义CPU计算场所,创建一个executor,对program进行参数初始化。

第二步,设置好训练的轮数,用训练集进行训练。遍历batch_reader迭代器,喂入一个批次的数据。为方便后续分析和过程可视化,为每个pass的每个批次数据加上索引step_id,每喂入128个batch,保存一次Pass_Num, train batch_Num, Train_loss和Train_acc1,并使用print语句输出训练的中间结果,随着训练的进行,cost值逐渐下降,准确率逐渐提高,模型逐渐优化。

第三步,模型保存。模型的保存非常重要,因为训练好一个模型需要大量的时间和计算资源,所以当我们训练出一个高准确率和良好泛化性的模型时应该将其保存在本地硬盘上。

这张图片描述了训练过程中cost值和准确率的变化情况,可以看出随着迭代次数的增加,cost值不断降低,准确率不断提升,最终准确率达到了93.0%

4. 模型测试

打开摄像头首先截取实时视频流中的人脸部分,然后调用模型进行表情识别,测试效果如下图所示。

可以看出,当对着摄像头作出很开心的表情时,表情识别模型可以实时捕捉并识别出“快乐”的表情来;同样,当对着摄像头作出惊讶的表情时,模型也能正确的预测出来。

此外,还测试了静态的表情图像照片的情况。向模型传入待检测的静态图像后,可以发现模型能正确判断图片中的表情。实验效果图如下。

总结与展望

飞桨复现了经典前沿深度学习算法,快速迭代更新,同步学术前沿,且提供高质量的、支持迁移学习的工业级预训练模型。利用飞桨进行表情图片辨识可以取得较好的识别效果,这为AI技术学习者和行业应用者打开了一扇快速通往人工智能的大门。

计算机对人脸表情的理解与识别,从根本上改变了人与计算机的关系,从而达到更好的人机交互。因此人脸表情识别在心理学、智能机器人、智能监控、虚拟现实及合成动画等领域有很大的潜在应用价值,也希望飞桨能够为该方向的发展注入新活力。

项目地址:

https://aistudio.baidu.com/aistudio/projectdetail/54204

使用的模型链接:

https://www.paddlepaddle.org.cn/modelbasedetail/vgg

如在使用过程中有问题,可加入飞桨官方QQ群进行交流:703252161。

如果您想详细了解更多飞桨的相关内容,请参阅以下文档。

官网地址:

https://www.paddlepaddle.org.cn

飞桨开源框架项目地址:

GitHub:

https://github.com/PaddlePaddle/Paddle

Gitee:

https://gitee.com/paddlepaddle/Paddle

END

0 人点赞