CMU多模态数据

1 下载数据
在数据及中包含了三个部分:highlevel,raw以及labels。highlevel是已经经过处理的特征(利用facet以及openSMILE等工具进行抽取),raw是原始特征。由于目前SDK并不能够自动检测是否已经下载过数据集,如果当你有下载了然后要再从晚上downloading的话,会报错,因此需要加入一个try…except。代码片段如下

// An highlighted block
from mmsdk import mmdatasdk as md
DATASET = md.cmu_mosi
// 下载
try:md.mmdataset(DATASET.highlevel,DATA_PATH)
except:print('have been downloaded')

2 看一下下载好的文件
我们可以看到在DATA_PATH的文件路径中,都是以.csd结尾的文件,这是SDK中的一种称之为计算序列(computational sequences)的数据结构。

3 载入多模态数据
构建一个字典,格式为 {modality_file_name, csd_path}然后再传到md包里面,构建一个数据集

visual_field = 'CMU_MOSI_Visual_Facet_41.csd'
acoustic_field = 'CMU_MOSI_COVAREP.csd'
text_field = 'CMU_MOSI_ModifiedTimestampedWords.csd'features = [text_field, visual_field, acoustic_field
]
recipe = {feat: os.path.join(DATA_PATH, feat)  for feat in features}
dataset = md.mmdataset(recipe)

4 看一下这个数据集

  • 每一个dataset由三个模态的计算序列组成,在每一个计算序列里面,包含了多个视频,且每一个计算序列包含的id个数一致。如下图所示

  • 这个dataset的key是上面三个modality_file_name。而在每个模态里面,也是一个字典,key是视频的id,而value是一个元组——(feature,intervals),后者是表示每一个时间戳开始和结束的时间。

print(list(dataset.keys()))  # 数据集的key
print("=" * 50)print(list(dataset[visual_field].keys())[:10])  # 视觉模态的前十个key,这里即前十个id
print("=" * 50)# 第十五个视频的keys,即那个一个元组
some_id = list(dataset[visual_field].keys())[15]
print(list(dataset[visual_field][some_id].keys()))
print("=" * 50)# 看一下时间戳的shape
print(list(dataset[visual_field][some_id]['intervals'].shape))
# print(list(dataset[visual_field][some_id]['intervals']))
print("=" * 50)# 看一下每一个模态的shape
print(list(dataset[visual_field][some_id]['features'].shape))
print(list(dataset[text_field][some_id]['features'].shape))
print(list(dataset[acoustic_field][some_id]['features'].shape))
# 不同的模态有不同的time step
print("Different modalities have different number of time steps!")

5 对齐不同的time step
主要思想就是:将其他的模态的对齐到文本模态上,使得所有模态的time step长度是一致的。首先将其他模态的特征放到一个“桶”中,然后对这个进行处理,这里用到的函数叫做 collapse function。主要是作了pooling的操作

# we define a simple averaging function that does not depend on intervals
def avg(intervals: np.array, features: np.array) -> np.array:
# 虽然没有用到intervals,但是还是要作为参数,不然会报错try:return np.average(features, axis=0)except:return features# first we align to words with averaging, collapse_function receives a list of functions
dataset.align(text_field, collapse_functions=[avg])

注意,对齐之后,视频的id发生了变化,原来的id变成了id[seg]

6 将标签给对齐中

我们这个时候的目标是要将labels加到数据集中,其中label也是一个计算序列。

label_field = 'CMU_MOSI_Opinion_Labels' # 标签计算序列# we add and align to lables to obtain labeled segments
# this time we don't apply collapse functions so that the temporal sequences are preserved
# 构建一个字典
label_recipe = {label_field: os.path.join(DATA_PATH, label_field + '.csd')}
dataset.add_computational_sequences(label_recipe, destination=None)
dataset.align(label_field)

7 分割数据集
SDK会分配每一个视频的id给我们让我们分割train/test/dev set。但是我在对齐之后已经将id变成了id[seg],因此我们需要利用训练来匹配出每一个id并且将数据放到相应的数据集中。并且,对于每一个特征都利用了z-normalization,并且将文本用唯一的id来替代

