☰
MMAction2 准备 Something-Something V1 数据集:从标注文件到训练就绪文件列表的完整实操指南
2026/10/14 17:37:37 网站建设 项目流程
  • 人工智能
  • 计算机视觉
  • 深度学习

【免费下载链接】mmaction2

OpenMMLab's Next Generation Video Understanding Toolbox and Benchmark

项目地址:https://gitcode.com/gh_mirrors/mm/mmaction2
点击查看免费下载

本文以 MMAction2 仓库自带的 Something-Something V1 数据准备指南 为主线,完整讲解如何从第三方源获取标注与 RGB 帧、可选地抽取 TV-L1 光流与编码视频,并生成训练所需的帧/视频文件列表。读完本文,你将能够独立完成 SSv1 数据集的全套准备流程,理解filename_tmpl、--rgb-prefix等关键参数背后的源码逻辑,并可直接在 训练和测试教程 中启动 TSM/TANet/TRN 等模型的训练。

数据集简介与准备前提

Something-Something V1(简称 SSv1)是由 Goyal 等人提出的用于学习视觉常识的动作识别数据集,引用信息如下(保留自原文档):

@misc{goyal2017something, title={The "something something" video database for learning and evaluating visual common sense}, author={Raghav Goyal and Samira Ebrahimi Kahou and Vincent Michalski and Joanna Materzyńska and Susanne Westphal and Heuna Kim and Valentin Haenel and Ingo Fruend and Peter Yianilos and Moritz Mueller-Freitag and Florian Hoppe and Christian Thurau and Ingo Bax and Roland Memisevic}, year={2017}, eprint={1706.04261}, archivePrefix={arXiv}, primaryClass={cs.CV} }

在开始准备之前,有两点关键前提需要特别注意:

  1. 官方网站已失效:由于 SSv1 的官方网站已经不可访问,标注文件与视频帧都需要通过第三方源下载原始数据集;
  2. 官方不提供原始视频:官方数据集只提供对原视频抽取出来的 RGB 帧(JPG 序列),不提供.mp4等视频文件,因此视频数据只能通过 RGB 帧重新编码得到。

按照 MMAction2 的约定,执行本文所有脚本前应确保命令行当前路径为$MMACTION2/tools/data/sthv1/($MMACTION2为仓库根目录)。该目录下提供了一整套辅助脚本,是本文所有命令的入口:

脚本作用底层实现
extract_flow.sh从 RGB 帧抽取 TV-L1 光流build_rawframes.py
encode_videos.sh将 RGB 帧编码为视频build_videos.py
generate_rawframes_filelist.sh生成 rawframes 格式文件列表build_file_list.py
generate_videos_filelist.sh生成 videos 格式文件列表build_file_list.py
label_map.txt174 个类别的名称清单-

步骤 1:下载标注文件

下载好的标注文件需要放在$MMACTION2/data/sthv1/annotations文件夹下。

这一步之所以容易出错,是因为 MMAction2 对标注文件的文件名和格式有硬性要求。从源码 parse_file_list.py 中的parse_sthv1_splits函数可以看到,构建文件列表时实际读取的是以下四个文件:

  • data/sthv1/annotations/something-something-v1-labels.csv(类别清单,每一行一个类别名)
  • data/sthv1/annotations/something-something-v1-train.csv
  • data/sthv1/annotations/something-something-v1-validation.csv
  • data/sthv1/annotations/something-something-v1-test.csv

三个划分文件的每一行均以英文分号;分隔为“视频 ID; 类别名”两部分(见源码中line_to_map的line.strip().split(';')处理,parse_file_list.py)。类别名会通过labels.csv的行序映射为从 0 开始的整数标签。SSv1 共有 174 个类别,仓库内的 label_map.txt 完整列出了这 174 个类别名,可用作下载标注后的比对校验;仓库中所有 SSv1 相关配置也统一使用num_classes=174(例如 tin 配置)。

步骤 2:准备 RGB 帧

将下载好的压缩文件放在$MMACTION2/data/sthv1/文件夹下,并使用以下脚本解压(官方发布物通常被切分为多个 tar 分卷):

cd $MMACTION2/data/sthv1/ cat 20bn-something-something-v1-?? | tar zx cd $MMACTION2/tools/data/sthv1/

解压完成后,RGB 帧位于data/sthv1/rawframes/下,每个视频一个子目录,官方 JPG 文件名形如00001.jpg(5 位数字、没有img_前缀)。这就引出了 SSv1 准备流程中最关键的一个配置点。

关键配置:修改文件名模板filename_tmpl

MMAction2 的RawframeDataset默认帧名模板是img_{:05}.jpg,而 SSv1 官方帧是00001.jpg这种从1开始计数的 5 位数字命名,因此需要在配置文件的data.train、data.val和data.test处添加filename_tmpl='{:05}.jpg'。原文档给出的完整配置示例如下:

