目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于机器学习的人脸微表情自动识别
课题背景和意义
微表情是指短暂且不易察觉的面部表情,通常反映出个体的真实情感状态。在安全监控、心理研究和人机交互等领域,微表情识别具有重要的应用价值。通过对监控视频中人脸微表情的分析,可以为情感识别、威胁检测和情绪分析提供有力支持。随着深度学习和计算机视觉技术的发展,利用这些技术进行微表情识别的研究,能够提高检测的准确性和实时性。研究该课题,不仅具有重要的学术意义,还有助于推动智能监控系统的智能化和人性化发展。
实现技术思路
一、算法理论基础
1.1 卷积神经网络
CNN卷积神经网络具有权值共享、局部连接和稀疏交互的特性,造就了高效的特征提取和分类。特征提取无需人为干预,得益于卷积核的自适应调节。卷积操作为关键性操作,即加权求和。图像由无数像素点组成,卷积核中的像素点为权重,卷积核与输入图像不断移动步长做点乘运算,输出特征值组成特征图。输入图像共享卷积核中的权重,卷积核按照步长依次运算,卷积层的堆叠通过权值共享减少了参数量和计算量。局部连接意味着每个神经元只与局部相连,局部相连代替全连接减少参数量和计算量。限定层与层之间神经元的连接数,即稀疏交互,避免全连接增加参数量。感受野的大小与提取的语义直接相关,当读取到的区域较大时,提取全局特征;读取区域较小时,提取细节特征。CNN由输入层、输出层、隐藏层组成,隐藏层包括卷积、激活函数、池化、全连接层。
标准卷积包括二维单通道卷积、二维多通道卷积和三维卷积。二维单通道卷积只有一个通道。二维多通道卷积对3D体积数据分别对R、G、B三个通道卷积,再逐通道合并。三维卷积可以在图像的高度、宽度、通道上进行卷积。卷积操作包括一维、二维、三维卷积,一维卷积一般应用于信号处理,二维卷积在图像处理、机器视觉中常见,三维卷积应用于视频处理,卷积核为三维卷积核在三维空间中做卷积运算。卷积运算在神经网络中的主要作用为提取特征,提供复杂特征信息供神经网络学习。
池化操作与卷积操作不同:一是卷积操作在滑动过程中重叠部分产生冗余信息,池化操作根据步长分割为不同操作块,不存在重叠部分,也不会引入新参数;二是卷积操作目的是提取特征信息,池化操作的目的是降维。虽然池化操作减小输出特征图尺寸,但保留关键性信息;三是卷积操作普遍为二维卷积,而池化操作包括平均池化和最大池化。假设步长为2,左侧为原输入特征图,右上为平均池化,右下为最大池化。平均池化操作是在原4×4输入区域内,每2×2局部区域的平均值为新特征图的特征值;最大池化操作是在原4×4输入区域内,每2×2局部区域的最大值为新特征图的特征值。
全连接层将输入多维数据压缩为一维数据,神经元与前一层输出全部相连接,将卷积和池化得到的特征在全连接层综合,输出分类。在训练中,神经元节点与前一层节点的权重通过反向传播不断优化。全连接层由于神经元之间的全部连接导致参数量过多,容易出现过拟合现象,即模型在特定训练数据集上分类正确率高,但在新的数据集上正确率低。为防止过拟合问题,全连接层后一般添加dropout等。
VGG19网络模型是一种经典的深度学习架构,主要用于图像分类和特征提取任务。该模型由19层可学习参数的层组成,具体包括16层卷积层、5层池化层和3层全连接层。VGG19的设计理念是通过堆叠多个小卷积核(3x3)来增加网络的深度,从而提高模型的表达能力和特征提取能力。在微表情识别任务中,VGG19网络凭借其深层结构,能够有效捕捉到微表情的细微变化。微表情往往持续时间短且变化幅度小,因此需要强大的特征提取能力来识别这些细微的面部表情。VGG19通过层次化的特征提取,可以提炼出从低级(如边缘和纹理)到高级(如面部结构和情感)的信息,使其在微表情识别中表现出色。
VGG19的卷积层使用ReLU激活函数,能够加快收敛速度并改善模型的非线性特征。池化层则通过下采样操作,减少特征图的空间维度,从而降低计算复杂度,提高模型的鲁棒性。为了训练VGG19网络,通常使用大规模的图像数据集进行预训练,这样可以使模型在面对微表情数据时具备良好的初始参数,进而提升识别效果。
1.2 注意力机制
微表情识别系统中的注意力机制可分为自底向上的注意力和自顶向下的注意力机制。自底向上的注意力机制通过优先关注低等级语义,循序渐进地关注高等级语义;而自顶向下的注意力机制则是先关注高等级语义,再关注低等级语义。从实现形式的角度,注意力机制可分为软注意力机制和硬注意力机制。软注意力机制的权重值在[0,1]区间内,通过全连接层计算权重分布,且这些注意力权重相加之和为1。通过注意力分布计算N个输入信息的加权平均,实现输入特征信息的汇总。相较于软注意力机制,硬注意力机制减少了计算量,专注于特定区域或局部进行计算,即输入的子集,但其缺点在于无法进行反向传播。
注意力机制可分为通道注意力机制和空间注意力机制等。注意力机制在深度学习中根据任务对图像给予不同的关注度,获取信息的价值也因此不同。SE注意力机制包括压缩模块、激励模块和注意力模块。压缩模块主要用于融合全局上下文信息,图像在VGG网络中经过卷积后得到C×H×W的表情特征,每个通道代表一个类别特征,经过全局平均池化,将H×W的二维向量压缩为1×1的实数值,以此保留全局空间信息。激励模块对每个通道输出对应的权重,将原表情特征图与权重相乘,输出新的特征图,实现特征的重新校准。
CBAM注意力机制中的通道注意力机制采用最大池化和平均池化对每个通道进行计算,从C×H×W变为1×1×C。通过多层感知机操作输出特征向量,并将两者相加,使用Sigmoid激活函数生成注意力权重,这些权重用于初始输入特征图的点乘运算,从而得到新的特征图。CBAM中的空间注意力机制则基于通道对输入特征图F进行平均池化和最大池化操作,生成两个同类型维度的待连接张量序列,并在同一维度上拼接。经过卷积层协调通道维度后,激活函数为Sigmoid,输出0-1的权值。最后,权值与特征图F作哈达玛积运算,得到最终输出的新特征图。
二、 数据集
2.1 数据集
图像采集主要采用自主拍摄和互联网采集两种方式。使用相机并选择合适的拍摄环境和背景,确保光线均匀,避免阴影和反射对表情的影响。通过精心设计的拍摄方案,邀请多样化的受试者,以获取不同年龄、性别和种族的面部微表情样本。通过公开图库、社交媒体平台和视频资源,收集多种情境下的人脸微表情图像,确保数据集的丰富性和多样性。使用标注工具进行labeling。标注过程涉及对每一帧图像中微表情的识别和标记,通常会根据情感类别(如快乐、惊讶、愤怒等)进行分类。
2.2 数据扩充
数据集通常会被划分为训练集、验证集和测试集,常见的比例为70%用于训练,15%用于验证,15%用于测试。这样可以保证模型的训练效果和泛化能力。为了增强数据集的多样性和鲁棒性,研究团队还会进行数据扩展,包括图像的旋转、缩放、裁剪、翻转等操作,增加样本的数量和多样性。
三、实验及结果分析
3.1 实验环境搭建
3.2 模型训练
对收集到的图像数据进行准备与预处理。这一过程包括数据清洗、图像归一化和数据增强等步骤。通过数据清洗,去除低质量或模糊的图像,确保训练数据的质量。图像归一化则将所有输入图像的像素值调整到相同的范围(例如[0, 1]),有助于提高模型的收敛速度。数据增强技术通过对图像进行旋转、翻转、裁剪等操作,增加样本的多样性,提升模型的泛化能力。
from torchvision import transforms
# 数据增强和归一化
transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(10),
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
选用VGG19网络模型作为基础架构,并结合SE通道注意力机制和空间注意力机制。VGG19网络的深层特征提取能力能够有效捕捉细微的面部表情变化。SE通道注意力机制通过计算每个通道的权重,突出重要特征,抑制冗余信息,而空间注意力机制则通过对空间特征进行关注,帮助模型聚焦于图像中的关键区域。两者的结合能够显著提升微表情识别的准确性。
import torch
import torch.nn as nn
from torchvision import models
# 构建VGG19模型并添加SE通道注意力机制
class VGG19WithAttention(nn.Module):
def __init__(self):
super(VGG19WithAttention, self).__init__()
self.vgg19 = models.vgg19(pretrained=True).features
self.se_attention = SEAttentionModule() # 假设已定义SE注意力模块
self.fc = nn.Linear(512, num_classes) # num_classes为分类数量
def forward(self, x):
x = self.vgg19(x)
x = self.se_attention(x)
x = x.view(x.size(0), -1) # 展平
x = self.fc(x)
return x
在注意力机制之后,加入批归一化(BN)层,旨在加速模型的训练并提高稳定性。BN层通过对每一层的输入进行标准化处理,使其均值接近0,方差接近1,从而减轻内部协变量偏移的问题。在微表情识别任务中,BN层能够显著提高模型的收敛速度,并降低过拟合的风险。
class VGG19WithAttentionAndBN(nn.Module):
def __init__(self):
super(VGG19WithAttentionAndBN, self).__init__()
self.vgg19 = models.vgg19(pretrained=True).features
self.se_attention = SEAttentionModule() # 假设已定义SE注意力模块
self.bn = nn.BatchNorm1d(512) # 假设特征维度为512
self.fc = nn.Linear(512, num_classes)
def forward(self, x):
x = self.vgg19(x)
x = self.se_attention(x)
x = x.view(x.size(0), -1)
x = self.bn(x) # 加入批归一化
x = self.fc(x)
return x
使用交叉熵损失函数和优化算法(如Adam或SGD)进行训练。训练过程中需监控模型在验证集上的性能,以防过拟合。每个epoch后,评估模型的准确率和损失值,并根据需要调整学习率和其他超参数,优化训练过程。
import torch.optim as optim
# 模型训练示例
model = VGG19WithAttentionAndBN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练过程
for epoch in range(num_epochs):
model.train()
for images, labels in train_loader:
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 验证模型性能
evaluate_model(model, val_loader) # 假设已定义评估函数
海浪学长项目示例:
最后
我是海浪学长,创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!