多模态生理信号情感识别 附代码+报告

  • 课题背景

  • 主要参考文献和方法阐述

  • 主要工作

  • 问题和总结

完整代码:https://download.youkuaiyun.com/download/qq_38735017/87382455

课题背景

1.目标

本任务的主要目标是对在提取了交互者的生理信号下,对交互做出情感类的判别,所以这里的情感识别主要指的还是分类问题。本任务还是一个比较具有实时性的任务,主要是仅仅基于 1 秒的信号进行分类。

2.数据集

本任务提供了两个数据集:DEAP(http://www.eecs.qmul.ac.uk/mmv/datasets/deap/readme.html)和 SEED(http://bcmi.sjtu.edu.cn/home/seed/download.html),下面分别对这两个数据集做简要描述:

  1. DEAP: DEAP 数据集是基于 32 个实验对象随机观看了 40 个 1 分钟左右的音乐视频,记录了实验对象的生理信号,并且给出了三个方面的情感评价,分别是:Valence(效价)、Arousal(唤醒度)、Dominace(支配度?),分别用 1~9 的整数表示。记录的生理信号经过预处理(下采样合并通道等方式)有 40 个通道,其中前 32 个通道是脑电 EEG 信号,33、34 通道分别是眼动 EOG 信号,剩下的是其他生理信号(本作业没有采用)。 DEAP 数据集所产生的分类目标是 3 个二分类问题。

  1. SEED: SEED 数据集的实验对象是 15 个人,每个人观看了 24 个视频并记录生理信号,每个视频(约为 4 分钟)具有一个持续单一的情绪,用这个情绪来作为分类的 Gound truth。总共有 4 个类别的情绪:中立、悲伤、害怕以及高兴。记录的生理信号分别是 62 个通道的 EEG 信号 + 前额眼电信号。在 SEED 识别中,本实验仅仅用了 EEG 信号,原因是对于经过预处理的眼电信号,并没有找到合适的方法加入网络。 SEED 数据集的分类目标是 1 个四分类问题。

可以看出 SEED 数据集的分类目标较 DEAP 数据集的分类目标难一些。


主要参考文献和方法阐述


EEG 信号特征提取:

我们阅读的文章范畴主要是利用深度学习来解决识别问题,利用深度网络来解决这个问题主要的原因在于卷积神经网络的特征提取能力。由于处理的信号是既又空间域信息又有时间域信息,所以网络的构建一般是将空间域和时间域提取的信息进行融合,主要网络结构大致如下:

  1. 2dCNN 并联 1dLSTM:利用卷积网络来提取空间信息同时利用 LSTM 网络来提取时域信息,最后将特征进行融合进而做分类。

  1. 2dCNN 串联 1dLSTM:利用卷积网络逐帧提取空间域信息得到特征序列,并将特征序列利用 LSTM 进行特征提取。

  1. 3dCNN:将时域信息也采用 CNN 做提取。 我们最后选择 2dCNN 并联 1dLSTM 作为基本模型,并基于它进行了初步实验。 参考文章: 1.https://ieeexplore.ieee.org/document/7822545/ 2.http://arxiv.org/abs/1708.06578 3.https://arxiv.org/abs/1704.08619

多模态特征融合:

依据文章(https://dl.acm.org/citation.cfm?id=2832411)里的结论,即眼动信号和 EEG 信号成某种程度上的互补关系,我们的多模态实验主要基于的是眼动数据 EOG。而多模态融合思路主要采用了特征层的融合,将 EEG 和 EOG 分别提取特征后在某一层进行 concatenation。


主要工作


我们的主要工作如下:

  • DEAP 和 SEED 数据预处理

  • 实验一:验证模型结果

  • 实验二:模型改进-利用分离卷积提取时域信息

  • 实验三:模型改进-利用 Attention 提取时域信息

  • 实验四:模型探索-探索 3 个模型的泛化能力

数据预处理:

数据预处理的主要工作在于将 EEG 信号转为二维矩阵形式从而用 2dCNN 做特征提取、对 EEG 的 basemean 处理(文章中有提到,仅限于 DEAP)、对 DEAP 和 SEED 的差异处理以及对眼动数据的预处理。

1.EEG:$1D\Rightarrow2D$

将 EEG(一维信号)转化为二维信号是一个目前比较主流的做法,这个做法的原因在于采取 EEG 信号的传感器是分布在测试对象的大脑上的,可以直觉的认为大脑相同区块的 EEG 信号具有相当的关联性,而如果直接处理一维 EEG,就相当于没有给网络加入这样一个关联性先验。这会迫使网络自己去找邻域相关性,结果不会太好。利用二维矩阵的表达(按照传感器的位置排列)会使得网络能得到这种邻域相关性。 由于 DEAP 和 SEED 对 EEG 信号传感器布置都采用的是标准的 $10-20$系统,所以根据论文中的方法,设计了一个$9\times9$的矩阵来容纳所有的传感器(这个矩阵是比较稀疏的,特别是对于只采用了 32 个通道脑电信号的 DEAP 数据集,不知道这种稀疏性会不会影响特征提取的结果)。具体的脑电图和二维矩阵示例(DEAP 为例)如下:

2.DEAP 与 SEED 数据集差异

差异主要在,DEAP 数据集的经过采样后的时间域长度是一致的,并且 DEAP 数据集提前对每个测试对象录了一个 3 秒的没有刺激 EEG 信号,在实际处理中,可以利用 BaseMean 的方法对剩余 EEG 信号做去噪,这会使得准确率提升。然而上述数据优点在 SEED 中都没有,这也造成了预处理的差异。

3.对眼动数据的预处理

我们多模态只是在 DEAP 数据集上进行了实验,但是 DEAP 上的眼动数据价值并不大,进行预处理的时候也仅仅是按照 128 帧进行分块。

验证模型结果

为了对比两个数据集上的结果,在 DEAP 上我们没有采用论文中的 BaseMean 方法来去除 EEG 噪音,得到的部分结果如下:

DEAP结果:

SEED结果:

可以看出,实验在SEED上结果并不好,我们对结果进行了一定分析,推测可能是四分类使得问题变得比二分类复杂了,从而结果自然下降了。(初步结论)

实验二-利用分离卷积提取时域信息

在利用 keras 复刻论文中的网络时,利用了分离卷积的方法来处理时域信息,即,将 128 帧的时间轴视为通道(channel),做分通道的卷积(采用固定大小的相同个数的卷积核在不同通道(帧)上做卷积),进而再时间域上进行融合。 用分离卷积来代替原始的 CNN(直接将 2d 信息提取完之后做 concatenation)取得了比原来更好的效果。和论文中一样,我们对单个人的样本做了验证,epoch 设置为 20,每个 epoch 设置了 15 个 batch,得到的部分结果如下:

可以看到这个结果是非常好的,仅仅6个epochs就达到收敛到96%(比原文做的实验结果要高),这个结果是有一定问题的,后面会提到。 关于分离卷积,

实验三-利用注意力机制来提取时域信息

由于任务目标的实时性,即对 1 秒(DEAP 数据集的 128 帧)做情感分类,所以时域信息的密度非常高。受到这个想法的启发,我们试着将注意力机制用来提取时域信息。之所以用注意力机制的原因(或者说注意力比 LSTM 网络更有优势的地方)在于,LSTM 网络本质上仍然是序列识别,即要受限于序列的长度限制,对于相隔步长比较长的关系提取能力不强(即使 LSTM 已经在 RNN 的基础上加入了长时间记忆力)。而注意力机制,本质上就是去寻找全局的关系,具体应用到时间轴上,完全不受限制于两帧图像间的长度限制,非常适合做短时间任务,因为短时间任务往往各个帧都高度相关。 这里我们采取的是注意力表征(即注意力网络)作为时域特征提取,网络架构是先用 CNN 网络提取空间域的高层语义表征,后根据这些特征逐通道(总共 13 个通道)的加入 attention 网络,做时域特征提取。具体网络的计算步骤不在此详述,可以参照文章:https://arxiv.org/abs/1706.03762 具体在 DEAP 上的实验结果如下:

可以看出结果也相当不错,不过,和上面一样,这个结果仍然是有一定问题的。

实验四-探索 3 个模型的泛化能力

对于这个任务,在实际应用场景中,往往是希望能够利用一个训练好的模型去识别一个陌生人的情绪,所以这就对模型的泛化性能提出了很高的要求。我们也分别对原始模型、分离卷积模型和注意力模型的泛化性能进行了一定程度的探索。泛化能力主要是在训练集和测试集的划分上,我们先试验了 3 个目标作为训练集另一个目标作为测试集,测试结果三个模型都集中在测试准确率在 50%-60%,而训练集已经到达了 95% 以上,明显可以说明模型过拟合了。但是,在加入了常用的正则化方法之后(Dropout 层、参数的二范正则),效果的提升并不特别明显。结果如下:

我们又试验了一个人作为测试集,一个人作为测试集,结果同样不好,如下:

后来我们发现,前面的良好结果是建立在分训练集和测试集之前进行shuffle的结果,这就导致了同一个人观看的40个视频的数据被打乱了,即训练样本的多样性增加,如果我们假设同一个人观看一个视频的EEG信号近似,那么这种做法相当于让模型"见了"很多测试集中的样本的紧邻样本。这也就间接说明了模型对同一个测试样本的泛化能力都是很有限的,后来进行的原始模型试验也证明了这个结论,在事前不对数据集进行shuffle的情况下,预测准确率也仅仅维持在50%左右,明显过拟合(即使加入了BaseMean预处理)。

所以,我们初步的得出结论,目前的模型的泛化性能实在有限,而仅仅用 dropout 等正则化技巧并不能弥补这种过拟合现象。我们认为解决方案仍然在给网络加入先验信息这个步骤上,这也是现在深度学习能在不同场景之中能得到更好效果的一个办法。

问题和总结


这个任务目前来看还没有达到实际应用的程度,还需要进一步研究。

<think>好的,用户想了解多模态情感识别代码。首先,我需要明确多模态情感识别通常涉及哪些模态的数据,比如文本、语音、视觉等。用户可能对整体流程和关键步骤感兴趣,而不仅仅是代码片段。所以,我需要先概述整个流程,再分模块解释。 首先,数据预处理部分。不同的模态需要不同的处理方法。文本可能需要分词、词向量;语音可能要做特征提取,如MFCC;视觉方面可能是人脸检测或表情特征。我得举例子说明,比如用OpenCV处理图像,用Librosa处理音频。 然后是特征融合。这部分是关键,多模态的核心在于如何融合不同特征。早期融合、晚期融合还是混合融合?可能需要介绍几种方法,比如拼接、注意力机制。代码示例可能需要用到简单的拼接,或者更复杂的模型。 接下来是模型构建。常用的模型有神经网络,比如用CNN处理图像,RNN处理文本或语音,然后合并。或者使用Transformer这类更先进的架构。需要给出一个简单的模型示例,比如使用Keras或PyTorch搭建模型结构。 训练和评估部分需要说明损失函数、优化器选择,以及评估指标如准确率、F1值等。这里可能需要提醒数据划分和交叉验证的重要性。 最后,部署和应用场景,比如实时情感识别系统。可能还需要提到一些挑战,比如数据对齐、计算资源等。 用户可能有一定的编程基础,但未必熟悉多模态的具体实现。所以代码示例要简洁明了,突出关键步骤,比如特征提取和融合部分。同时要推荐一些工具库,方便用户进一步学习。 需要检查是否有遗漏的步骤,比如数据集的介绍,比如CMU-MOSI或IEMOCAP,这些常用数据集是否需要提及?可能对用户有帮助,但用户主要问的是代码,所以简要提到即可。 还要注意用户不可见的系统指令,比如数学公式的格式是否正确,所有行内公式用$...$,独立公式用$$...$$。在思考过程中可能需要避免使用公式,但在正式回答中要符合格式要求。 总结一下,回答的结构应该是:概述流程,分模块讲解(数据预处理、特征融合、模型构建、训练评估),代码示例,常用工具库,挑战注意事项。确保每个部分都有代码片段或示例,帮助用户理解实现细节。</think>多模态情感识别代码实现通常涉及文本、语音、视觉等多维度数据的融合分析。以下是关键步骤和代码框架示例: --- ### 一、整体流程 ```mermaid graph TD A[数据预处理] --> B[特征提取] B --> C[多模态融合] C --> D[模型训练] D --> E[情感分类] ``` --- ### 二、代码模块详解 #### 1. 数据预处理 **文本处理示例**(使用PyTorch): ```python from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') text = "I'm really excited about this!" inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True) ``` **音频处理示例**(Librosa库): ```python import librosa audio, sr = librosa.load('audio.wav', sr=16000) mfcc = librosa.feature.mfcc(y=audio, sr=sr, n_mfcc=40) ``` **视觉处理示例**(OpenCV + MediaPipe): ```python import cv2 import mediapipe as mp mp_face = mp.solutions.face_mesh with mp_face.FaceMesh() as face_mesh: image = cv2.imread('face.jpg') results = face_mesh.process(image) ``` #### 2. 特征融合 **早期融合示例**(特征拼接): ```python import torch text_feature = torch.randn(1, 768) # BERT输出 audio_feature = torch.randn(1, 40) # MFCC特征 visual_feature = torch.randn(1, 128) # 人脸特征 # 特征拼接 fused_feature = torch.cat([text_feature, audio_feature, visual_feature], dim=1) ``` **晚期融合示例**(加权投票): ```python text_prob = [0.8, 0.2] # 文本模型预测概率 audio_prob = [0.6, 0.4] visual_prob = [0.7, 0.3] final_prob = 0.4*text_prob + 0.3*audio_prob + 0.3*visual_prob ``` #### 3. 模型架构(PyTorch示例) ```python import torch.nn as nn class MultimodalModel(nn.Module): def __init__(self): super().__init__() self.text_lstm = nn.LSTM(768, 128) self.audio_cnn = nn.Conv1d(40, 64, kernel_size=3) self.fusion = nn.Sequential( nn.Linear(128+64+128, 256), nn.ReLU(), nn.Dropout(0.5) ) self.classifier = nn.Linear(256, 2) def forward(self, text, audio, visual): text_out, _ = self.text_lstm(text) audio_out = self.audio_cnn(audio) combined = torch.cat([text_out[-1], audio_out.mean(2), visual], dim=1) return self.classifier(self.fusion(combined)) ``` #### 4. 训练循环 ```python model = MultimodalModel() criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=1e-4) for epoch in range(10): for text, audio, visual, labels in dataloader: outputs = model(text, audio, visual) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() ``` --- ### 三、关键工具库 | 工具库 | 用途 | 文档链接 | |--------------|-----------------------|-----------------------------------| | OpenCV | 视觉特征提取 | https://opencv.org | | Librosa | 音频处理 | https://librosa.org | | Transformers | 文本特征提取 | https://huggingface.co | | PyTorch | 深度学习框架 | https://pytorch.org | --- ### 四、挑战优化 1. **数据对齐**:多模态数据的时间同步问题 - 解决方法:动态时间规整(DTW)算法 2. **模态缺失**:部分模态数据不可用时如何保持性能 - 解决方法:生成对抗网络(GAN)补全缺失模态 3. **计算效率**:多模态模型参数量大 - 优化方案:使用跨模态注意力机制 --- ### 五、应用示例代码 实时视频情感分析片段: ```python import cv2 from fer import FER detector = FER() video = cv2.VideoCapture(0) while True: ret, frame = video.read() emotions = detector.detect_emotions(frame) dominant_emotion, score = detector.top_emotion(frame) cv2.putText(frame, f"{dominant_emotion}:{score:.2f}", (10,50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2) cv2.imshow('Live Emotion Detection', frame) if cv2.waitKey(1) == 27: break video.release() cv2.destroyAllWindows() ``` --- 通过合理设计特征融合策略和模型架构,结合具体场景选择优化方法,可以构建有效的多模态情感识别系统。建议从公开数据集(如CMU-MOSI、IEMOCAP)开始实践。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员奇奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值