十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MMPT 数据集准备全指南:基于 unilm/edgelm 的视频特征提取与文本预分词流水线

MMPT 数据集准备全指南:基于 unilm/edgelm 的视频特征提取与文本预分词流水线 MMPT 数据集准备全指南基于 unilm/edgelm 的视频特征提取与文本预分词流水线【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm本文是 MMPTMultimodal Pre-training Toolkit位于 edgelm/examples/MMPT 的数据集准备实操指南聚焦 VideoCLIP 与 VLM 预训练所需的视频/文本数据处理全流程从 S3D 视频特征提取、Howto100M 去重与分片到 BERT 文本预分词与ShardedTensor打包。读完本文你将掌握 MMPT 提供的一整套可复现的数据预处理命令与配置理解raw_caption.json、去重处理器、分片张量等关键设计动机并能独立把 Howto100M、Youcook、MSRVTT 等视频数据加工为可直接用于训练的分片特征。为什么需要一套独立的视频数据预处理管线视频数据尤其是 Howto100M 这类百万级教学视频的下载与处理成本远高于纯文本或纯图像数据。MMPT 在edgelm/examples/MMPT/scripts/下提供了两条独立的预处理脚本链分别处理两种模态视频特征提取scripts/video_feature_extractor/该目录是知名开源项目video_feature_extractor的深度改造版负责把原始视频解码并送入预训练 S3D 模型输出逐秒per-second的 512 维视频特征文本预分词scripts/text_token_extractor/负责把 Howto100M 的原始字幕caption清洗、去重后用 BERT tokenizer 预分词并打包成分片 numpy 数组。两条链路的产物会以ShardedTensor形式落盘训练阶段由 how2processor.py 中的ShardedHow2MetaProcessor、ShardedVideoProcessor、ShardedTextProcessor以 mmap 方式按需读取实现「一次预处理、多次高效训练」。前置依赖与 S3D 模型放置环境依赖在开始之前需要安装两个关键依赖conda install -c anaconda pandas # PathBuilder 依赖 pandas 维护视频 id 与路径映射 pip install ffmpeg-python # 视频解码链路需要其中PathBuilder是 MMPT 实现的路径自动追踪工具负责在「视频 id → 源视频路径 → 特征落盘路径」之间建立映射关系其实现位于 pathbuilder.py。S3D 预训练模型视频特征提取使用在 Howto100M 上预训练的 S3DSeparable 3D CNN模型。请将两个模型文件按如下位置放置pretrained_models/s3d_dict.npy pretrained_models/s3d_howto100m.pths3d_howto100m.pth是 S3D 权重s3d_dict.npy是配套词典s3dg.py 中实现了该模型的加载与前向逻辑。Howto100M 预处理与既有论文的三处关键差异Howto100M 是超大规模视频预训练数据集约 100 万条教学视频。MMPT 在 DATASET.md 中明确说明其预处理与既有公开做法有三处关键差异这正是本套管线区别于通用脚本的核心使用raw_caption.json而非caption.jsoncaption.json被人为移除了停用词stop words会破坏文本的纯净性MMPT 坚持用raw_caption.json以获得文本上的纯自监督信号。去除「部分重复」文本Howto100M 原始字幕里存在为实时可读性而设计的部分重复片段MMPT 通过CaptionDedupProcessor位于 dedupprocessor.py去重保证每个时间片文本的唯一性。用SharedTensor分片而非 h5pyshardedtensor.py 实现的ShardedTensor将视频/文本特征切分为连续磁盘空间上的 mmap 分片训练加载比h5py更快且多 GPU 训练时无需把整段视频特征载入内存。CaptionDedupProcessor的去重逻辑值得展开它以random_merge为核心见 dedupprocessor.py对相邻字幕片执行四种合并/裁剪策略——当后一条字幕是前一条的子串时直接并入前一条当前一条是后一条的子串时整体替换发生部分重叠时以 50% 概率把重叠部分并入前一条的结尾或以 50% 概率把前一条裁剪到重叠起点完全不重叠则保留为独立片段。同时该处理器会对每个视频做一次--前的统计t_clip_len、clip_tps、mean_clip_len等见文件顶部注释中的统计对比方便你评估去重效果。视频特征提取全流程第一步运行 S3D 提取脚本编辑并运行 s3d.shpython scripts/video_feature_extractor/extract.py \ --vdir path_to_video_folder \ --fdir data/feat/feat_how2_s3d \ --types3d --num_decoding_thread4 \ --batch_size 32 --half_precision 1参数说明源自 extract.py 的命令行定义参数默认值说明--vdir必填源视频所在目录多个目录用逗号分隔--fdir必填特征输出目录--type2dCNN 类型取值见下方CONFIGS--num_decoding_thread4视频解码并行线程数--batch_size64特征抽取批次大小--half_precision0输出 fp16 特征以省空间、加速训练--l2_normalize1是否对特征做 L2 归一化--hflip0是否做水平翻转增强extract.py内置的CONFIGS字典extract.py针对不同特征类型预置了采样帧率、分辨率与中心裁剪策略其中s3d配置为fps30, size224, centercropTrue——这也是 VideoCLIP 在 README 示例中video_frames torch.randn(1, 2, 30, 224, 224, 3)形状B, T, FPS, H, W, C的来源。s3d模式下特征前向取model(...)[video_embedding]输出每段视频按每 30 帧1 秒产出 512 维向量最终以.npy文件保存。关于并行Howto100M 视频量极大官方建议在多台机器上并行运行提取任务。PathBuilder.build的split参数cur/total形式会把全量视频按份数切块配合shards参数把特征写入feature_dir/{shard_id}/子目录方便分布式产出见 pathbuilder.py。第二步生成训练/验证集视频 id 列表将可用视频 id 按行拆分为两个列表文件data/how2/how2_s3d_train.lst data/how2/how2_s3d_val.lst这两个.lst文件将被后续分片脚本和训练阶段的ShardedHow2MetaProcessor共同消费后者见 how2processor.py通过读取train_meta.pkl/val_meta.pkl建立video_id → (shard_id, video_idx)索引。第三步打包为 ShardedTensorpython scripts/video_feature_extractor/shard_feature.pyshard_feature.py 中的Shard类按shard_size4096将.lst中列出的视频逐个np.load并拼接为分片然后通过ShardedTensor.from_list与.saveshardedtensor.py落盘为*_data.npy*_starts.npy对同时为每个 split 生成{split}_meta.pkl记录「shard → video_id 列表」的映射。ShardedTensor的实现要点from_list先把所有特征沿 0 维拼接进一段连续内存np.concatenate再用starts数组记录每个样本的起始偏移__getitem__(i)即返回data[starts[i]:starts[i1]]save/load支持mmap_mode训练时以只读 mmap 方式按偏移近乎随机访问这正是其比 h5py 更快的原因。文本预分词全流程第一步清理字幕去重python -m mmpt.processors.dedupprocessor该命令把data/how2/raw_caption.json转换为raw_caption.pkl首次再由CaptionDedupProcessor完成去重并输出data/how2/raw_caption_dedup.pkl见 dedupprocessor.py 的__main__逻辑。第二步预分词并分片把去重后的字幕data/how2/raw_caption_dedup.pkltokenize 成 sharded numpy 数组python scripts/text_token_extractor/pretokenization.py scripts/text_token_extractor/configs/bert-base-uncased.yaml该命令对应 pretokenization.py 的两阶段流水线tokenize 阶段TokenizerDataset通过PKLJSONStrTextProcessor见 how2processor.py逐视频解析字幕 JSON 并用bert-base-uncasedtokenizer 切词产出raw_caption_dedup.bert-base-uncased.pklsharding 阶段numpify按训练/验证分片把每条字幕的时间戳[start, end]与 token id 序列分别打包为*.startends与*.caps_ids的ShardedTensortoken id 序列以max_cap_len32截断并用-1padding。配置文件 bert-base-uncased.yaml 的关键字段dataset: bert_name: bert-base-uncased # tokenizer 名称与 config 中 bert_name 保持一致 caption_pkl_path: data/how2/raw_caption_dedup.pkl # 去重后的字幕 pkl use_fast: true # 是否启用 transformers 的 fast tokenizer target_dir: data/feat/feat_how2_s3d_shard_small # 文本分片输出目录训练阶段的文本读取由ShardedTextProcessorhow2processor.py完成它同时加载*.startends与*.caps_ids两个分片还原出{start: ..., end: ..., cap: ...}结构cap中过滤掉-1padding该结构与视频特征分片位于同一target_dir下最终由 projects/task/how2.yaml 中的vfeat_dir/tfeat_dir字段统一指向形成完整的「视频 文本」分片数据集。Youcook、MSRVTT 等其他数据集对于 Youcook、MSRVTT 等下游数据集MMPT 采用与 Howto100M第一步相同的特征提取方式但有两处简化文本直接读取不再需要dedupprocessor与预分词文本直接从数据集自带的元数据meta data中读取实时分词文本 tokenization 在训练时即时on-the-fly完成。请将 Youcook、MSRVTT 数据分别下载到data/youcook、data/msrvtt并参考 projects/task/youcook.yaml、projects/task/vtt.yaml 等任务配置了解字段细节。这类数据集的视频特征同样走extract.py --types3d的提取管线只是训练配置中的meta_processor/video_processor/text_processor会换成对应的即时处理实现对应mmpt/processors/dsprocessor.py与how2retriprocessor.py等。训练阶段如何消费这些分片分片数据在训练中的消费链路为详见 how2processor.pyShardedHow2MetaProcessor读取{split}_meta.pkl把每个样本映射为(video_id, idx, shard_id, shard_idx)ShardedVideoProcessor按shard_idmmap 加载{split}_{shard_id}分片取出第shard_idx条视频特征ShardedTextProcessor按同一坐标取出对应字幕的start/end/capFixedLenAligner及其子类MFMMLMAligner等以随机中心字幕片为锚点向外扩展采样文本与视频片段拼装成[CLS] [SEP] 文本 [SEP] ...的模型输入格式供 VideoCLIP / VLM 训练使用。该链路把「预处理期一次性分片」与「训练期 mmap 按需读取」解耦正是 MMPT 面向多模态大语料预训练的性能关键。更多关于模型、任务与配置的信息可继续阅读 README.md、CONFIG.md、pretraining.md 与 endtask.md。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表