当前位置: 首页 > 编程日记 > 正文

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

640?wx_fmt=png


作者 | 叶圣
出品 | AI科技大本营(ID:rgznai100)

【导读】随着计算机和AI新技术及其涉及自然科学的飞速发展,整个社会上的管理系统高度大大提升,人们对类似人与人之间的交流日渐疲劳而希望有机器的理解。计算机系统和机械人如果需要像生物那样具备解读和传达感情的战斗能力,将彻底转变人与计算机系统两者之间的的关系,使计算机系统需要更佳地为生物公共服务。表情识别是感情解读的根基,是计算机系统解读人们感情的必要,也是人们探寻和解读人工智能的有效途径。

图片表情识别是所指从等价的动态影像或静态录像中的分离出来特定的眼神稳定状态 ,从而确认被辨识单纯的认知焦虑,构建计算机系统对图片眼神的解读与辨识 ,彻底转变人与计算机系统的的关系,从而超过更佳的嵌入式。因此,图片表情识别在精神病学、智能机器人、人工智能监视、虚拟实境及制备动画电影等各个领域有相当大的潜在应用于商业价值。

面部表情识别技术是最近几十年来才发展起来的,由于面部表情的生态环境和复杂性,并且涉及生物化学及心理学,表情识别不具备较大的趣味性,因此,与其它生物识别技术如辨识、虹膜识别、人脸识别等相比发展状况较慢,运用于还不广泛。但是表情识别对于操作系统却有重要的潜力,因此国内外很多研究中心、政府机构及学者致力于这方面的研究,并己经取得了一定的成果。
那么下面我们将用Keras搭建面部表情识别的模型。

首先准备数据集,如图所示:

640?wx_fmt=png


将图片放在不同的文件夹下,文件夹名字就为他的标签名。

下面将建立神经网络代码。
首先导入需要使用的库:

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

最终输出我们的实验效果:

640?wx_fmt=png


由此可见其模型基本准确。
下面简单介绍表情识别的重要性和发展。

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元

640?wx_fmt=png


推荐阅读

相关文章:

提高C++性能的编程技术笔记:构造函数和析构函数+测试代码

对象的创建和销毁往往会造成性能的损失。在继承层次中,对象的创建将引起其先辈的创建。对象的销毁也是如此。其次,对象相关的开销与对象本身的派生链的长度和复杂性相关。所创建的对象(以及其后销毁的对象)的数量与派生的复杂度成正比。 并不是说继承根…

swim 中一行代码解决收回键盘

//点击空白收回键盘 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { view.endEditing(true) }

WinAPI: SetRect 及初始化矩形的几种办法

为什么80%的码农都做不了架构师&#xff1f;>>> 本例分别用五种办法初始化了同样的一个矩形, 运行效果图: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 class(TForm)Butto…

Windows10上使用VS2017编译OpenCV3.4.2+OpenCV_Contrib3.4.2+Python3.6.2操作步骤

1. 从https://github.com/opencv/opencv/releases 下载opencv-3.4.2.zip并解压缩到D:\soft\OpenCV3.4.2\opencv-3.4.2目录下&#xff1b; 2. 从https://github.com/opencv/opencv_contrib/releases 下载opencv_contrib-3.4.zip并解压缩到D:\soft\OpenCV3.4.2\opencv_contrib-3…

swift 跳转网页写法