# 获得相应的id
train_split = DATASET.standard_folds.standard_train_fold
dev_split = DATASET.standard_folds.standard_valid_fold
test_split = DATASET.standard_folds.standard_test_foldfrom collections import defaultdict
word2id = defaultdict(lambda: len(word2id))
UNK = word2id['<unk>']
PAD = word2id['<pad>']train = []
test = []
dev = []# 正则的规则
pattern = re.compile('(.*)\[.*\]')
num_drop = 0
for segment in dataset[label_field].keys():  # segment为 id[seg]vid = re.search(pattern, segment).group(1)label = dataset[label_field][segment]['features']_words = dataset[text_field][segment]['features']_visual = dataset[visual_field][segment]['features']_acoustic = dataset[acoustic_field][segment]['features']# 边界处理# 长度if not (_words.shape[0] == _visual.shape[0] == _acoustic.shape[0]):print('the length of these modalities is different,drop!')num_drop += 0continue# 移除nanlabel = np.nan_to_num(label)_visual = np.nan_to_num(_visual)_acoustic = np.nan_to_num(_acoustic)# 音频模态中的停顿words = []visual = []acoustic = []for i, word in enumerate(_words):if(word[0] != b'sp'):# 放到列表之前构建了之间words.append(word2id[word.decode('utf-8')])visual.append(_visual)_acoustic.append(acoustic)# 将数组列表为数组words = np.asarray(words)visual = np.asarray(visual)acoustic = np.asarray(acoustic)# 归一化 -- z-normalizationvisual = np.nan_to_num((visual - visual.mean(0, keepdims=True)) / (EPS + np.std(visual, axis=0, keepdims=True)))acoustic = np.nan_to_num((acoustic - acoustic.mean(0, keepdims=True)) / (EPS + np.std(acoustic, axis=0, keepdims=True)))# 利用id进行匹配放到上面的列表中。if vid in train_split:train.append(((words, visual, acoustic),label, segment))  # 放入一个元组,元素包含三个部分elif vid in dev_split:dev.append(((words, visual, acoustic), label, segment))elif vid in test_split:test.append(((words, visual, acoustic), label, segment))else:print(f"Found video that doesn't belong to any splits: {vid}")print(f"Total number of {num_drop} datapoints have been dropped.")# turn off the word2id - define a named function here to allow for pickling
# 字典已经构建完毕,不需要再进行构建了。如果遇见了字典没有的字,返回UNK
def return_unk():return UNK
word2id.defalut_factory = return_unk


8 pytorch中的collate function以及构建DataLoader
我们已经得到了train/test/dev set,他们的格式是list。在pytorch中,可以使用collate_functions来从数据及中收集批量数据。

def multi_collate(batch):'''Collate functions assume batch = [Dataset[i] for i in index_set]'''# for later use we sort the batch in descending order of lengthbatch = sorted(batch, key=lambda x: x[0][0].shape[0], reverse=True)# get the data out of the batch - use pad sequence util functions from PyTorch to pad thingslabels = torch.cat([torch.from_numpy(sample[1]) for sample in batch], dim=0)# T his function returns a Tensor of size T x B x * or B x T x * # where T is the length of the longest sequence.  注意实例化学习  sentences = pad_sequence([torch.LongTensor(sample[0][0]) for sample in batch], padding_value=PAD)visual = pad_sequence([torch.FloatTensor(sample[0][1]) for sample in batch])acoustic = pad_sequence([torch.FloatTensor(sample[0][2]) for sample in batch])# lengths are useful later in using RNNslengths = torch.LongTensor([sample[0][0].shape[0] for sample in batch])return sentences, visual, acoustic, labels, lengths# construct dataloaders, dev and test could use around ~X3 times batch size since no_grad is used during eval
batch_sz = 56
train_loader = DataLoader(train, shuffle=True, batch_size=batch_sz, collate_fn=multi_collate)
dev_loader = DataLoader(dev, shuffle=False, batch_size=batch_sz*3, collate_fn=multi_collate)
test_loader = DataLoader(test, shuffle=False, batch_size=batch_sz*3, collate_fn=multi_collate)# let's create a temporary dataloader just to see how the batch looks like,
# 注意这个的batchsize是8
temp_loader = iter(DataLoader(test, shuffle=True, batch_size=8, collate_fn=multi_collate))
batch = next(temp_loader)# size为:T-B-*
print(batch[0].shape) # word vectors, padded to maxlen
print(batch[1].shape) # visual features
print(batch[2].shape) # acoustic features
print(batch[3]) # labels
print(batch[4]) # lengths

