- 人工智能
- 计算机视觉
- 深度学习
【免费下载链接】mmaction2
OpenMMLab's Next Generation Video Understanding Toolbox and Benchmark
本文以 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} }在开始准备之前,有两点关键前提需要特别注意:
- 官方网站已失效:由于 SSv1 的官方网站已经不可访问,标注文件与视频帧都需要通过第三方源下载原始数据集;
- 官方不提供原始视频:官方数据集只提供对原视频抽取出来的 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.txt | 174 个类别的名称清单 | - |
步骤 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.csvdata/sthv1/annotations/something-something-v1-validation.csvdata/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的生效链路是这样的:
- RawframeDataset 的构造参数
filename_tmpl默认为'img_{:05}.jpg',它会被写入每条样本的data_info(rawframe_dataset.py); - 数据增强管线中的 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}数字占位符; 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 的参数定义):
| 参数 | 默认值 | 说明 |
|---|---|---|
--task | flow | rgb/flow/both,抽取内容类型 |
--flow-type | 无 | 光流算法:tvl1、warp_tvl1、farn、brox |
--level | 2 | 数据目录层级,SSv1 必须传1 |
--num-worker | 8 | 并行 worker 数 |
--new-short/--new-width/--new-height | 0 | 抽取时缩放,0 表示保持原尺寸 |
--resume | False | 依据build_report.txt跳过已完成的样本,中断后继续抽取 |
--report-file | build_report.txt | 记录已成功处理的样本,供--resume使用 |
步骤 4:编码视频(可选项)
如果想让数据集同时支持VideoDataset(直接读.mp4)这条加载路径,可以把 RGB 帧编码为视频,同样是可选步骤:
cd $MMACTION2/tools/data/sthv1/ bash encode_videos.shencode_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 脚本取值 | 默认值 | 说明 |
|---|---|---|---|
--fps | 12 | 30 | 合成视频的帧率,需与原始帧的采集帧率一致 |
--start-idx | 1 | 0 | 首帧编号,官方帧从00001.jpg开始,故为 1 |
--filename-tmpl | %05d | img_%05d | 输入帧文件名模板,匹配00001.jpg |
--in-format | (默认)jpg | jpg | 输入帧格式(jpg/png) |
--vcodec | (默认)mpeg4 | mpeg4 | 视频编码方式 |
--ext | (默认)mp4 | mp4 | 输出视频扩展名 |
--resume | False | False | 跳过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。
- rawframes:
这份列表随后被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
相关推荐
mmaction2 数据准备实战:Something-Something V1(STH-V1)从原始帧到训练文件列表的完整流程
mmaction2 数据准备实战:Something Something V1(STH V1)从原始帧到训练文件列表的完整流程 本文以 mmaction2 仓库
人工智能计算机视觉深度学习MMAction2 中 Kinetics-400/600/700 数据集的完整准备指南:从标注下载到帧抽取与文件列表生成
MMAction2 中 Kinetics 400/600/700 数据集的完整准备指南:从标注下载到帧抽取与文件列表生成 导读 Kinetics 系列(Kine
人工智能计算机视觉深度学习MMAction2 中准备 Moments in Time 数据集的完整流程:标注、视频缓存、抽帧与文件列表生成
MMAction2 中准备 Moments in Time 数据集的完整流程:标注、视频缓存、抽帧与文件列表生成 本文基于 MMAction2 仓库内的数据集准
人工智能计算机视觉深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考