data = dict( videos_per_gpu=16, workers_per_gpu=2, train=dict( type=dataset_type, ann_file=ann_file_train, data_prefix=data_root, filename_tmpl='{:05}.jpg', pipeline=train_pipeline), val=dict( type=dataset_type, ann_file=ann_file_val, data_prefix=data_root_val, filename_tmpl='{:05}.jpg', pipeline=val_pipeline), test=dict( type=dataset_type, ann_file=ann_file_test, data_prefix=data_root_val, filename_tmpl='{:05}.jpg', pipeline=test_pipeline))

注意:MMAction2 1.x 系列配置已迁移到train_dataloader/val_dataloader/test_dataloader结构,data_prefix也改用了dict(img=...)的形式。仓库中现成的 SSv1 配置 tin_imagenet-pretrained-r50_8xb6-1x1x8-40e_sthv1-rgb.py 即为最新写法的完整示例:

train_dataloader = dict( batch_size=6, num_workers=2, persistent_workers=True, sampler=dict(type='DefaultSampler', shuffle=True), dataset=dict( type=dataset_type, ann_file=ann_file_train, data_prefix=dict(img=data_root), filename_tmpl='{:05}.jpg', pipeline=train_pipeline))

从源码看,filename_tmpl的生效链路是这样的:

  1. RawframeDataset 的构造参数filename_tmpl默认为'img_{:05}.jpg',它会被写入每条样本的data_info(rawframe_dataset.py);
  2. 数据增强管线中的 RawFrameDecode 在 RGB 模式下用filename_tmpl.format(frame_idx)拼接单帧文件路径,在 Flow 模式下则用filename_tmpl.format('x', frame_idx)/format('y', frame_idx)分别加载水平、垂直两路光流(loading.py)。这解释了为什么光流模板需要带前缀占位符(如flow_{}_{:05}.jpg),而 SSv1 的纯 RGB 模板只需一个{:05}数字占位符;
  3. frame_idx的起始值由数据集参数start_index决定,RawframeDataset中默认为1(原始帧从00001.jpg开始计数),与 SSv1 的命名恰好吻合,无需额外设置。

如果你只想使用 RGB 帧训练,可以跳过步骤 3、4,直接执行步骤 5 生成 rawframes 格式的文件列表。

步骤 3:抽取光流(可选项)

如果只想用 RGB 帧加载训练,本步骤可跳过。需要光流时(例如 TSM 的RGB+Flow模态),先在 安装指南 中安装denseflow工具。

由于帧/光流抽取会产生海量小文件,I/O 往往是瓶颈。如果拥有大量 SSD 存储空间,推荐把抽取结果放到 SSD 上,可以通过软链接实现:

# 假设 SSD 挂载在 "/mnt/SSD/" mkdir /mnt/SSD/sthv1_extracted/ ln -s /mnt/SSD/sthv1_extracted/ ../../../data/sthv1/rawframes

然后运行:

cd $MMACTION2/tools/data/sthv1/ bash extract_flow.sh

脚本背后的实际命令

extract_flow.sh 内部只有一行核心逻辑:

python build_rawframes.py ../../data/sthv1/rawframes/ ../../data/sthv1/rawframes/ --task flow --level 1 --flow-type tvl1 --input-frames

几个值得注意的细节:

  • 输入目录与输出目录相同(都是data/sthv1/rawframes/):因为 SSv1 只有 RGB 帧、没有原始视频,--input-frames标志告诉 build_rawframes.py 以帧目录而非视频文件为输入源;
  • --level 1表示“一个视频一个目录”的单层结构,与 SSv1 的rawframes/<video_id>/布局一致;
  • --flow-type tvl1指定 TV-L1 稠密光流算法;
  • 默认以--num-worker 8的多进程池并行,每个 worker 最终执行的 denseflow 命令形如(见 build_rawframes.py):
denseflow '<视频帧目录>' -a=tvl1 -b=20 -s=1 -o='<输出目录>' --if

常用可选参数(摘自 build_rawframes.py 的参数定义):

参数默认值说明
--taskflowrgb/flow/both,抽取内容类型
--flow-type无光流算法:tvl1、warp_tvl1、farn、brox
--level2数据目录层级,SSv1 必须传1
--num-worker8并行 worker 数
--new-short/--new-width/--new-height0抽取时缩放,0 表示保持原尺寸
--resumeFalse依据build_report.txt跳过已完成的样本,中断后继续抽取
--report-filebuild_report.txt记录已成功处理的样本,供--resume使用

步骤 4:编码视频(可选项)

如果想让数据集同时支持VideoDataset(直接读.mp4)这条加载路径,可以把 RGB 帧编码为视频,同样是可选步骤:

cd $MMACTION2/tools/data/sthv1/ bash encode_videos.sh

encode_videos.sh 背后的实际命令为:

python build_videos.py ../../data/sthv1/rawframes/ ../../data/sthv1/videos/ --fps 12 --level 1 --start-idx 1 --filename-tmpl '%05d'

从 build_videos.py 可以看到,每个视频目录最终由一条 ffmpeg 命令合成:

ffmpeg -start_number 1 -r 12 -i 'rawframes/<video_id>/%05d.jpg' -vcodec mpeg4 videos/<video_id>.mp4

对应参数及默认值(build_videos.py):