var alert : UIAlertView UIAlertView.init(title: "公安出入境网上办事平台", message: "目前您可以使用网页版进行出入境业务预约与查询&#xff0c;是否进入公安出入境办事平台&#xff1f;", delegate: nil, cancelButtonTitle: "取消", o…

智能边缘计算:计算模式的再次轮回

作者 | 刘云新来源 | 微软研究院AI头条&#xff08;ID:MSRAsia&#xff09;【导读】人工智能的蓬勃发展离不开云计算所带来的强大算力&#xff0c;然而随着物联网以及硬件的快速发展&#xff0c;边缘计算正受到越来越多的关注。未来&#xff0c;智能边缘计算将与智能云计算互为…

WinAPI: 钩子回调函数之 SysMsgFilterProc

为什么80%的码农都做不了架构师&#xff1f;>>> SysMsgFilterProc(nCode: Integer; {}wParam: WPARAM; {}lParam: LPARAM {} ): LRESULT; {}//待续...转载于:https://my.oschina.net/hermer/blog/319736

提高C++性能的编程技术笔记:虚函数、返回值优化+测试代码

虚函数&#xff1a;在以下几个方面&#xff0c;虚函数可能会造成性能损失&#xff1a;构造函数必须初始化vptr(虚函数表)&#xff1b;虚函数是通过指针间接调用的&#xff0c;所以必须先得到指向虚函数表的指针&#xff0c;然后再获得正确的函数偏移量&#xff1b;内联是在编译…

ICCV 2019 | 无需数据集的Student Networks

译者 | 李杰 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;本文是华为诺亚方舟实验室联合北京大学和悉尼大学在ICCV2019的工作。摘要在计算机视觉任务中&#xff0c;为了将预训练的深度神经网络模型应用到各种移动设备上&#xff0c;学习一个轻便的网络越来越重要。…

oc中特殊字符的判断方法

-(BOOL)isSpacesExists { // NSString *_string [NSString stringWithFormat:"123 456"]; NSRange _range [self rangeOfString:" "]; if (_range.location ! NSNotFound) { //有空格 return YES; }else { //没有空格 return NO; } } -(BOOL)i…

理解 Delphi 的类(十) - 深入方法[23] - 重载

为什么80%的码农都做不了架构师&#xff1f;>>> {下面的函数重名, 但参数不一样, 此类情况必须加 overload 指示字;调用时, 会根据参数的类型和个数来决定调用哪一个;这就是重载. }function MyFun(s: string): string; overload; beginResult : 参数是一个字符串: …

玩转ios友盟远程推送,16年5月图文防坑版

最近有个程序员妹子在做远程推送的时候遇到了困难&#xff0c;求助本帅。尽管本帅也是多彩的绘图工具&#xff0c;从没做过远程推送&#xff0c;但是本着互相帮助&#xff0c;共同进步的原则&#xff0c;本帅还是掩饰了自己的彩笔身份&#xff0c;耗时三天&#xff08;休息时间…

提高C++性能的编程技术笔记:临时对象+测试代码

类型不匹配&#xff1a;一般情况是指当需要X类型的对象时提供的却是其它类型的对象。编译器需要以某种方式将提供的类型转换成要求的X类型。这一过程可能会产生临时对象。 按值传递&#xff1a;创建和销毁临时对象的代价是比较高的。倘若可以&#xff0c;我们应该按指针或者引…

北美欧洲顶级大咖齐聚,在这里读懂 AIoT 未来!

2019 嵌入式智能国际大会即将来袭&#xff01;购票官网&#xff1a;https://dwz.cn/z1jHouwE随着海量移动设备的时代到来&#xff0c;以传统数据中心运行的人工智能计算正在受到前所未有的挑战。在这一背景下&#xff0c;聚焦于在远离数据中心的互联网边缘进行人工智能运算的「…

c# 关闭软件 进程 杀死进程

c# 关闭软件 进程 杀死进程 foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcessesByName("Server")){p.Kill();} 转载于:https://www.cnblogs.com/lxctboy/p/3999053.html

提高C++性能的编程技术笔记:单线程内存池+测试代码

频繁地分配和回收内存会严重地降低程序的性能。性能降低的原因在于默认的内存管理是通用的。应用程序可能会以某种特定的方式使用内存&#xff0c;并且为不需要的功能付出性能上的代价。通过开发专用的内存管理器可以解决这个问题。对专用内存管理器的设计可以从多个角度考虑。…

【Swift】 GETPOST请求 网络缓存的简单处理

GET & POST 的对比 源码&#xff1a; https://github.com/SpongeBob-GitHub/Get-Post.git 1. URL - GET 所有的参数都包含在 URL 中 1. 如果需要添加参数&#xff0c;脚本后面使用 ? 2. 参数格式&#xff1a;值对 参数名值 3. 如果有多个参数&#xff0c;使用 & 连接 …

深度CTR预估模型的演化之路2019最新进展

作者 | 锅逗逗来源 | 深度传送门&#xff08;ID: deep_deliver&#xff09;导读&#xff1a;本文主要介绍深度CTR经典预估模型的演化之路以及在2019工业界的最新进展。介绍在计算广告和推荐系统中&#xff0c;点击率&#xff08;Click Through Rate&#xff0c;以下简称CTR&…

2015大型互联网公司校招都开始了,薪资你准备好了嘛?

2015年的校招早就开始了&#xff0c;你还不知道吧&#xff1f;2015年最难就业季来了&#xff0c;你还没准备好嘛&#xff1f;现在就开始吧&#xff0c;已经很多大型互联网公司祭出毕业生底薪了看谷歌、看百度、看腾讯、看阿里巴巴再看传统软件公司&#xff1a;看微软、看联想、…

提高C++性能的编程技术笔记:多线程内存池+测试代码

为了使多个线程并发地分配和释放内存&#xff0c;必须在分配器方法中添加互斥锁。 全局内存管理器(通过new()和delete()实现)是通用的&#xff0c;因此它的开销也非常大。 因为单线程内存管理器要比多线程内存管理器快的多&#xff0c;所以如果要分配的大多数内存块限于单线程…

iOS中几种定时器

一、NSTimer 1. 创建方法 NSTimer *timer [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:selector(action:) userInfo:nil repeats:NO];TimerInterval : 执行之前等待的时间。比如设置成1.0&#xff0c;就代表1秒后执行方法target : 需要执行方法的对象…

手把手教你使用Flask轻松部署机器学习模型(附代码链接) | CSDN博文精选

作者 | Abhinav Sagar翻译 | 申利彬校对 | 吴金笛来源 | 数据派THU&#xff08;ID&#xff1a;DatapiTHU&#xff09;本文旨在让您把训练好的机器学习模型通过Flask API 投入到生产环境 。当数据科学或者机器学习工程师使用Scikit-learn、Tensorflow、Keras 、PyTorch等框架部署…

JQuery遮罩层

2019独角兽企业重金招聘Python工程师标准>>> css样式&#xff1a;<style type"text/css"> .mask { position: absolute; top: 0px; filter: alpha(opacity60); background-color: #777; z-index: 1002; left: 0px; …

代码覆盖测试工具Kcov简介及使用

Kcov是一个代码覆盖测试工具&#xff0c;最初基于Bcov&#xff0c;它可在FreeBSD、Linux、OSX系统中使用&#xff0c;支持的语言包括编译语言(compiled languages)、Python和Bash。与Bcov一样&#xff0c;Kcov对编译的程序使用DWARF调试信息&#xff0c;以便无需特殊编译器开关…

Google148亿元收购Fitbit,抢占苹果、三星可穿戴设备市场地盘

编译 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;11 月 1 日&#xff0c;Google 母公司 Alphabet 和 可穿戴设备公司 Fitbit 同时发布新闻&#xff0c;宣布已经达成了收购后者的最终协议。Google LLC 以每股 7.35 美元的价格收购 Fitbit&#xff0c;总价值…

ios关于用xib创建的cell 自动返回cell的高度问题!

1 设置tableView的属性 self.tableView.rowHeight UITableViewAutomaticDimension; self.tableView.estimatedRowHeight 44.0; // 设置为一个接近“平均”行高的值 2 cell要约束好&#xff0c;要能够让cell知道自己的高度根据哪个控件计算就可以&#xff08;不明白看下图&…

西门子PLC学习笔记二-(工作记录)

今天师傅给讲了讲做自己主动化控制的总体的思路&#xff0c;特进行一下记录&#xff0c;做个备忘。 1.需求分析 本次的项目是对楼宇循环供水的控制&#xff0c;整个项目须要完毕压力、压差、温度等的获取及显示、同一时候完毕电机的控制。 2.设计 使用西门子的Step7工具进行梯形…

Swift 3.0 预告:将 Objc 库转换成更符合 Swift 语法风格的形式

转自&#xff1a;swiftcafe Swift 3.0 更新越来越临近&#xff0c;这次更新会给我们带来很多实用的内容&#xff0c;比如对 Objc 库的迁移&#xff0c;会更符合 Swift 的语法风格。用过之前版本的 Swift&#xff0c;我们会发现很多 Objc 库的方法名称其实还是以 Objc 的风格来命…

非对称加密算法RSA公钥私钥的模数和指数提取方法

生成非对称加密算法RSA公钥、私钥的方法&#xff1a; 1. 通过OpenSSL库生成&#xff0c;可参考 https://github.com/fengbingchun/OpenSSL_Test/blob/master/demo/OpenSSL_Test/funset.cpp 中的Generate_RSA_Key函数&#xff1b; 2. 在Linux下通过命令生成&#xff0c;执行…

数据库“新解”,看这里,get!

自从第一台通用计算机诞生至今&#xff0c;围绕计算机系统硬件的创新迭代就一直“在路上”&#xff0c;伴随着硬件能力的不断提升&#xff0c;软件更新自然不可缺少。通常来说在传统的计算机软件工程领域&#xff0c;操作系统、编译器与数据库被并称为最具难度的“三剑客”系统…