共计 2565 个字符,预计需要花费 7 分钟才能阅读完成。
1. 背景介绍
CMU-MOSI(Multimodal Opinion-level Sentiment Intensity)是多模态情感分析领域最常用的基准数据集之一,由卡内基梅隆大学于 2016 年发布。该数据集包含 2,199 条短视频片段,内容涵盖产品评测、电影评论等主题,每条数据均包含:

- 文本模态:人工转录的对话文本
- 音频模态:16kHz 采样率的 WAV 格式音频
- 视频模态:30fps 的 MP4 格式视频
- 标注信息:人工标注的情感强度分数(- 3 到 + 3 连续值)
数据集采用分层抽样确保内容多样性,被广泛用于跨模态表征学习、情感识别等研究方向。其独特价值在于:
- 真实场景下的多模态数据
- 细粒度的情感强度标注
- 严格对齐的跨模态时间戳
2. 痛点分析
尽管 CMU-MOSI 数据集非常有用,但原始数据获取和处理存在以下挑战:
- 申请流程复杂:需要填写 IRB(伦理审查)表格并等待人工审核
- 数据分散存储:视频、音频、文本分别存放在不同服务器
- 格式不一致:原始视频包含冗余帧,音频采样率不统一
- 预处理耗时:手动对齐三个模态的时间戳容易出错
- 标注噪声:部分片段存在标注不一致问题
3. 技术方案
3.1 数据申请与下载
- 访问 CMU-MultimodalSDK 官网注册账号
- 提交 IRB 申请表(需说明研究用途)
- 审核通过后下载
mosi_raw.zip(约 12GB)和标注文件
推荐使用 wget 批量下载(示例仅展示关键部分):
import os
download_links = [
'http://example.com/mosi/videos.zip',
'http://example.com/mosi/audio.zip',
'http://example.com/mosi/transcripts.zip'
]
for url in download_links:
os.system(f'wget -c {url} -P ./raw_data')
3.2 自动化预处理脚本
以下脚本实现:
– 视频帧采样(30fps→15fps)
– 音频重采样(16kHz→8kHz)
– 文本分词与对齐
import cv2
import librosa
import pandas as pd
# 视频处理函数
def process_video(input_path, output_path, target_fps=15):
cap = cv2.VideoCapture(input_path)
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# 计算跳帧步长
skip_step = int(30 / target_fps)
frames = []
for i in range(0, frame_count, skip_step):
cap.set(cv2.CAP_PROP_POS_FRAMES, i)
ret, frame = cap.read()
if ret:
frames.append(cv2.resize(frame, (224, 224)))
# 保存为 NPY 格式
np.save(output_path, np.array(frames))
# 音频处理函数
def process_audio(input_path, output_path, target_sr=8000):
y, sr = librosa.load(input_path, sr=target_sr)
mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
np.save(output_path, mfcc)
# 主处理流程
for clip_id in tqdm(annotation_df['clip_id']):
try:
process_video(f'raw/videos/{clip_id}.mp4', f'processed/video/{clip_id}.npy')
process_audio(f'raw/audio/{clip_id}.wav', f'processed/audio/{clip_id}.npy')
except Exception as e:
logging.error(f'Error processing {clip_id}: {str(e)}')
3.3 模态对齐与格式转换
使用 PyTorch Dataset 类实现多模态数据加载:
from torch.utils.data import Dataset
class MOSIDataset(Dataset):
def __init__(self, root_dir):
self.annotations = pd.read_csv(f'{root_dir}/annotations.csv')
def __getitem__(self, idx):
clip_id = self.annotations.iloc[idx]['clip_id']
# 加载三种模态
video = torch.from_numpy(np.load(f'{root_dir}/video/{clip_id}.npy'))
audio = torch.from_numpy(np.load(f'{root_dir}/audio/{clip_id}.npy'))
text = self._process_text(clip_id)
return {'video': video.float(),
'audio': audio.float(),
'text': text,
'label': self.annotations.iloc[idx]['sentiment']
}
4. 避坑指南
| 问题现象 | 解决方案 |
|---|---|
| 视频音频不同步 | 使用 ffmpeg -ss 参数精确截取时间片段 |
| 缺失标注 | 参考相邻片段插值或直接剔除该样本 |
| 内存不足 | 使用 dask 进行懒加载或降低采样率 |
| 文件损坏 | 校验 MD5 值并重新下载问题文件 |
5. 性能考量
不同预处理方法对训练效率的影响对比:
| 方法 | 存储空间 | 加载速度 | 模型效果 |
|---|---|---|---|
| 原始数据 | 12GB | 慢 | 基准 |
| 帧采样(15fps) | 6GB | 快 | 下降约 2% |
| 特征提取 | 800MB | 最快 | 下降约 5% |
6. 延伸思考
- 如何处理 CMU-MOSI 中的标注噪声问题?
- 当视频和音频模态出现严重不同步时,如何设计鲁棒的特征融合方法?
- 对于短文本模态(平均仅 8 个词),如何避免其在多模态模型中被忽略?
通过本文的流程处理,研究者可以将数据集准备时间从原来的 2 - 3 天缩短到 2 小时内,且获得更适合深度学习模型训练的标准化数据格式。
正文完