参数SSv1 脚本取值默认值说明
--fps1230合成视频的帧率,需与原始帧的采集帧率一致
--start-idx10首帧编号,官方帧从00001.jpg开始,故为 1
--filename-tmpl%05dimg_%05d输入帧文件名模板,匹配00001.jpg
--in-format(默认)jpgjpg输入帧格式(jpg/png)
--vcodec(默认)mpeg4mpeg4视频编码方式
--ext(默认)mp4mp4输出视频扩展名
--resumeFalseFalse跳过out_dir中已存在的视频

步骤 5:生成文件列表

无论是 rawframes 还是 videos 格式,MMAction2 都通过一份“文件列表”(每行一个视频/帧目录)来组织训练与验证样本。运行:

cd $MMACTION2/tools/data/sthv1/ bash generate_{rawframes, videos}_filelist.sh

两个脚本实际执行的命令如下(分别来自 generate_rawframes_filelist.sh 和 generate_videos_filelist.sh):

# rawframes 列表(train / val 各一条) PYTHONPATH=. python tools/data/build_file_list.py sthv1 data/sthv1/rawframes/ \ --rgb-prefix '0' --num-split 1 --level 1 --subset train --format rawframes --shuffle PYTHONPATH=. python tools/data/build_file_list.py sthv1 data/sthv1/rawframes/ \ --rgb-prefix '0' --num-split 1 --level 1 --subset val --format rawframes --shuffle # videos 列表(train / val 各一条) PYTHONPATH=. python tools/data/build_file_list.py sthv1 data/sthv1/videos/ \ --num-split 1 --level 1 --subset train --format videos --shuffle PYTHONPATH=. python tools/data/build_file_list.py sthv1 data/sthv1/videos/ \ --num-split 1 --level 1 --subset val --format videos --shuffle

关键参数解析(build_file_list.py):

  • --rgb-prefix '0':统计 RGB 帧数量时使用的文件名前缀。官方帧为00001.jpg,前缀就是0;若是自建数据集用img_00001.jpg命名,则保持默认img_;
  • --num-split 1:只生成一份划分。此时输出文件名固定为{dataset}_{subset}_list_{format}.txt(build_file_list.py),即data/sthv1/sthv1_train_list_rawframes.txt、sthv1_val_list_rawframes.txt、sthv1_train_list_videos.txt、sthv1_val_list_videos.txt;
  • --shuffle:对列表行做随机打乱,配合多卡数据加载更均衡;
  • --level 1:与 SSv1 单层目录结构一致;
  • --format:决定列表行的格式。从 build_file_list.py 的build_list函数可以看到两种行格式:
    • rawframes:<帧目录> <RGB帧数> <标签>,例如31255 31 129;
    • videos:<视频相对路径> <标签>,例如10000.mp4 129。

这份列表随后被RawframeDataset逐行解析为frame_dir/total_frames/label字段(rawframe_dataset.py),再经SampleFrames采样帧号、RawFrameDecode按filename_tmpl落盘读取——文件列表、filename_tmpl与start_index三者必须一致,这是 SSv1 数据集准备中最容易踩的坑。

步骤 6:检查文件夹结构

完成整个准备流程后,仓库根目录下的数据布局应与 原文档 给出的结构一致:

mmaction2 ├── mmaction ├── tools ├── configs ├── data │ ├── sthv1 │ │ ├── sthv1_{train,val}_list_rawframes.txt │ │ ├── sthv1_{train,val}_list_videos.txt │ │ ├── annotations │ │ ├── videos │ │ │ ├── 1.mp4 │ │ │ ├── 2.mp4 │ │ │ └── ... │ │ └── rawframes │ │ ├── 1 │ │ │ ├── 00001.jpg │ │ │ ├── 00002.jpg │ │ │ ├── ... │ │ │ ├── flow_x_00001.jpg │ │ │ ├── flow_x_00002.jpg │ │ │ ├── ... │ │ │ ├── flow_y_00001.jpg │ │ │ ├── flow_y_00002.jpg │ │ │ └── ... │ │ ├── 2 │ │ └── ...

检查清单:annotations/下四个 CSV 文件名与步骤 1 完全一致;rawframes 目录下每个视频子目录的 RGB 帧以00001.jpg开头;若执行过光流抽取,则同目录内应成对出现flow_x_*与flow_y_*帧(parse_directory会校验 x/y 两路数量必须相等,否则直接报错,见 parse_file_list.py);两个*_list_*.txt文件非空且行格式与步骤 5 说明一致。

训练与评估

数据就绪后,仓库中已有多个面向 SSv1 的完整配置可直接使用,包括:

  • TIN
  • TANet
  • TRN
  • TPN-TSM

这些配置均设置num_classes=174、data_root = 'data/sthv1/rawframes',并把ann_file_train/ann_file_val指向步骤 5 生成的sthv1_{train,val}_list_rawframes.txt,验证评估器使用AccMetric(Top-1 精度)。具体的训练、验证与测试命令请参考 训练和测试教程。

  • 人工智能
  • 计算机视觉
  • 深度学习

【免费下载链接】mmaction2

OpenMMLab's Next Generation Video Understanding Toolbox and Benchmark

项目地址:https://gitcode.com/gh_mirrors/mm/mmaction2
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询