资源技术动态如何快速搭建情感识别器?预训练模型告诉你

如何快速搭建情感识别器?预训练模型告诉你

2019-11-19 | |  113 |   0


原标题:如何快速搭建情感识别器?预训练模型告诉你    

来源:AI 研习社         链接:https://www.yanxishe.com/TextTranslation/2230


在这篇博文中,我们会讨论如何通过预训练后的计算机视觉模型进行迁移学习从而快速搭建一个情感识别器以及一种使用google图片来干净利落的自定义数据集方法。

注意:在这篇博文中包含了针对特殊任务的代码片段,但是要复现结果,读者必须参考原始代码库。

image.png

图1.在老友记剧照上应用训练过后的情感检测器


让我们来准备一些数据

在任何的机器学习任务中,第一要务是收集数据。我们需要的是数以万计的标注有脸部表情的图像数据。对于我们,公共数据集FER(面部情感表达数据集)是一个非常棒的起步数据集,它有28709张标注图像。我们会使用数据集的一部分来作为我们的需要识别的目标情感:

  • 愤怒的

  • 恶心的

  • 高兴的

  • 悲伤的

  • 惊讶的

然而,既然这些图像的分辨率都只有48pt*48pt,最好再使用一个拥有特征更丰富的数据集。为了实现这一想法,我们将使用python包中的google图像下载包来从google图像中查询并抓取数据。


这种方法的好处,一是它可以检索到数以万计的‘野生’数据,二是我们可以使用查询中的关键词来标注图像。


为了增加获取图像的数量,在检索情感时可以执行输入同义词,比如说,除了开心的,还可以输入微笑的、备受鼓舞的、兴高采烈的等等。


大多数的查询格式应该被这样组织,‘情感(人)’。事实证明,查询中不包含人时大多数图像会是表情包。


以下代码段显示了如何配置图像抓取器并最多检索1000张“开心的”图像。  

from google_images_download import google_images_download    

DRIVER_PATH = 'insert the filepath to the chrome driver here...'    
args = {'keywords': 'happy human face',               # the query to search in Google Images    
        'output_directory': '/data/emotion/images',   # the root directory for the images    
        'image_directory': 'happy',                   # the subdirectory (images will be stored in '/data/emotion/images/happy')    
        'silent_mode': True,                          # limits the number of lines printed to stdout    
        'limit': 1000,                                # limit for the number of images returned    
        'chromedriver': DRIVER_PATH}    

        response = google_images_download.googleimagesdownload()    
response.download(args)


在这里要注意一些事情:

  1. 必须要下载google云盘才能使用这个库。想要了解更详细的看这个网页。

  2. google图片限制了脚本查询后返回的数量(一般小于1000)


找到人脸

在我们训练情感识别器之前,我们首先需要能够定位每一张图像中的人脸。既然我们的目标是为了从许多脸部表情来分类人的情感,那么仅仅保存我们找到的人脸并舍去其他特征(大多是无关情感分类任务的)。


幸运的是,有许多预训练过后的人脸检测模型的开源库。对于此项目,我们将使用在VGGFace2和CASIA-Webface数据上预训练过的集成多任务CNN网络的facenet-pytorch包。


以下代码片段展示了我们是如何能够调用一个预训的MTCNN模型并使用它来为一张图像中的每一张人脸找到边界框。

from facenet_pytorch import MTCNN
from PIL import Image

IMG_PATH = 'insert the filepath to the target image'
img = Image.open(IMG_PATH)

model = MTCNN(keep_all=True)        # pretrained multitask CNN for finding faces
bboxes, probs = model.detect(img)   # returns a list of bounding boxes and a list of probabilities for each detected face


这一步有两个应用:

1.为了进行训练,我们将图像过滤为仅具有一张脸的图像(所查询的具有多张脸的图像可能与目标表情的相关性较低),然后使用生成的边界框从图像中裁剪出人脸。


2.在情感分类器被训练之后,人脸检测模型会被用来提取一张图像中的所有人脸,然后分别输入到模型中去。(比如,看图1)

一旦人脸被从每一张图像中分离出来,它会被放缩成标准形状,然后转化到单通道,灰度图像(看图2)。后一步是为了确保模型关注实际的面部表情而不是从颜色中学习任何偏差。

1572511088833745.png

图2.第一步是利用一个开源的、预先训练过后的人脸检测模型来从原始图像中裁剪出人脸,第二步是调整图像大小并转化成灰度图像。


准备一个基本模型

既然我们没有一个大型的数据集,我们就需要避免从头开始训练我们的分类器。在大多计算机视觉迁移学习任务中常见的那样,我们将继续进行微调一个已经在ImageNet上进行了预训练的模型,ImageNet数据集包含一千个不同标签上的一百万张图像。

这边的目标通过给我们的模型参数一个好的开始点来让我们的模型训练容易些。它可以利用从ImageNet上学习到的现有的特征提取器,然后进行调整来适用这个新任务。


对ImageNet预训练模型的一个警告是,它们希望的输入是RGB图像。我们可以通过将图像转换为三通道灰度图像来避开此问题。尽管这可行,但是由于我们将模型外推到新的特征空间(ImageNet不包含灰度图像),因此并不是最佳选择。


相反的,让我们用随机初始化的单通道卷积层替换掉模型中的第一个(三通道)卷积层。我们将使用Resnet-50 [3]作为模型。   

image.png

接下来的一步是来微调模型从而在输入灰度图像后,模型来模仿使用彩色输入时模型输出。训练通过如图3所示。

1572511091205321.png

图3. 使用ImageNet的灰度版本微调Resnet-50


在这里,一张RGB图会作为输入,‘喂’到预训练过后的Resnet-50模型。这张图片也会被转化为灰度图像同时作为输入,‘喂’到灰色Resnet-50中,该版本中的第一个卷积层接收单通道输入。


然后,两个输出会被嵌入传递给L2损失函数。尽管进行了大量计算,但是在反向传播步骤中唯一要更新的参数是“灰色Resnet”模型中的第一个单通道卷积层。 


这个过程是不受监督的,这意味着我们可以在任何数据集上微调模型,而不必担心寻找标签。我最终使用相同的Google图片抓取工具为每个标签下载了10张图片。有关所有1000个ImageNet标签,请参见此资源。 

图4在两个不同的图像上比较了原始模型和修改后的版本,每个图像都有彩色和灰度版本。对于金翅雀的一组,“灰色Resnet”模型对这只鸟是金翅雀的置信度较低,因为它看不到该鸟独特的黄色羽毛。

对于疣猪的一组,“灰色Resnet”模型在预测中比原始模型具有更高的置信度。推测是因为原始模型专注于皮毛的颜色(疣猪和野猪具有类似的棕色皮毛),而“灰色Resnet”则专注于结构差异。  

1572511086460790.png

图4.对于一组图像,原始Resnet模型和灰色Resnet模型预测的前三类标签


这个微调参数的步骤的目的是为了建立一个较少关注颜色更关注形状和结构的预训练模型。


在人脸上训练


现在我们已经有了基础模型,让我们应用迁移学习来分类情感吧!这会包括对我们预训练的灰色Resnet模型的两阶段微调。


第一阶段涉及对FER数据集的微调。这将作为在“野生”数据上训练模型之前的中间步骤。由于图像的分辨率较粗(48 x 48),希望该模型可以学习从FER数据集中识别简单特征。


第二阶段从第一阶段获取模型,然后根据“野生”数据对其进行进一步调整。在这里,该模型将扩展先前的表示形式,以学习“野生”数据中存在的更丰富特征。 


在实践中,我发现当对所有参数进行训练时,FER精调模型便获得了最佳验证分数。另一方面,当冻结了除最后十一层之外的所有层时,在“野生”数据上进行微调的模型均获得了最佳成绩(有关如何使用初始化的Resnet-50进行此操作的示例,请参见下面的代码)。 

image.png

之所以不允许在第二阶段训练整个模型,是因为“野生”数据集中的示例较少。考虑到其较大的容量,如果在该阶段允许训练所有参数,该模型将更容易过度拟合。下面的图5显示了以80:20的训练-测试比例对FER数据的验证结果。该模型的整体准确性为87.2%,似乎该模型在“快乐”和“惊讶”的情绪下获得了最大的成功。另一方面,该模型在区分“愤怒”和“悲伤”方面挣扎最大。也许是因为两者都是通常会皱眉的情绪。  

