女朋友啥时候怒了?Keras识别面部表情挽救你的膝盖
- 2019 年 11 月 12 日
- 筆記
出品 | 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) & 0xFF if 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)