作者 | 叶圣
出品 | AI科技大本营(ID:rgznai100)
【导读】随着计算机和AI新技术及其涉及自然科学的飞速发展,整个社会上的管理系统高度大大提升,人们对类似人与人之间的交流日渐疲劳而希望有机器的理解。计算机系统和机械人如果需要像生物那样具备解读和传达感情的战斗能力,将彻底转变人与计算机系统两者之间的的关系,使计算机系统需要更佳地为生物公共服务。表情识别是感情解读的根基,是计算机系统解读人们感情的必要,也是人们探寻和解读人工智能的有效途径。
图片表情识别是所指从等价的动态影像或静态录像中的分离出来特定的眼神稳定状态 ,从而确认被辨识单纯的认知焦虑,构建计算机系统对图片眼神的解读与辨识 ,彻底转变人与计算机系统的的关系,从而超过更佳的嵌入式。因此,图片表情识别在精神病学、智能机器人、人工智能监视、虚拟实境及制备动画电影等各个领域有相当大的潜在应用于商业价值。
面部表情识别技术是最近几十年来才发展起来的,由于面部表情的生态环境和复杂性,并且涉及生物化学及心理学,表情识别不具备较大的趣味性,因此,与其它生物识别技术如辨识、虹膜识别、人脸识别等相比发展状况较慢,运用于还不广泛。但是表情识别对于操作系统却有重要的潜力,因此国内外很多研究中心、政府机构及学者致力于这方面的研究,并己经取得了一定的成果。
那么下面我们将用Keras搭建面部表情识别的模型。
首先准备数据集,如图所示:

将图片放在不同的文件夹下,文件夹名字就为他的标签名。
下面将建立神经网络代码。
首先导入需要使用的库:
from keras.models import Sequential
from keras.layers import Conv2D,MaxPool2D,Activation,Dropout,Flatten,Dense
from keras.optimizers import Adam
from keras.preprocessing.image import ImageDataGenerator,img_to_array,load_img
from keras.models import load_model

下面为了充分利用数据集,对图片加入一些裁剪等方面操作:

train_datagen = ImageDataGenerator(rotation_range = 40,     # 随机旋转度数width_shift_range = 0.2, # 随机水平平移height_shift_range = 0.2,# 随机竖直平移rescale = 1/255,         # 数据归一化shear_range = 20,       # 随机错切变换zoom_range = 0.2,        # 随机放大horizontal_flip = True,  # 水平翻转fill_mode = 'nearest',   # 填充方式
)

下面是网络层的搭建,利用卷积神经网络,下面每段代码有注释:

添加一个卷积层,传入固定宽高三通道的图片,以32种不同的卷积核构建32张特征图,

卷积核大小为3*3,构建特征图比例和原图相同,激活函数为relu函数。

model.add(Conv2D(input_shape=(IMG_W,IMG_H,3),filters=32,kernel_size=3,padding='same',activation='relu'))

再次构建一个卷积层

model.add(Conv2D(filters=32,kernel_size=3,padding='same',activation='relu'))

构建一个池化层,提取特征,池化层的池化窗口为2*2,步长为2。

model.add(MaxPool2D(pool_size=2,strides=2))

继续构建卷积层和池化层,区别是卷积核数量为64。

model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))
model.add(Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=2,strides=2))

继续构建卷积层和池化层,区别是卷积核数量为128。

model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))
model.add(Conv2D(filters=128,kernel_size=3,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=2, strides=2))model.add(Flatten()) #数据扁平化
model.add(Dense(128,activation='relu')) #构建一个具有128个神经元的全连接层
model.add(Dense(64,activation='relu')) #构建一个具有64个神经元的全连接层
model.add(Dropout(DROPOUT_RATE)) #加入dropout,防止过拟合。
model.add(Dense(CLASS,activation='softmax')) #输出层

接下来是训练和保存的代码:

model.fit_generator( #模型拟合train_generator,  #训练集迭代器steps_per_epoch=len(train_generator), #每个周期需要迭代多少步(图片总量/批次大小=11200/64=175)epochs=EPOCHS, #迭代周期validation_data=test_generator, #测试集迭代器validation_steps=len(test_generator) #测试集迭代多少步)
model.save('{}.h5'.format(SAVE_PATH)) #保存模型

然后预测显示我们的代码:

image = load_img("56.jpg")
image = image_change(image)
img=cv2.imread("56.jpg")
img_PIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
myfont = ImageFont.truetype(r'C:/Windows/Fonts/simfang.ttf', 40)
draw = ImageDraw.Draw(img_PIL)
draw.text((300, 10), label[model.predict_classes(image)][0], font=myfont, fill=(200, 100, 0))
img_OpenCV = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)
cv2.imshow('frame', img_OpenCV)
cv2.waitKey(0)

如果要调用摄像头就是这样的代码:

cap = cv2.VideoCapture(0)
while True:_,frame = cap.read()bg = "temp.png"cv2.imwrite(bg,frame)image = load_img("temp.png")#plt.imshow(image)image = image_change(image)img=cv2.imread("temp.png")img_PIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
myfont = ImageFont.truetype(r'C:/Windows/Fonts/simfang.ttf', 40)
draw = ImageDraw.Draw(img_PIL)
draw.text((300, 10), label[model.predict_classes(image)][0], font=myfont, fill=(200, 100, 0))
img_OpenCV = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)
cv2.imshow('frame', img_OpenCV)
key = cv2.waitKey(1) & 0xFFif key == ord("q"):break
最终输出我们的实验效果:

由此可见其模型基本准确。
下面简单介绍表情识别的重要性和发展。
20世纪70至90年代,澳大利亚神经学Ekman 和 Friesen对人的表情识别做出了开创性的探索。Ekman定义了生物体的6种表情状态:喜欢 (Love)、生气(Angry)、惊讶 (Surprise)、忧虑(In)、厌恶(Disgust)和悲伤(Sad),证实了识别表情类别;其次是创立了面部动作编码系统(Facial Freedom Control System,FACS),使研究者按照该系统,将一系列照片的动作分为两组(Freedom Services,AU)来描述照片面部动作,通过照片风格和表情的的关系,进而检测照片面部细微表情。
1978年,Suwa等人对一段视频进行了照片表情识别的最初处理,引发了一系列在照片和视频表情方面工作的展开。到七十年代至九十年代,随着图像处理与神经网络技术的蓬勃发展,使得照片表情识别的计算机自动化处理变得可能,G Mase和 A Pentland是其中的奠基人。二人首先用光流强度处理,然后提取多处宽敞中的光流值,包含表情特征向量,最后利用表情特征向量构建照片表情辨识。该系统可以识别愧疚、恼怒、不满和吃惊4种表情,识别率接近80%。
1997年,哈尔滨工业大学的教授领导团队将照片表情识别的资料引入国内。
2003年,上海交通大学的王志良教授领导的团队,将照片表情识别算法应用于机器人的情感掌握研究中,并发表了2002年以来照片表情识别蓬勃发展情况的论文。2004年,浙江大学的吴文明讲师在面部表情识别方面,明确指出了基于表情识别的发展方向。最近几年,关于表情识别的项目数总体上呈现增长趋势。清华大学、中国工程院、南京大学、天津交通大学、上海交通大学、哈尔滨工业大学、浙江大学、南京大学、国家重点实验室、南开大学等多所学校和研究机构和政府机构参与了照片表情识别相关课题的研究。
虽然照片表情识别的商业运用于还停滞不前,但是国内外研究机构、政府机构和企业都在不尽相同的领域进行研究,部分论文早就取得了专利。因此表情识别的研究具备很大的研制潜力。