1574178316855128.png

图5.在FER图像上的分类矩阵


图6展示了以70:30的训练-测试比例来对‘野生的‘google图像的测试结果。

image.png

图6.在查询到的google图像上的分类矩阵


第一眼,随着整体精度下降到63.9%,模型的性能似乎下降了。这是因为我们模型的特征空间已更改。该“野生”数据集中的图像更加多样化和嘈杂,使其比科学的FER基准更难以分类。实际上,直接从FER数据中应用模型(第一阶段)而不对“野生”数据进行微调,其准确度不到51%。  


应用训练好的模型

现在,模型已经过训练,让我们来找一些乐趣,并尝试将其应用于不同的图像。


在图 1 中,情绪检测器应用于老友记中人物的表情识别(为方便起见,在下面复制图像)。此图像突出显示了模型如何判断"快乐"和"悲伤"的面孔。特别是,微笑有更多的曲线,显示牙齿可以产生更高的分数,说明比那些不这样做的人更快乐。

image.png

  图 1.在老友记的演员中应用经过训练的情感检测模型


在下面的图7中,模型被应用于哈利波特角色。在这里,我们有一个来自五个目标情绪的例子。


image.png

  图 7.检测哈利·波特人物表达的情感


我们可以通过每帧中分别查找面部和对的情绪进行分类来扩展此模型,从而来检测视频中的情绪(参见下面的图 8)。模特似乎混淆了我做的悲伤的脸与惊喜,然而,这可能是因为我不善于使悲伤的脸:)


毫不意外,当目标情绪比较强烈时,并且有更复杂的/混合的面部表情时,模型似乎工作得更好。这可能是因为谷歌搜索查询图片更有可能返回强烈的情绪。


结语

利用大量的现有的开源工作, 这个项目作为一种尝试,创造一些乐趣和有趣的事情。这样做让我能够快速地将项目的重要部分拼凑起来,反过来又让我能够专注于学习这些作品是如何工作的,以及我把它们组合在一起的最佳方式。


请注意,根据从 Google 图片搜索返回的数据,最好花一些时间手动检查结果。例如,在我的示例中,返回了 5000 多张图像,我花了大约 30 分钟浏览数据并删除任何错误和无意义的图像。


改进项目的一些潜在方法包括:

1.使用预先训练的人脸检测模型作为基本模型(而不是 ImageNet)

2.对微调步骤进行更多试验(例如,应允许多少层进行训练?)

3.将面部地标数据/模型与面部图像结合使用


代码库:https://github.com/martin-chobanyan/emotion


引用

[1] I. J. Goodfellow, D. Erhan, P. L. Carrier, A. Courville, M. Mirza, B. Hamner, W. Cukierski, Y. Tang, D. Thaler, D.-H. Lee et al., “Challenges in representation learning: A report on three machine learning contests,” in International Conference on Neural Information Processing. Springer, 2013

[2] Cai, Zhenni, Qingshan Liu, Shanmin Wang, and Bruce Yang. “Joint Head Pose Estimation with Multi-Task Cascaded Convolutional Networks for Face Alignment.” 2018 24th International Conference on Pattern Recognition (ICPR), 2018

[3] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. “Deep Residual Learning for Image Recognition.” 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2016

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:图像分类任务中的损失

下一篇:如何使用TensorFlow Eager训练你自己的人脸识别模型

用户评价
全部评价

热门资源

  • 应用笔画宽度变换...

    应用背景:是盲人辅助系统,城市环境中的机器导航...

  • GAN之根据文本描述...

    一些比较好玩的任务也就应运而生,比如图像修复、...

  • 端到端语音识别时...

    从上世纪 50 年代诞生到 2012 年引入 DNN 后识别效...

  • 人体姿态估计的过...

    人体姿态估计是计算机视觉中一个很基础的问题。从...

  • 谷歌发布TyDi QA语...

    为了鼓励对多语言问答技术的研究,谷歌发布了 TyDi...