1. 引言
心理学家发现,人在面对面交流时,用词语能表达的信息只占7%;说话的声调所表达的信息占38%;肢体语言(当然也包括表情)所表达的信息最多,占了55% [1] !人脸情绪识别主要靠人脸的图像信息中所包含的人的表情等信息,是基于人脸检测和识别技术的情绪识别方法 [2]。近年来,卷积神经网络(Convolutional Neural Network, CNN)由于其模型的优越性逐步被用于输入为图像或视频的计算机视觉问题 [3]。卷积神经网络是一种特别擅长处理视觉数据的神经网络结构,现有的情绪分析大多通过卷积神经网络 + 大体量数据集来提高正确率。本文没有追求大体量数据集,而是通过对面部表情的嘴巴张开程度、眉毛上扬角度两项指标进行计算分析情绪。
2. 实验准备
2.1. 研究对象
我们将从两个方面对系统进行测试,第一方面测试系统对视频是否有效,由于服刑人员在日常生活中情绪稳定,较难提取到生气画面,为说明系统可对视频进行分析,我们选取了56段网络影视片段进行试验,不分国籍不分年龄不分性别,演员丰富的面部表情更利于系统识别。第二方面测试系统情绪识别准确度,我们将fer2013数据集train中的100张angry图像、100张disgust图像、100张fear图像、100张happy图像、100张neutral图像、100张sad图像、100张surprise图像,共700张图像混合到单独的文件夹,利用系统对其进行情绪识别,统计识别出的生气图像数量。
2.2. 研究方法
1) 人脸检测
face_recognition宣称是史上最强大,最简单的人脸识别项目。据悉,该项目由软件工程开发师和咨询师Adam Geitgey开发,其强大之处在于不仅仅基于业内领先的C++开源库dlib中的深度学习模型,采用的人脸数据集也是由美国麻省大学安姆斯特分校制作的Labeled Faces in the Wild,它含有从网络收集的13,000多张面部图像,准确率高达99.38%。操作者可以直接使用Python和命令行工具提取、识别、操作人脸 [4]。使用face_recognition.face_locations方法可以选择更准确的深度学习的人脸检测模型,可以对图像或视频进行人脸检测,本系统采用默认模型CNN,通过face_recognition.face_encodings方法可以将人物面部特征数据点提取,转换为128D人脸编码 [5],人脸编码效果如图1所示。
2) 图像获取
系统使用opencv循环逐帧读取的方式对视频流进行图像获取,视频图像获取的流程主要为:系统读取素材文件夹中的网络视频,将视频流逐帧读取,对视频帧进行人脸检测、情绪识别、身份识别,若读取到空帧则说明视频播放结束。
系统使用opencv循环读取图片的方式,对测试图片进行人脸检测、情绪识别、身份识别。
3) 情绪识别
利用face_recognition.face_landmarks方法提取68个关键点 [5],关键点坐标如图2所示。将嘴巴张开程度、眉毛上扬角度两项指标与参考值对比,从而达到情绪识别的目的。
4) 人脸识别
若识别出生气的表情,系统使用face_recognition.compare_faces()方法匹配面部特征编码,将生气面部特征编码与已知身份面部特征编码进行匹配,利用两个向量的内积来衡量相似度,根据阈值识别身份,赋值姓名。系统会绘制红色方框并将人物姓名、angry标识在图片上,再将图片保存到angry_database内,建立以人物姓名为文件名的文件夹,将图片存档。一般来说生气表情并不会只出现在一瞬间,为了减少相似度,提高空间利用率,系统会间隔5帧保存。
2.3. 实验流程
实验流程如图3所示,在正式测试之前,利用人脸检测模块与情绪识别模块对fer2013数据集test中958张angry图像进行68位关键点提取,将生气时嘴巴高度、嘴巴宽度、眉毛倾斜度、眼睛睁开程度变化情况保存到异常情绪csv文件,生成折线图,确定异常情绪参考值。利用人脸检测模块对已知身份库进行面部特征点获取并保存到已知身份csv文件,以待后期身份识别。
2.4. 环境搭建
Python 3.6基本的环境搭建及安装Pycharm编辑器,其用户界面友好,提供命令提示功能,可以实时查错,极大提高了工作效率 [6]。OpenCV库是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库 [5]。我们需要利用OpenCV完成视频素材的导入、读取、显示,最重要的一点是,本系统可以移植于摄像头应用上,提高了灵活度,这对本系统应用于监狱十分重要。Dlib目前star数超过3万,是GitHub上最主流的人脸识别工具包之一,主要参考了OpenFace项目以及谷歌的facenet [7]。face-recognition人脸识别库基于dlib深度学习的模型,用LFW人脸数据集进行测试,准确率高达99.38%,face_recognition自带的函数可以检测人脸、提取68位特征点、识别人脸等功能大大降低了人脸识别开发难度 [8]。为提高运行效率、降低运算难度,我们安装NumPy、pandas、matplotlib等第三方库来编写系统。
3. 实验测试
3.1. 服刑人员产生情绪
在监狱服刑的时候,可能会产生一些情绪,首先我们就来讨论愤怒是由于客观事物与人的主观愿望相违背,或因愿望无法实现时,服刑人员内心产生的一种激烈的情绪反应,可能有恶意伤人的现象,作为狱警要十分注意这一现象,一定要做好疏导或者及时制止,从而控制整个局面。
3.2. 服刑人员产生情绪的因素
1) 环境因素
初到监狱十分不熟悉,对陌生环境的抵触感,很厌烦自己会来到这个地方,很难意识到自己之前犯下的错误,不从自身找问题,在日常生活上没有在外面的时候自由,一下子失去了重心,感觉到很大的冲击,心里无法承受这种改变,就会产生这种情绪反应。
2) 个人因素
自我否定,自卑,对自我的不接受不认可,认为自己这辈子就这样毁了,没有什么出头之日,一直陷入在一种自我反思和自我不认可中,忽视自己的优点,对未来前途没有向往,想要一直颓废下去,一直有消极情绪。
3.3. 训练数据获取
如图4所示,通过Kaggle下载fer2013数据集,选用test中的958张48 * 48像素的angry图片作为
异常情绪分析数据。如图5所示,系统读取fer2013数据集的test_angry文件夹中的958张图片,将嘴巴高度、嘴巴宽度、眉毛倾斜度、眼睛睁开程度变化情况保存为CSV文件后生成折线图。如图6所示,数据集中有306张图像由于像素放大后损坏、人物侧脸、漫画人物等原因无法使用。可识别的图像一共有652张,生成X轴是图像数量,Y轴是嘴巴高度、嘴巴宽度、眉毛倾斜度、眼睛睁开程度,通过观察变化曲线人在生气时,嘴巴宽度和眼睛睁开程度变化曲线波动并不大,综合心理学愤怒的微表情表现,判断出嘴巴高度、眉毛倾斜度是判断生气情绪的重要指标。
3.4. 标准选择
在这里用所有生成标准的方法对同一个视频进行评估实验,计算由各标准判断生成的生气图片数并比较,选择其中最精确的标准,讨论这些方法的优缺点。
1) 平均数
平均数是统计学中最常用的统计量,用来表明资料中各观测值相对集中较多的中心位置。在统计中算术平均数常用于表示统计对象的一般水平,它是描述数据集中位置的一个统计量。平均数非常明显的优点之一是,它能够利用所有数据的特征。另外,在数学上,平均数是使误差平方和达到最小的统计量,公式如式(1)所示。我们计算出生气时的眉毛斜率和嘴巴高度的平均数,用作参考标准,并运行。但是平均数也有不足之处,正是因为它利用了所有数据的信息,平均数容易受极端数据的影响。
(1)
2) 截尾平均数
由于均数较易受极端值的影响,因此可以考虑将数据进行行排序后,按照一定比例去掉最两端的数据,只使用中部的数据来求均数。如果截尾均数和原均数相差不大,则说明数据不存在极端值,或者两侧极端值的影响正好抵消;反之,则说明数据中有极端值,此时截尾平均数能更好地反映数据的集中趋势,公式如式(2)所示。但是这种方法也有不足之处,虽然去除了最大最小极端数,但对数值不能很好的利用。
(2)
3) 标准差
标准差通常是相对于样本数据的平均值,也被称为标准偏差,或者实验标准差,在概率统计中最常使用作为统计分布程度上的测量依据,能反映一个数据集的离散程度,平均数相同的两组数据,标准差未必相同。简单来说,标准差是一组数据平均值分散程度的一种度量,标准差可以当作不确定性的一种测量。一般统计使用标准差更为广泛,尤其是样本量足够大的情况下,它更能反映数据的离散程度。公式如式(3)所示。
(3)
4) 标准选择
如图7所示,分别对嘴巴高度、嘴巴宽度、眉毛倾斜度、眼睛睁开程度计算平均数、截尾平均数、标准差,系统运行结果如图8所示,在相同实验条件下,识别出的图片数越少,表示精度越高,所以选择平均数生成的值作为参考标准,从对比结果来看,由平均数生成的参考值识别出的图片数略少,所以使用平均数生成的值作为衡量异常情绪的标准。
4. 实验结果
4.1. 系统测试视频结果
如图9所示,系统从测试视频中成功测试出异常情绪。如图10所示,在angry_database文件夹下出现以个人姓名命名的异常情绪文件夹。判断异常情绪的图片以人物姓名 + 序号命名存储在个人文件夹中,监狱干警可以通过查看此文件夹来查看服刑人员的异常情绪,及时掌握服刑人员动态。
4.2. 系统精确度结果
如图11所示,系统对fer2013数据集train中700张混合图像进行情绪识别,统计识别出的生气图像数量一共为81张。从结果来看,系统识别效果也较为准确,证明了系统的有效性。
5. 服刑人员情绪调节方法
最后我们从实验中得出,服刑人员确实存在情绪波澜,这时候我们就要对服刑人员开展一定的情绪调节方法,让他们的情绪缓和,这也要注意方式方法,不然情绪反弹会适得其反。
5.1. 心理疏导法
在服刑期间多多关注服刑人员的情绪反应,提供每星期的心理咨询,为其开设一些心理活动或者是交流活动,不要一直是做同样的事情,在疏导的过程中也要注意方法,关注对方情绪转变的过程,做好记录。
5.2. 人际调节法
服刑人员在服刑期间可以安排活动让大家可以多交流,多上台表演,交流会缓解很多不良情绪,这对个人的状态,记忆,舒服感都起到了重要作用,这样很会产生多巴胺。
5.3. 音乐调节法
音乐调节法就是指借助于情绪色彩鲜明的音乐来控制情绪状态的方法。服刑人员在服刑期间,可以通过广播播放一些舒缓的音乐,运用音乐调节法时,应该因人、因时、因地、因心情的不同而选择不同的音乐。适宜的音乐,常可取得很好的效果。
5.4. 自我释放法
最好的情绪调节方法之一是运动。因为当人们在泪丧或愤怒时,生理上会产生一些异常现象,这些都可以通过运动方式,如跑步、打球、攀岩等方式,使生理恢复原状。生理得到恢复,情绪也就自然正常。所以服刑人员在服刑期间可以展开多项运动,从中自我释放掉不良情绪。这就是运动宣泄调节法。
因此,在今后,第一,我们要教会服刑人员积极处理情绪的能力,恢复能力作为一个有机整体,也要做好情绪反弹的准备。第二,对服刑人员从个体背景因素和心理因素等多个角度系统考察个体因素对情绪的影响。
6. 设计理念
关于对服刑人员情绪调节与行为制止我们的设计理念就是通过系统分析服刑人员的情绪,如果服刑人员情绪失控,就会造成很多不必要的麻烦,如若服刑人员情绪无法得到调节,就有可能发生有多意外的事情,如过激反应,这些都是不可控的因素。监狱干警可通过本系统对服刑人员进行更好的管理。
7. 未来展望
我们深知仅仅通过面部表情来判断情绪是有缺陷的,未来我们打算结合肢体动作、脑电波、心率设备等综合判断,提高情绪判别准确率,逐渐完善优化系统,增加系统情绪识别种类和判断方法,简化算法,提高精度的同时提高运行效率,添加情绪调节模块,当系统判断出服刑人员情绪低落的时候,自动运行情绪调节模块,帮助其调节情绪。
8. 结语
本系统可以实现情绪判断、人脸识别、异常情绪存档等功能。使用Python语言编写,具有较强的扩充性,Python拥有一个强大的标准库,提供了大量的第三方模块,使用方式与标准库类似。它们的功能无所不包,覆盖科学计算、Web开发、数据库接口、图形系统多个领域,并且大多成熟而稳定。本系统可应用于监狱的实时监控中,实时监测,及时反馈,后期查看。本系统通过对面部表情的嘴巴张开程度、眉毛上扬角度两项指标进行计算分析,目前只能判断出生气的情绪,虽然可以继续添加判断其他情绪,但是算法方面不够成熟,很大程度上会拖慢进程。由于疫情原因,监狱实行闭环管理,不能将系统搭载到监狱中,所以系统并没有应用到实际,一些可能出现的问题也不能得到解决。
基金项目
2021浙江省基础公益研究项目(GF21G010014)基于多源信息融合的罪犯心理健康风险测评与智能矫治系统关键技术研究。