CMU SDK-mosi多模态数据使用笔记(一)相关推荐

  1. 在神经反馈任务中同时进行EEG-fMRI,多模态数据集成的大脑成像数据集

    目录 导读 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 .QQ交流群:941473018 导读 虽然将EEG和fMRI结合使用可实现精细的空间分辨率和准确的时间分辨率集成,但仍带来许多挑 ...

  2. 多模态数据+知识图谱,这次你的疑难杂症有解了!

    数据是AI的基础,不同行业领域的数据来源广泛.形式多样,其每一种来源或形式都可以看作是一种模态,例如视频.图片.语音以及工业场景下的传感数据,红外.声谱等. 多模态数据的语义理解与知识表示让智能体能更 ...

  3. 首个面向自动驾驶领域的3D点云目标检测教程!(单模态+多模态/数据+代码)

    背景介绍 3D检测用于获取物体在三维空间中的位置和类别信息,主要基于点云.双目.单目和多模态数据等方式.其中,点云数据由于具有较为丰富的几何信息,相比于其它单模态数据更为稳定,基于激光雷达点云数据的3 ...

  4. 面向自动驾驶领域的3D点云目标检测方法汇总!(单模态+多模态/数据+代码)

    背景介绍 3D检测用于获取物体在三维空间中的位置和类别信息,主要基于点云.双目.单目和多模态数据等方式.其中,点云数据由于具有较为丰富的几何信息,相比于其它单模态数据更为稳定,基于激光雷达点云数据的3 ...

  5. 面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)...

    背景介绍 3D检测用于获取物体在三维空间中的位置和类别信息,主要基于点云.双目.单目和多模态数据等方式.其中,点云数据由于具有较为丰富的几何信息,相比于其它单模态数据更为稳定,基于激光雷达点云数据的3 ...

  6. 数据分析学习笔记——数据可视化

    数据分析学习笔记系列--数据可视化 总第45篇 ▼ 写在前面: 本篇来源于书籍<数据之美-一本书学会可视化设计>的学习后整理所得.全篇主要围绕数据可视化的5个步骤展开,其中重点内容是第三步 ...

  7. Asp.Net 中Report Service (RDLC)动态绑定数据-学习笔记

    Asp.Net 中Report Service (RDLC)动态绑定数据-学习笔记 1)托拽ReportViewer控件到aspx页面,此时,系统会自动添加相关引用,修改Web.config设置: 2 ...

  8. NeurIPS2021 MBT:多模态数据怎么融合?谷歌提出基于注意力瓶颈的方法,简单高效还省计算量...

    关注公众号,发现CV技术之美 本文分享 NeurIPS 2021 论文『Attention Bottlenecks for Multimodal Fusion』,思考<MBT>多模态数据怎 ...

  9. 大数据学习笔记:Hadoop生态系统

    文章目录 一.Hadoop是什么 二.Hadoop生态系统图 三.Hadoop生态圈常用组件 (一)Hadoop (二)HDFS (三)MapReduce (四)Hive (五)Hbase (六)Zo ...

最新文章

  1. SharePoint 2013中规划企业搜索体系结构
  2. 美团配送资金安全治理之对账体系建设
  3. jdbc驱动jar_Javagt; 连接数据库时,JDBC和Mybatis的区别
  4. java的流对象和一些方法
  5. boost::fibers::future用法的测试程序
  6. intellij手动添加依赖jar包
  7. CSS3中border-radius、box-shadow与gradient那点事儿
  8. 自学python考哪些证书-自学python找什么书?
  9. 函数 迭代器,生成器
  10. 单片机控制SIM900A型GSM模块发送数字短信(附源码)
  11. ADS 修改版图默认单位
  12. 《计算机科学导论》第四章 数据运算
  13. python爬豆瓣影评代码_十行Python代码爬取豆瓣电影Top250信息
  14. snpslmd: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No su
  15. 【Audio】声临其境——杜比音效介绍
  16. 安装个https证书要多少钱
  17. 一种可以成功重复夹层中水的静态介电常数的结构
  18. 父与子的编程之旅--EasyGui安装问题解决
  19. FFT快速傅立叶变换在示波器中的用法
  20. 差分近似图像导数算子之Sobel算子

热门文章

  1. 计算机x线摄影的发展趋势,计算机X线摄影技术----CR 新进展
  2. 如何写.bat批处理文件
  3. 大面积无线网络覆盖5大方案,满足不同场所的实际需求
  4. 目标检测,FFmpeg中第一个基于深度学习模型的视频分析功能
  5. 板端电源硬件调试BUG
  6. RabbitMq 消息接收确认(可靠消费)
  7. 各种路由器设备的发展总结及展望
  8. C语言的函数是什么?
  9. 这才不是我想看的《时间简史》
  10. CTFSHOW web入门 命令执行+文件包含+PHP特性