前言
多模态情感分类是一项综合利用文本、音频和图像信息预测情感类别的任务。这种方法试图结合多种数据模态的特性,提供更加鲁棒的情感识别能力。在这篇博客中,我们将分享一段多模态情感分类的完整代码,结合关键概念、特征提取方法以及模型训练与评估的具体步骤,带领大家深入理解多模态分类背后的原理。
什么是多模态情感分类?
多模态情感分类是一种机器学习任务,它通过处理和融合多种数据模态(如文本、音频、图像),预测样本的情感类别。典型的应用场景包括:
文本情感分析:分析语句、评论的情感倾向(正面、中性或负面)。
音频情感分析:从语音数据中提取情感信息(愤怒、高兴、悲伤等)。
视觉情感分析:通过人脸表情或肢体动作识别情感。
融合多种模态数据的优势在于,它能捕捉单一模态中无法体现的情感特征。例如,在一段语音中,“高兴”的情感可能表现在语气(音频)中,而语音的语义信息(文本)则表明“愤怒”。结合两者可以显著提升分类的准确性。
核心步骤与实现
实现多模态情感分类的步骤包括:
文本特征提取(使用 TF-IDF)。
音频特征提取(使用 MFCC)。
图像特征提取(使用 ResNet50)。
多模态特征的融合。
训练分类模型并评估其性能。
以下将逐步展示代码并解释每一步的实现原理
文本特征提取
在文本处理中,常用的方法包括 Bag of Words 和 TF-IDF。在这段代码中,我们使用 TF-IDF 提取文本特征。
TF-IDF 的公式:
TF-IDF
(
t
,
d
)
=
TF
(
t
,
d
)
×
IDF
(
t
)
\text{TF-IDF}(t, d) = \text{TF}(t, d) \times \text{IDF}(t)
TF-IDF(t,d)=TF(t,d)×IDF(t)
其中:
TF
(
t
,
d
)
:
\text{TF}(t,d):
TF(t,d):词
t
t
t在文档中
d
d
d中的出现频率。
IDF
(
t
)
:
\text{IDF}(t):
IDF(t):词
t
t
t的逆文档概率,用公式表示为:
IDF
(
t
)
=
log
(
N
+
1
DF
(
t
)
+
1
)
+
1
\text{IDF}(t) = \log \left( \frac{N + 1}{\text{DF}(t) + 1} \right) + 1
IDF(t)=log(DF(t)+1N+1)+1
N
N
N为文档总数,
D
F
(
t
)
{DF}(t)
DF(t)表示包含词
t
t
t的文档数量
核心代码如下:
% 创建词袋模型并提取 TF-IDF 特征(训练集)
bag = bagOfWords(tokenizedDocument(textDataTrain));
tfidfTrain = tfidf(bag); % 训练集 TF-IDF 特征
% 计算 IDF 权重
% 将测试集编码为词频特征
encodedTest = encode(bag, tokenizedDocument(textDataTest));
% 手动应用 IDF 权重到测试集
% 保存 TF-IDF 特征
textFeaturesTrain = tfidfTrain;
textFeaturesTest = tfidfTest;
音频特征提取
音频特征提取使用了 MFCC(Mel频率倒谱系数),它是语音信号处理中一种常用的特征,用于捕捉语音的频谱包络。
MFCC 的关键步骤:
通过快速傅里叶变换(FFT)计算频谱。
将频谱映射到 Mel 频率尺度。
对 Mel 频谱取对数。
进行离散余弦变换(DCT)获得系数
核心代码如下:
audioFolder = 'emoVideo';
audioFiles = dir(fullfile(audioFolder, '*.wav'));
numFeatures = 40; % 固定 MFCC 特征的维度(系数数量)
% 提取音频特征
for i = 1:length(audioFiles)
mfccFeatures = mfcc(audio, fs, 'NumCoeffs', numFeatures); % 提取固定维度的 MFCC
mfccMean = mean(mfccFeatures, 1); % 计算列均值
% 确保维度一致:截断或补零
if size(mfccMean, 2) < numFeatures
mfccMean = [mfccMean, zeros(1, numFeatures - size(mfccMean, 2))];
elseif size(mfccMean, 2) > numFeatures
mfccMean = mfccMean(1:numFeatures);
end
% 拼接特征
if trainIdx(i)
else
audioFeaturesTest = [audioFeaturesTest; mfccMean];
end
end
% 标准化音频特征
audioFeaturesTrain = normalize(audioFeaturesTrain);
audioFeaturesTest = normalize(audioFeaturesTest);
图像特征提取
图像特征提取使用了 ResNet50,它是一种深度卷积神经网络,预训练在 ImageNet 数据集上。这里提取的是 avg_pool 层的特征
核心代码如下:
imageFolder = 'emoImage';
imageFiles = dir(fullfile(imageFolder, '*.png'));
net = resnet50; % 使用 ResNet50 提取特征
layer = 'avg_pool';
% 提取图像特征
for i = 1:length(imageFiles)
img = imread(fullfile(imageFolder, imageFiles(i).name));
img = imresize(img, [224, 224]);
feature = activations(net, img, layer, 'OutputAs', 'rows');
if trainIdx(i)
imageFeaturesTrain = [imageFeaturesTrain; feature];
else
imageFeaturesTest = [imageFeaturesTest; feature];
end
end
多模态特征融合
将文本、音频和图像特征统一为 double 类型,并按样本数量对齐后拼接。
核心代码如下:
% 对齐训练集特征的大小
textFeaturesTrain = textFeaturesTrain(1:numSamplesTrain, :);
audioFeaturesTrain = audioFeaturesTrain(1:numSamplesTrain, :);
imageFeaturesTrain = imageFeaturesTrain(1:numSamplesTrain, :);
% 拼接训练集特征
combinedFeaturesTrain = [textFeaturesTrain, audioFeaturesTrain, imageFeaturesTrain];
% 对齐测试集特征的大小
textFeaturesTest = textFeaturesTest(1:numSamplesTest, :);
audioFeaturesTest = audioFeaturesTest(1:numSamplesTest, :);
imageFeaturesTest = imageFeaturesTest(1:numSamplesTest, :);
% 拼接测试集特征
combinedFeaturesTest = [textFeaturesTest, audioFeaturesTest, imageFeaturesTest];
模型训练与评估
使用 Random Forest 进行分类,并计算分类的准确率和 F1-Score。
核心代码如下:
% 训练 Random Forest 模型
RFModel = fitcensemble(combinedFeaturesTrain, emotionLabelsTrain, 'Method', 'Bag', 'NumLearningCycles', 100);
% 预测测试集
YPred = predict(RFModel, combinedFeaturesTest);
% 计算准确率
accuracy = sum(YPred == emotionLabelsTest) / length(emotionLabelsTest);
fprintf('分类准确率: %.2f%%\n', accuracy * 100);
% 计算 F1-Score
confMat = confusionmat(emotionLabelsTest, YPred);
f1Score = 2 * (precision .* recall) ./ (precision + recall);
fprintf('平均 F1-Score: %.2f%%\n', nanmean(f1Score) * 100);
效果展示
提示
鉴于大家的matlab基本都是白嫖,为了大家方便安装Resnet50,vgg16,本文资源提供了安装文件,下载之后j解压即可进行安装
老友记图片视频素材下载
由于素材内容高达12GB,平台不允许直接上传,请访问百度网盘
链接:https://pan.baidu.com/s/13AQDU_wHeHm_6WucSKa8JQ
提取码:8010
–来自百度网盘超级会员V5的分享
##完整代码获取
关注下方卡片公众号,回复"多模态情感分类"获取完整代码