(*本文为 AI科技大本营投稿文章,转载请微信联系 1092722531

精彩推荐

12月6-8日,深圳!2019嵌入式智能国际大会,集聚500+位主流AIoT中坚力量,100+位海内外特邀技术领袖!9场技术论坛布道,更有最新芯片和模组等新品展示!点击链接或扫码,输入本群专属购票优惠码CSDNQRSH,即可享受6.6折早鸟优惠,比原价节省1000元,学生票仅售599元

推荐阅读

女朋友啥时候怒了?Keras识别面部表情挽救你的膝盖相关推荐

  1. 使用Keras的面部表情识别

    使用Keras的面部表情识别 项目实施... 介绍和概述 Keras是一个非常强大的开源Python库,它运行在TensorFlow.Theano等其他开源机器库之上,用于开发和评估深度学习模型并利用 ...

  2. 毕业设计总结——自闭症儿童识别面部表情训练系统

    很开心完成了这个app,在新年愿望里其中有一个就是能有app上线AppStore,虽然未达到但相信会完成的. 从15年12月份考研之后到今年的3月初,根据指导老师黄玲老师的需求做需求分析文档.设计文档 ...

  3. 使用 Keras 进行面部表情识别

    图片来源 : Pinterest 简介和概述 Keras是一个非常强大的开源Python库,它运行在其他开源机器库(如TensorFlow,Theano等)之上,用于开发和评估深度学习模型,并利用各种 ...

  4. 看下巴识心情,这个AI项链挂胸前也能识别面部表情

    兴坤 发自 凹非寺 量子位 报道 | 公众号 QbitAI 瞄一瞄你的下巴,就知道你有没有在难过. 这个温馨的场景对应的不是窝在怀里的小猫咪,而是-- Neck Face,一款用于监控情绪的智能工具. ...

  5. tkinter+socket&MySQL+keras识别minst手写数字

    tkinter + socket + keras + MySQL识别Minst手写数字 环境配置 代码 服务端 客户端 主函数main.py 类Window.py 实验报告部分 一.总体功能说明 1. ...

  6. 卷积神经网络CNN——使用keras识别猫咪

    在近些年,深度学习领域的卷积神经网络(CNNs或ConvNets)在各行各业为我们解决了大量的实际问题.但是对于大多数人来说,CNN仿佛戴上了神秘的面纱.我经常会想,要是能将神经网络的过程分解,看一看 ...

  7. Kaggle ICML2013 fer2013人脸表情识别/面部表情识别:训练、调优、调试与踩坑

    目录 概要: 问题来源: 论文对此比赛的说明: 选择原因: 实现与优化思路: 前置: 数据处理: 原csv数据的读取与分割: csv数据转图片和tfrecord的存取: tfrecord接生产队列供模 ...

  8. 使用深度学习方法实现面部表情包识别

    1.动机 人类面部表情丰富,但可以总结归纳为 7 类基本表情: happy, sad, surprise, fear, anger, disgust, and neutral.面部表情是通过面部肌肉活 ...

  9. 高姿态下的面部表情识别系统

    效果展示: python表情.性别识别 面部表情识别 (FER) 在计算机安全.神经科学.心理学和工程学方面有大量应用.由于其非侵入性,它被认为是打击犯罪的有用技术.然而,FER 面临着几个挑战,其中 ...

最新文章

  1. [转载] static class 静态类(Java)
  2. 使用Cookie记录信息
  3. 我的博客今天2岁104天了,我领取了…
  4. 目前MPLS有哪些备份方案?
  5. 基于迭代次数的多中心定位分类法
  6. matlab特征点数量,特征点检测效果评估(matlab代码)
  7. CSocket类的使用
  8. 企业以太坊联盟发布了愿景文件
  9. vue.js点击更多加载更多数据,双数组合并
  10. Elasticsearch】es memory locking requested for process but memory is not locked
  11. ANSI C typedef
  12. WebRTC 的现状和未来:专访 W3C WebRTC Chair Bernard Aboba
  13. 第一章、天天生鲜项目框架搭建
  14. Django接口文档
  15. cs61b实验记录(八)project 3:BearMaps 基于OSM的伯克利地图web应用
  16. Chrome小恐龙游戏前端修改代码【含原理和代码】
  17. 【华为校招】【校招】【Java】叠积木
  18. 铲雪车(snow) UVA10203 Snow Clearing 题解
  19. Microsoft 提供的 USB 驱动程序
  20. 索尼爱立信滑盖机java_可爱Walkman滑盖机 索尼爱立信W100i评测

热门文章

  1. 设置编码格式为utf8
  2. Web充斥着存在漏洞的过期JavaScript库
  3. 2017-1-7 html元素分类(1)
  4. JAVA的StringBuffer类
  5. 转:浅谈Linux的内存管理机制
  6. SQL Server数据库错误9003(LSN无效)的处理方法
  7. 100道 Dubbo面试题及答案(2021最新)
  8. pyqt5 使用 QTimer, QThread, pyqtSignal 实现自动执行,多线程,自定义信号触发。
  9. SpringBoot------添加保存时自动编译插件
  10. react遇到的各种坑