前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导: https://blog.csdn.net/qq_37340229/article/details/128243277
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的人脸面部表情识别系统
1.课题背景和意义
人类的面部表情是一种非常重要的非语言信息传递方式,能够反映个体的情感状态和内心体验。通过观察和理解他人的面部表情,我们可以推断他们的情绪状态,从而更好地与他们进行沟通和交流。
2.实现技术思路
2.1表情识别流程
人脸表情识别的主要步骤有人脸日标检测、表情特征提取和表情分类。对于待分类的表情图像,先将图像中的人脸检测出来,再通过图像处理技术对表情图像进行处理,然后利用卷积操作提取图像中的表情特征信息,再利用分类器将这些表情特征进行分类,最终实现人脸表情识别。
2.1.1表情图像输入
表情图像输入是进行人脸表情识别的前提条件。没有足够的表情样本,神经网络也得不到充分训练从而实现表情识别,目前,表情数据一般通过 4 种方式获取:利用搜索引擎搜集表情图像,截图视频中的人脸表情,利用相机拍摄以及使用目前已经公开的公共数据集。包含213 副标准表情图像,覆盖愤怒、高兴、悲伤、惊讶、厌恶、恐惧和中性 7 类人脸表情。
2.1.2人脸目标检测
人脸日标检测是进行表情识别的一个必要环节,若图像中不存在人脸,那么这张图像就不具备表情特征信息,也无法进行表情分类。人脸检测工作大致分为以下两个步骤第一,利用算法确定图像中是否有人脸区域的存在:第二,如果有人脸,就将人脸的位置估计出来。
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
if len(faces) == 0:
# 图像中不存在人脸,返回空列表
return []
detected_faces = []
for (x, y, w, h) in faces:
detected_faces.append((x, y, x+w, y+h))
图像预处理:
图像预处理关乎到表情识别最终结果的好坏。这一步骤的主要目的就是尽量去除掉表情图像中与人脸表情无关的部分,从而使卷积神经网络提取特征时能够提取到更多有关人脸表情的特征信息,而不是背景环境或头发等无关的干扰信息。图像进行预处理对训练神经网络具有重要的意义。
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
face_image = image[y:y+h, x:x+w]
resized_face_image = cv2.resize(face_image, (100, 100))
return resized_face_image
提取人脸表情特征:
当前,在进行人脸表情特征提取时通常使用卷积神经网络来实现,利用卷积核对特征图像进行卷积计算,提取出有关表情的特征信息,通常来说,卷积核个数越多,卷积网络越深,能提取到的特征信息也越多,但也会加重网络退化的风险,因此,合理的网络设计直接决定最终的分类结果。
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(128, activation='relu'))
2.1.3情绪特征分类
网络通过卷积操作提取到表情特征后,通常会在最后一层对提取到的特征信息进行分类,判断特征信息属于哪个分类,这也是表情分类的最后一个步骤。在卷积神经网络中,通常使用 sofmax 函数对表情特征进行最终的归类。softmax 函数是最常见的分类函数它简化了统计的类概率与ground-truth 分配期间的交错。
model.add(layers.Flatten())
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(7, activation='softmax')) # 使用softmax函数进行分类
2.2卷积神经网络
2.2.1注意力机制
在深度学习中,注意力机制可以被看作是动态权重调整的过程,依据图像上的不同特征对于任务的重要性,将重要特征的权重调高,将非重要特征的权重降低,以此来实现“集中注意”这一目的。注意力机制的发现使得多种图像任务有了更加优秀的表现,包括但不限于照片分类、目标检索、3D 视觉、多模态任务和自我监督学习等等。
2.2.2多尺度非对称残差神经网络
以 ResNeXt50 网络为基础,结合多尺度特征融合、SoftPool 和非对称卷积,设计出基于多尺度特征融合的 AC-SP-ResNeXt50 网络。多尺度特征融合层为网络的第一层卷积结构,使网络以多个感受野采集特征信息,再将非对称卷积模块融入残差结构中,构成非对称残差模块,将 SoftPool 作为本网络的池化层,尽可能地减少输入特征信息的损失。
fused_feature = multiscale_fusion(input_tensor)
base_model = tf.keras.applications.ResNeXt50(weights='imagenet', include_top=False, input_tensor=fused_feature)
# 将非对称卷积模块融入残差结构中
residual_output = asymmetric_residual_block(base_model.output)
# SoftPool作为池化层
pooled_output = layers.SoftPool()(residual_output)
# 添加全连接层和输出层
x = layers.Flatten()(pooled_output)
x = layers.Dense(128, activation='relu')(x)
output = layers.Dense(num_classes, activation='softmax')(x)
图像输入网络后首先经过 MFFC 层进行特征提取,再经过SoftPool 池化后进入到添加了 ACBlock 的残差网络中。
在原 EfficientNetV2 中增加多尺度层,将部分池化方式改为 SoftPool 池化,并将原始网络中的残差结构以非对称卷积残差结构替换,为了增加网络在提取特征时对关键特征信息的关注度,增加空间注意力机制,提升网络对表情特征信息的关注度,进而提升网络性能。根据硬件条件及实验验证,优化网络结构,调整网络层数、从整体上优化网络性能。
input_shape = (224, 224, 3)
input_tensor = tf.keras.Input(shape=input_shape)
multiscale_features = multiscale_layer(input_tensor)
residual_output = asymmetric_residual_block(base_model.output)
attention_output = spatial_attention(residual_output)
x = layers.Flatten()(attention_output)
x = layers.Dense(128, activation='relu')(x)
output = layers.Dense(num_classes, activation='softmax')(x)
2.3模型训练
在进行神经网络训练时,为增加表情图像的样本数量,防止出现过拟合问题,通常会将数据集中的每一类表情图像进行翻转、放缩、随机裁剪等数据增强处理。
改进后的网络对每一类表情的分类更加准确,并且除“恐惧”之外,其余六种表情类别的识别准确率都有所提升,表明识别效果更好。
为了保证大部分提取的特征来自于人脸区域,减少无关因素的干扰,从图像的中心区域裁剪人脸区域,这更有利于表情特征的分析。最后,在训练和Adam优化器之前对数据进行归一化处理。通过归一化,激活函数有一个更合理的值,梯度可以很好地扩散,模型的收敛速度可以加快。初始学习率为 0.001,批次(batch size)大小为32。
完整的二分法运算过程:蓝圈表示最初的1 层和50 层,红圈表示二分法运算可以继续,黄圈表示二分法运算停止。可以看出,当一维卷积的卷积核大小为 1 的层数为 16 时,网络效果是最佳的。
随着网络层数的增加,网络的整体性能也在提高。 即使在网络层数增加的情况下,也能实现对关键特征注意力的大幅提升。通过以上实验,可以清楚地知道,采用 G-ECA 的网络要比采用 ECA 的网络好。
3.实现效果图样例
我是海浪学长,创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!
最后
版权归原作者 HaiLang_IT 所有, 如有侵权,请联系我们删除。