目 录
摘 要 I
Abstract II
第一章 绪论 1
1.1 研究背景及意义 1
1.2 研究现状 1
1.3 本文研究的主要内容 3
第二章 人脸表情识别基础 4
2.1 常见的表情数据库 4
2.2 人脸识别 5
2.3 图像预处理 6
2.3.1 几何归一化 6
2.3.2 灰度归一化 8
2.3.3 直方图均衡化 8
2.4 主流人工智能框架 9
2.5 本章小结 10
第三章 多通道输入的卷积神经网络 12
3.1 CNN的基本原理 12
3.1.1 CNN的结构 12
3.1.2 激活函数 14
3.2 基于MCI-CNN的人脸表情识别算法 15
3.2.1 MCI-CNN网络架构 15
3.2.2 CNN模型结构及参数设置 16
3.3 本章小结 17
第四章 人脸表情识别的模型设计与分析 18
4.1 表情识别整体框图 18
4.2 数据集预处理 19
4.3 数据增强 20
4.4 模型训练的优化 23
4.4.1 TensorFlow读取数据的机制 23
4.4.2 基于多线程随机shuffle队列训练样本 24
4.5 实验结果分析与效果展示 25
4.6 本章小结 29
第五章 总结与展望 31
5.1 本文总结 31
5.2 未来展望 31
参考文献 33
致谢 35
附录 36
附录一 数据集预处理代码 36
附录二 CNN模型代码 38
附录三 模型训练代码 43
附录四 测试代码 48

1.3本文研究的主要内容
本设计基于python语言,借助TensorFlow人工智能框架,实现了人脸表情识别的功能。现实场景下,人脸图像的采集很容易受到外界不可控因素的影响,导致人脸图像发生局部位移和轻微旋转。对发生局部位移和轻微旋转的人脸图像载入卷积神经网络模型,可想而知表情识别率很低,识别效果不尽人意。因此,怎样设计一个神经网络结构解决上述问题,就成为了关键。本文研究的主要内容如下:
第一章论述了人脸识别技术的研究背景及研究现状,并介绍了本设计的研究内容。
第二章阐述了人脸表情识别基础,对人脸表情识别系统的实现做足准备工作。介绍了常用的人工智能框架与人脸表情数据库;使用opencv公开库中自带的检测器,对输入图片进行检测并裁剪人脸部分;然后使用双线性插值法把人脸图像缩放到4848的尺寸;之后对人脸图像进行灰度归一化。
第三章主要介绍了多通道输入的卷积神经网络(MCI-CNN)的架构,单个卷积神经网络模型借鉴GoogleNet中1
1卷积升降维的思想对AlexNet进行了改进。介绍了线性加权融合算法,把多个单个卷积神经网络模型融合起来,进行综合表情分类。
第四章主要介绍了人脸表情识别的模型设计与分析,为了防止过拟合现象的发生,对fer2013数据集进行预处理和数据增强。针对模型训练效率的问题,采用了基于多线程随机shuffle队列的解决方法,样本的载入速度提高了10倍,读取样本数据与训练样本数据异步进行,两者协同作业,共同完成模型的训练工作。最后通过实验分析,本设计算法的有效性与可行性。
第五章主要介绍了本设计中工作内容的总结以及本设计中针对没有解决问题的未来展望。
本设计基于python语言,借助TensorFlow人工智能框架,主要实现人脸检测+表情识别的功能。人脸检测与裁剪部分在第二章已经介绍了,在第三章介绍了本设计的核心部分,多通道输入的卷积神经网络架构和单个子模型的结构。本章将上述的两个部分整合在一起,实现人脸表情的分类与评估。本文转载自http://www.biyezuopin.vip/onews.asp?id=14663本章主要从样本数据集的预处理,训练的优化算法,实验结果的分析与效果展示三个方面介绍基于python的人脸表情识别实验。
本设计的实验环境如下:
CPU: Intel® Core i7-7500U 4核2.7GHZ主频
开发环境:Windows 10,python3.7,TensorFlow
开发工具:Pycharm

