本项目主要由包含我在内的四名成员共同完成:孙明喆、吴震、张晨、张明
项目介绍,及可执行文件、模型文件、详细报告均在GitHub中可以查看:
GitHub
关于项目的详细介绍,可能过些日子在复习时候会有所补充
2020年2月28日更新
文章目录
一、引言
人脸表情是人们之间非语言交流时的最丰富的资源和最容易表达人们感情的一种有效方式,在人们的交流中起着非常重要的作用。表情含有丰富的人体行为信息,是情感的主载体,通过脸部表情能够表达人的微妙的情绪反应以及人类对应的心理状态,由此可见表情信息在人与人之间交流中的重要性。人脸表情识别技术随着人们对表情信息的日益重视而受到关注,成为目前-个研究的热点。所谓人脸表情识别,就是利用计算机进行人脸表情图像获取、表情图像预处理、表情特征提取和表情分类的过程,它通过计算机分析人的表情信息,从而推断人的心理状态,最后达到实现人机之间的智能交互。表情识别技术是情感计算机研究的内容之一,是心理学、生理学、计算机视觉、生物特征识别、情感计算、人工心理理论等多学科交叉的一个极富挑战性的课题,它的研究对于自然和谐的人机交互、远程教育、安全驾:驶等都有重要的作用和意义。
二、关键技术
2.1 基于几何特征提取的方法
2.1.1 原理介绍
基于几何特征的表情识别是指对嘴、眉毛、鼻子、眼睛等这些人脸表情的显著特征的形状和位置变化进行定位和测量,确定它的形状、大小、距离及相互比例,进行表情识别的方法。Bourel 等人定义了面部特征点之间的九个距离并通过它们构建了表情特征向量进行表情分析。Chibelushi 等人也采用了面部几何特征点并采用Kanade-Tucas-Tomasi 特征点跟踪算法实现特征点跟踪,然后通过计算得到九个特征系数,而这九个系数构成了特征流,描述了由于表情的发生而引起的面部特征点的几何关系的变化。Pantic 等人进行面部特征检测并确定面部几何关系,然后他们通过规则推理系统将这种面部几何关系转化为面部动作单元的活动,最终通过专家系统实现表情识别。Ying-li Tian等 人采用几何特征提取与神经网络相结合的方法对正面或接近正面的面部图像进行表情识别,其中提取几何特征主要包括对于关键部位的定位特征和表情区的形状特征。
2.1.2 实现方法
实例化一个 shape_predictor 对象,使用dlib训练好人脸特征检测器,进行人脸的特征点标定。标定的时候使用opencv的circle方法,在特征点的坐标上面添加水印,内容就是特征点的序号和位置。
2.2 机器学习的过程
机器学习方法是计算机利用已有的数据(经验),得出了某种模型(迟到的规律),并利用此模型预测未来(是否迟到)的一种方法。从广义上来说,机器学习是一种能够赋予机器学习的能力以此让它完成直接编程无法完成的功能的方法。但从实践的意义上来说,机器学习是一种通过利用数据,训练出模型,然后使用模型预测的一种方法。
2.3 分类器的选择及设计
2.2.1 KNN分类原理介绍
分类器采用KNN分类,K近邻算法(K-NN)算法是一种简单但也很常用的分类算法,它也可以应用于回归计算。K-NN是无参数学习,这意味着它不会对底层数据的分布做出任何假设。它是基于实例,即该算法没有显式地学习模型。相反,它选择的是记忆训练实例,并在一个有监督的学习环境中使用。KNN算法的实现过程主要包括距离计算方式的选择、k值得选取以及分类的决策规则三部分。
2.2.2 KNN分类的决策规则
常用的分类决策规则是取k个近邻训练数据中类别出现次数最多者作为输入新实例的类别。即首先确定前k个点所在类别的出现频率,对于离散分类,返回前k个点出现频率最多的类别作预测分类;对于回归则返回前k个点的加权值作为预测值。
2.2.3 Sklearn库实现KNN分类器的方法
划分相应的训练集与测试集,调用sklearn库中的sklearn.neighbors,#创建knn类 :knn = KNeighborsClassifier()
,#训练knn :Knn.fit(X_train,y_train)
三、设计方案及步骤
3.1总体方案设计
利用Dlib库进行人脸识别与特征标定,结合嘴、眉毛、鼻子、眼睛这些人脸表情的显著特征的形状和位置变化进行定位和测量,确定它的形状、大小、距离及相互比例,进行表情识别。利用sklearn库中机器学习的算法对特征值进行学习分类。利用cv2库进行摄像头视频的采集,以及标定点位置。利用pygame库实现音频的播放等。利用numpy库对数组进行操作。
3.2详细方案设计
3.2.1利用dlib进行人脸识别
# 使用特征提取器get_frontal_face_detector
detector = dlib.get_frontal_face_detector()
# dlib的68点模型,使用作者训练好的特征预测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 利用预测器预测
shape = predictor(img, d)
# 标出68个点的位置
for i in range(68):
cv2.circle(img, (shape.part(i).x, shape.part(i).y), 4, (0, 255, 0), -1, 8)
cv2.putText(img, str(i), (shape.part(i).x, shape.part(i).y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
3.2.2 数据集的采集与建立(特征提取)
本文选择的The Extended Cohn-Kanade Dataset(CK+)表情数据库。这个数据库包括123个subjects, 593 个 image sequence,每个image sequence的最后一张 Frame 都有action units 的label,而在这593个image sequence中,有327个sequence 有 emotion的 label。是数据库是人脸表情识别中比较流行的一个数据库。该人脸数据库包括七个表情类分别是0-中性、1-愤怒、2-蔑视、3-厌恶、4-恐惧、5-高兴、6-悲伤、7-惊讶,遍历每个表情类提取每个表情类每张图片的人脸特征值,。本文采用五维特征值分别是a-嘴巴宽度与识别框宽度之比、b-嘴巴高度与识别框高度之比、c-眉毛高度与识别框高度之比、d-眉毛距离与识别框宽度之比、e-眼睛睁开距离与识别框高度之比。将提取的五维特征值按表情类保存为xls表格,并为表情数据集打标签,以便后续训练分类识别模型使用。
#使用workbook方法,创建一个新的工作簿
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
#添加一个sheet,名字为mysheet
sheet = book.add_sheet('mysheet', cell_overwrite_ok=True)
#遍历每张图片提取图片中人脸的特征值
for m in range ():
path =str(m)+'.jpg'
print(path)
im_rd = cv2.imread(path)
im_rd = cv2.resize(im_rd ,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC