
简介这份资源是国科大人机交互课程的大作业完整工程面向计算机、人工智能及人机交互方向的学生与自学者聚焦多模态情感识别这一典型课题可用于课程设计、期末大作业、工程实训或毕业设计的复现与借鉴。压缩包共39个文件约548.29MB包含mat原始数据与pkl预处理数据集、py与ipynb源码脚本、jpg与png实验图表以及md说明文档覆盖从数据预处理到模型训练、结果可视化的完整链路。项目围绕脑电与眼电等多模态信号展开涉及RNN、CNN及注意力机制等模型实现目录中区分原始数据、预处理数据与程序代码结构清晰便于按模块理解与复刻。目前已有119人学习关注。读者可据此获得一套可直接运行的赛题方案、可借鉴的设计报告思路与实验图表并在此基础上扩展新功能或迁移到相近课题适合具备一定Python与深度学习基础的学习者参考使用。1. 从一份人机交互大作业压缩包说起多模态情感识别到底能跑出什么如果你正在搜“人机交互大作业”“多模态情感识别”大概率是课程设计临近截止导师给的方向又偏前沿自己从零搭一套多模态模型时间根本不够。这份压缩包就是针对这个场景整理的它把多模态情感识别拆成可运行的工程结构包含数据预处理、特征提取、模型训练和推理演示几个部分适合人机交互、计算机视觉、人工智能方向的大作业或实训直接落地。它解决的不是“从零科研”而是“在有限时间内交出一个能演示、能讲清原理、能改参数的完整系统”。适合谁适合已经学过 Python 基础、接触过 PyTorch 或 TensorFlow、但没做过跨模态融合项目的同学。如果你连pip install都没跑过建议先补环境再回来。2. 多模态情感识别的技术骨架从单模态到跨模态融合2.1 为什么单模态不够用情感表达本身是跨通道的。一个人说“我没事”文本是中性但语音可能颤抖、面部可能皱眉。单文本模型只能抓语义单语音模型只能抓声学特征单视觉模型只能抓表情动作。多模态情感识别的核心逻辑就是让三个通道互相补位。常见做法是文本走 BERT 或 LSTM 提语义向量语音走 MFCC 加 LSTM 或 1D-CNN 提声学向量视觉走 ResNet 或 OpenFace 提面部动作单元然后在特征层或决策层做融合。这份资源里用的是特征层拼接加注意力加权属于工程上容易复现、效果也稳的方案。2.2 融合策略怎么选早期、晚期还是中期早期融合是在输入层直接拼原始特征优点是简单缺点是不同模态采样率不一致时对齐很麻烦。晚期融合是各模态单独出预测结果再投票或加权平均优点是容错高缺点是丢了跨模态交互信息。中期融合是在特征提取后、分类前做融合兼顾两者也是这份资源采用的方式。具体实现上它把文本、语音、视觉的特征向量各自过一层全连接降到 128 维再拼接成 384 维送进一个带残差连接的全连接分类器。这样做的原因是降维能减少模态间尺度差异残差能缓解小数据集上的梯度消失。2.3 数据预处理的三个关键参数拿到压缩包后第一件事不是急着跑train.py而是确认数据目录结构。常见结构是data/audio/、data/text/、data/video/三个子目录文件名用同一个 ID 对齐。如果导师给的是原始视频需要先用ffmpeg抽音频和关键帧。这里有个参数容易翻车音频采样率。很多预训练语音模型要求 16kHz但手机录制常是 44.1kHz不重采样直接喂进去MFCC 维度会对不上。视觉这边关键帧提取间隔建议 0.5 秒一帧太密冗余太疏丢表情变化。文本这边如果只有语音转写结果记得去掉语气词和重复词否则 BERT 的注意力会被“嗯”“啊”带偏。# 从视频抽音频并重采样到 16kHz 单声道 ffmpeg -i input.mp4 -vn -acodec pcm_s16le -ar 16000 -ac 1 output.wav # 每 0.5 秒抽一帧关键帧 ffmpeg -i input.mp4 -vf fps2 frames/%04d.jpg第一行命令里-vn表示不要视频流-ar 16000是采样率-ac 1是单声道。第二行fps2就是每秒两帧对应 0.5 秒间隔。抽完帧后视觉分支通常还要做人脸检测和对齐OpenCV 的 Haar 级联或 Dlib 的 68 点模型都行资源里默认用的是 MTCNN精度更高但速度慢一点做演示够用。3. 把压缩包跑起来环境、训练与推理的完整链路3.1 环境配置与依赖安装压缩包解压后根目录一般有requirements.txt。我一般会先建虚拟环境避免和系统里的包打架。Python 版本建议 3.8 到 3.10太高了有些旧版 PyTorch 轮子不好找。安装命令如下python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple这里指定了清华源下载快很多。requirements.txt里通常包含torch、torchaudio、transformers、opencv-python、librosa、scikit-learn。如果装torchaudio报错大概率是系统缺libsndfileUbuntu 下sudo apt install libsndfile1就能解决。Windows 下如果librosa加载音频报NoBackendError装一个ffmpeg并加到 PATH 即可。3.2 训练脚本的参数怎么改打开train.py重点看几个超参数。batch_size默认可能是 16如果你的显存只有 4GB改成 8 或 4。learning_rate常见是 1e-4 或 2e-5BERT 微调时用 2e-5 比较稳。epochs默认 50但小数据集上 20 到 30 就够多了会过拟合。fusion_dim就是前面说的 128如果数据量特别小可以降到 64。还有一个modality_dropout这是多模态训练里的一个技巧以一定概率随机丢掉某个模态强迫模型不依赖单一通道。默认 0.1 到 0.3 之间太高了学不动太低了没效果。# train.py 中关键参数片段 config { batch_size: 8, # 显存小就调小 learning_rate: 2e-5, # BERT 微调常用值 epochs: 30, # 小数据集 20-30 足够 fusion_dim: 128, # 融合层维度 modality_dropout: 0.2, # 模态随机丢弃概率 seed: 42 # 固定随机种子保证可复现 }固定seed很重要不然每次跑出来的准确率波动会让你怀疑人生。训练过程中控制台会打印每个 epoch 的 loss 和验证集准确率。如果 loss 一直不降先检查数据标签有没有对错再看学习率是不是太大。如果训练集准确率很高但验证集很低那就是过拟合加 dropout 或减层数。3.3 推理与演示怎么让导师看到效果训练完会保存一个best_model.pth。推理脚本一般是inference.py或demo.py输入一段视频或音频输出情感类别和置信度。演示时建议准备三段对比明显的素材一段明显高兴的、一段明显生气的、一段中性的。运行命令通常是这样python inference.py --input demo/happy.mp4 --model checkpoints/best_model.pth输出会类似Predicted emotion: happy, confidence: 0.87。如果置信度普遍偏低检查推理时的预处理是否和训练时一致尤其是音频采样率和图像归一化参数。很多翻车现场就是训练用 16kHz推理用 44.1kHz模型直接懵了。4. 避坑与排查多模态项目里最容易翻车的五个地方4.1 模态对齐失败文件对不上号现象训练时 loss 正常下降但验证集准确率始终在 33% 左右等于随机猜。原因三个模态的文件名没有严格对齐比如音频是001.wav文本是001.txt但视觉帧目录是001_frame/里混了别的 ID。解决写一个check_alignment.py遍历三个目录取交集打印缺失列表。我一般会在数据加载前强制做一次对齐检查不通过就直接报错退出。4.2 显存溢出不是模型太大是序列太长现象跑几个 batch 后报CUDA out of memory。原因文本序列没截断一条样本可能有 512 个 token语音特征也拉得很长。解决文本统一截断到 128 或 256语音特征按时间轴裁剪到固定长度比如 3 秒。视觉帧数也固定比如 16 帧。这样每个 batch 的张量形状一致显存占用可控。4.3 标签泄露验证集混进了训练集现象验证集准确率 99%但换一批新数据就崩。原因数据划分时没按说话人或视频 ID 划分同一个人的不同片段同时出现在训练集和验证集。解决用GroupShuffleSplit按 ID 分组划分确保同一个人只出现在一个集合里。这个坑在情感识别里特别常见因为同一人的表情和语调风格很一致模型会“认人”而不是“认情感”。4.4 过拟合训练集 loss 降到 0.01验证集不动现象训练后期训练 loss 极低验证 loss 开始上升。原因模型参数量远大于数据量或者训练轮数太多。解决加weight_decay比如 1e-4加早停策略验证 loss 连续 5 个 epoch 不降就停数据增强音频加噪声、视觉随机裁剪、文本同义词替换。资源里默认没开数据增强可以自己加。4.5 推理速度慢演示时卡成幻灯片现象导师站在旁边看你点一下运行等了半分钟才出结果。原因每次推理都重新加载模型和预训练权重。解决把模型加载放在服务初始化阶段推理时只做前向传播。如果还是慢把 BERT 换成蒸馏版的小模型或者用 ONNX 导出后推理。演示场景下速度比精度更重要先保证流畅。5. 进阶技巧用注意力可视化讲清多模态融合的故事5.1 为什么要做可视化大作业答辩时导师最常问的一句话是“你怎么证明三个模态真的融合了而不是简单拼在一起”光看准确率不够你需要把注意力权重画出来。这份资源里的融合层如果用了注意力机制通常会输出每个模态的权重系数。你可以取几条测试样本把权重画成柱状图展示模型在不同样本上对文本、语音、视觉的依赖程度不同。比如一段反讽语音文本权重低、语音权重高这就讲得通。5.2 提取注意力权重的代码实现假设模型里有一个attention模块返回weights形状为(batch, 3)。可以在推理脚本里加一个 hook 或者直接改forward返回权重。下面是一个简化示例import torch import matplotlib.pyplot as plt # 假设 model 已经加载好input_dict 是预处理后的输入 with torch.no_grad(): logits, attn_weights model(input_dict, return_attentionTrue) # attn_weights 形状 (1, 3)对应文本、语音、视觉 weights attn_weights.squeeze().cpu().numpy() modalities [Text, Audio, Visual] plt.bar(modalities, weights, color[#4C72B0, #DD8452, #55A868]) plt.title(Modality Attention Weights) plt.ylabel(Weight) plt.savefig(attention_demo.png, dpi150) plt.show()这段代码的关键是return_attentionTrue如果你的模型没这个参数就在forward里把注意力权重存到self.attn_weights推理后直接读。画出来的图放在答辩 PPT 里比堆一页公式管用。参数上dpi150保证清晰度颜色用默认的就行不用花哨。5.3 一个具体技巧用混淆矩阵定位弱类别多模态情感识别在“恐惧”和“惊讶”上容易混因为两者的语音和表情特征有重叠。跑完测试集后用sklearn.metrics.confusion_matrix画一个热力图看看哪两类互相误判最多。如果“恐惧”大量被预测成“惊讶”可以针对性补充这两类的训练样本或者在损失函数里给这两类加权重。我一般会在训练脚本里加一个class_weight参数用compute_class_weight自动算不用手动调。from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay import matplotlib.pyplot as plt cm confusion_matrix(y_true, y_pred, labelslabel_names) disp ConfusionMatrixDisplay(confusion_matrixcm, display_labelslabel_names) disp.plot(cmapBlues, values_formatd) plt.title(Confusion Matrix on Test Set) plt.savefig(confusion_matrix.png, dpi150)labels参数要显式指定不然类别顺序可能乱。values_formatd是整数显示别用科学计数法。这张图能直接告诉你模型到底在哪翻车比只看一个总体准确率有用得多。从那以后我每次带多模态项目都强制先跑一遍模态对齐检查和混淆矩阵不看到这两张图不往下走。希望这份拆解能帮你把大作业稳稳落地。本文还有配套的精品资源点击获取