"""
author: Zhou Chen
datetime: 2019/6/18 17:39
desc: 一些工具库
"""
from tensorflow.keras.preprocessing.image import load_img, img_to_arraydef get_fer2013_images():"""从csv文件得到图片集:return:"""import pandas as pdimport numpy as npimport scipy.misc as smimport os# 定义7种表情emotions = {'0': 'anger',  # 生气'1': 'disgust',  # 厌恶'2': 'fear',  # 恐惧'3': 'happy',  # 开心'4': 'sad',  # 伤心'5': 'surprised',  # 惊讶'6': 'neutral',  # 中性}def save_image_from_fer2013(file):faces_data = pd.read_csv(file)root = '../data/fer2013/'# 文件主要三个属性,emotion为表情列,pixels为像素数据列,usage为数据集所属列data_number = 0for index in range(len(faces_data)):# 解析每一行csv文件内容emotion_data = faces_data.loc[index][0]  # emotionimage_data = faces_data.loc[index][1]  # pixelsusage_data = faces_data.loc[index][2]  # usage# 将图片数据转换成48*48image_array = np.array(list(map(float, image_data.split()))).reshape((48, 48))folder = root + usage_dataemotion_name = emotions[str(emotion_data)]image_path = os.path.join(folder, emotion_name)if not os.path.exists(folder):os.mkdir(folder)if not os.path.exists(image_path):os.mkdir(image_path)# 图片文件名image_file = os.path.join(image_path, str(index) + '.jpg')sm.toimage(image_array).save(image_file)data_number += 1print('总共有' + str(data_number) + '张图片')save_image_from_fer2013('../data/fer2013/fer2013.csv')def get_jaffe_images():"""得到按照标签存放的目录结构的数据集同时对人脸进行检测:return:"""import cv2import osemotions = {'AN': 0,'DI': 1,'FE': 2,'HA': 3,'SA': 4,'SU': 5,'NE': 6}emotions_reverse = ['anger', 'disgust', 'fear', 'happy', 'sad', 'surprised', 'neutral']def detect_face(img):"""检测人脸并裁减:param img::return:"""cascade = cv2.CascadeClassifier('../data/params/haarcascade_frontalface_alt.xml')rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30),flags=cv2.CASCADE_SCALE_IMAGE)if len(rects) == 0:# 没有检测到人脸return []rects[:, 2:] += rects[:, :2]return rectsfolder = '../data/jaffe'files = os.listdir(folder)images = []labels = []index = 0for file in files:img_path = os.path.join(folder, file)  # 文件路径img_label = emotions[str(img_path.split('.')[-3][:2])]  # 文件名包含标签labels.append(img_label)img = cv2.imread(img_path, 1)img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 下面裁减rects_ = detect_face(img_gray)for x1, y1, x2, y2 in rects_:cv2.rectangle(img, (x1+10, y1+20), (x2-10, y2), (0, 255, 255), 2)img_roi = img_gray[y1+20: y2, x1+10: x2-10]img_roi = cv2.resize(img_roi, (48, 48))images.append(img_roi)# 若不裁减,即原数据集# icons.append(cv2.resize(img_gray, (48, 48)))index += 1if not os.path.exists('../data/jaffe/Training'):os.mkdir('../data/jaffe/Training')for i in range(len(images)):path_emotion = '../data/jaffe/Training/{}'.format(emotions_reverse[labels[i]])if not os.path.exists(path_emotion):os.mkdir(path_emotion)cv2.imwrite(os.path.join(path_emotion, '{}.jpg'.format(i)), images[i])print("load jaffe dataset")def expression_analysis(distribution_possibility):"""根据概率分布显示直方图:param distribution_possibility::return:"""import numpy as npimport matplotlib.pyplot as pltimport os# 定义8种表情emotions = {'0': 'anger','1': 'disgust','2': 'fear','3': 'happy','4': 'sad','5': 'surprised','6': 'neutral','7': 'contempt'}y_position = np.arange(len(emotions))plt.figure()plt.bar(y_position, distribution_possibility, align='center', alpha=0.5)plt.xticks(y_position, list(emotions.values()))plt.ylabel('possibility')plt.title('predict result')if not os.path.exists('../results'):os.mkdir('../results')plt.show()# plt.savefig('../results/rst.png')def load_test_image(path):"""读取外部测试图片:param path::return:"""img = load_img(path, target_size=(48, 48), color_mode="grayscale")img = img_to_array(img) / 255.return imgdef index2emotion(index=0, kind='cn'):"""根据表情下标返回表情字符串:param index::return:"""emotions = {'发怒': 'anger','厌恶': 'disgust','恐惧': 'fear','开心': 'happy','伤心': 'sad','惊讶': 'surprised','中性': 'neutral','蔑视': 'contempt'}if kind == 'cn':return list(emotions.keys())[index]else:return list(emotions.values())[index]def cv2_img_add_text(img, text, left, top, text_color=(0, 255, 0), text_size=20):""":param img::param text::param left::param top::param text_color::param text_size:return:"""import cv2import numpy as npfrom PIL import Image, ImageDraw, ImageFontif isinstance(img, np.ndarray):img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(img)font_text = ImageFont.truetype("./assets/simsun.ttc", text_size, encoding="utf-8")  # 使用宋体draw.text((left, top), text, text_color, font=font_text)return cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)def get_faces_from_gray_image(img_path):"""获取图片中的人脸:param img_path::return:"""import cv2face_cascade = cv2.CascadeClassifier('./dataset/params/haarcascade_frontalface_alt.xml')img = cv2.imread(img_path)img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(img_gray,scaleFactor=1.1,minNeighbors=1,minSize=(30, 30))if len(faces) == 0:return None# 遍历每一个脸faces_gray = []for (x, y, w, h) in faces:face_img_gray = img_gray[y:y + h + 10, x:x + w + 10]face_img_gray = cv2.resize(face_img_gray, (48, 48))faces_gray.append(face_img_gray)return faces_graydef get_feature_map(model, layer_index, channels, input_img=None):"""可视化每个卷积层学到的特征图:param model::param layer_index::param channels::param input_img::return:"""if not input_img:input_img = load_test_image('../data/demo.jpg')input_img.shape = (1, 48, 48, 1)from keras import backend as Klayer = K.function([model.layers[0].input], [model.layers[layer_index+1].output])feature_map = layer([input_img])[0]import matplotlib.pyplot as pltplt.figure(figsize=(20, 8))for i in range(channels):img = feature_map[:, :, :, i]plt.subplot(4, 8, i+1)plt.imshow(img[0], cmap='gray')plt.show()if __name__ == '__main__':from model import CNN3model = CNN3()model.load_weights('../models/cnn3_best_weights.h5')get_feature_map(model, 1, 32)


















基于Python的人脸表情管理系统设计与实现相关推荐

  1. 基于Python的人脸表情管理系统

    人脸表情识别是深度学习领域的研究热点.在现实场景中,人脸图像的采集很容易受到外界不可控因素的影响,使表情图像出现轻微形变和局部位移的问题,导致表情识别率下降,难以满足实际需求.因此本设计针对静态人脸表 ...

  2. 基于python的校园寝室管理系统设计与实现

    开发概要 开发操作系统:windows10 开发环境:Python3.8 开发语言:Python 开发框架:Django 开发工具:pycharm  数据库:mysql8 数据库管理工具:navica ...

  3. 基于MobileNet的人脸表情识别系统(MATLAB GUI版+原理详解)

    摘要:本篇博客介绍了基于MobileNet的人脸表情识别系统,支持图片识别.视频识别.摄像头识别等多种形式,通过GUI界面实现表情识别可视化展示.首先介绍了表情识别任务的背景与意义,总结近年来利用深度 ...

  4. Python基于OpenCV的人脸表情识别系统[源码&部署教程]

    1.项目背景 人脸表情识别是模式识别中一个非常重要却十分复杂的课题.首先对计算机人脸表情识别技术的研究背景及发展历程作了简单回顾.然后对近期人脸表情识别的方法进行了分类综述.通过对各种识别方法的分析与 ...

  5. 基于python的人脸识别系统设计与实现

    案例分享之基于python的人脸识别系统设计与实现 人脸识别即程序对输入的图像进行判别是否有人脸,并识别出有人脸的图像所对应的人.即我们常说的人脸识别一般包含了人脸检测和人脸识别两部分.下面对其在op ...

  6. 基于Python的人脸识别课堂考勤系统(毕设)

    一个菜鸟搞毕业设计的过程分享,可能对迷茫的你起到一点点作用! 序言 在着手开发项目之前我们一定要对系统进行一个初步的规划,比如系统可以实现什么功能,是否需要开发GUI页面(大部分导师都会让你搞一个,仅 ...

  7. java毕业设计——基于JSP+access的旅游管理系统设计与实现(毕业论文+程序源码)——旅游管理系统

    基于JSP+access的旅游管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+access的旅游管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  8. 基于Python的人脸识别课堂系统(毕设)——附录上

    本文章承接<基于Python的人脸识别课堂考勤系统(毕设)>,填坑上篇文章遗留的代码部分.因为项目分的模块比较多,再加上本人能力有限,所以代码过于臃肿还存在许多优化的地方.同样本篇文章也仅 ...

  9. python人脸识别训练模型_开源 | 基于Python的人脸识别:识别准确率高达99.38%!

    原标题:开源 | 基于Python的人脸识别:识别准确率高达99.38%! 该库使用 dlib 顶尖的深度学习人脸识别技术构建,在户外脸部检测数据库基准(Labeled Faces in the Wi ...

最新文章

  1. 神经科学中的数学之美
  2. 同名字的数值求和插入行_中望CAD2021:支持表格和字段插入公式,提高数据处理效率...
  3. [Hive]-函数篇
  4. ios开发之使用多文件上传的简单封装最原始的
  5. 从头到尾彻底理解傅里叶变换算法(下)
  6. 弹出层之1:JQuery.Boxy (二)
  7. 建房子 最安全图纸_妄想山海初期该怎么办?砍树狩猎建房子,还能拆别人的房子...
  8. Docker - Compose 使用说明、详解docker-compose
  9. Linux 管理员技术
  10. python剑指offer替换空格_《剑指Offer》字符串 替换空格
  11. 记录——《C Primer Plus (第五版)》第十章编程练习第三题
  12. opencv2对于读书笔记——二值化——thresholded功能
  13. POST请求下载文件
  14. 机器人无限火力无限e符文_2021LOL无限火力机器人天赋符文、出装推荐-无限火力机器人玩法介绍-色彩电竞...
  15. Spring-循环依赖(circular dependencies)
  16. 防火墙技术及其在校园网中的设计方案
  17. SMARTY安装与使用
  18. MySQL主从同步数据
  19. 当人说君子动口不动手时怎么回怼_俗话说:“君子动口不动手。”那么到底什么样的人才称得上君子?...
  20. 小学三年级信息技术认识计算机教案,【ppt 课件】三年级 小学信息技术课件_第2课_认识计算机课件教案.ppt...

热门文章

  1. FS7050系列5V电压检测IC(芯片)
  2. 高校毕业生数字经济就业创业报告
  3. 数据结构-链表-单链表
  4. bash 脚本写的“抓阄程序”(随机数)
  5. UEFI 之 代码执行uefi shell命令
  6. Pandas:波浪号“~”在 pandas 中的用法
  7. STM32 通过USB接口读写挂载的SD卡(支持fatfs文件系统)
  8. ThickBox jquery 图形插件
  9. cartographer 3d 初试,运行速腾聚创data
  10. RoboCom大赛——7-1懂得都懂