- 人工智能
- 计算机视觉
- 深度学习
【免费下载链接】mmaction2
OpenMMLab's Next Generation Video Understanding Toolbox and Benchmark
导读
HMDB51 是视频动作识别领域最经典的基准数据集之一,由 51 类日常人体动作组成,广泛应用于 TSN、SlowFast、TSM 等识别模型的评估。本文基于 MMAction2 仓库中 tools/data/hmdb51/README.md 所描述的完整数据准备流程,结合仓库内的真实脚本源码与配置,逐步骤讲解如何下载标注文件与视频、使用 denseflow 或 OpenCV 抽取 RGB 帧与光流、生成训练/验证文件列表,并给出目录结构校验与后续训练入口。读完本文,你将能够从零开始在本地完整准备一个可直接用于 MMAction2 训练与测试的 HMDB51 数据集。
1. 数据集概览与准备工作
1.1 HMDB51 是什么
HMDB51(Human Motion DataBase)由 Kuehne 等人于 2011 年提出,包含51 个人体动作类别(如 brush_hair、cartwheel、climb、dive、kiss、run、wave 等),视频来自电影片段与 YouTube 等来源,动作类别较 UCF101 更具多样性,是衡量识别模型泛化能力的常用基准。仓库中 tools/data/hmdb51/label_map.txt 完整列出了这 51 个类别的名称。引用该数据集时,官方建议使用以下 BibTeX:
@article{Kuehne2011HMDBAL, title={HMDB: A large video database for human motion recognition}, author={Hilde Kuehne and Hueihan Jhuang and E. Garrote and T. Poggio and Thomas Serre}, journal={2011 International Conference on Computer Vision}, year={2011}, pages={2556-2563} }1.2 前置条件
在执行任何脚本之前,请确保当前工作目录位于仓库中的tools/data/hmdb51/目录下:
cd $MMACTION2/tools/data/hmdb51/此外,下载的标注文件与视频均为.rar压缩格式,因此需要安装unrar:
sudo apt-get install unrar若当前环境没有 sudo 权限,可参照社区提供的免 sudo 安装脚本(如 innerlee/setup 中的zzunrar.sh)进行便捷安装。安装完成后可通过unrar命令验证是否可用。
说明:完整的准备流程共 5 步——准备标注(Step 1)、准备视频(Step 2)、抽取 RGB 帧与光流(Step 3,可选)、生成文件列表(Step 4)、检查目录结构(Step 5)。其中 Step 3 仅在需要以 rawframes(帧)格式训练时执行;若你直接使用视频加载器(video loader),可以跳过帧抽取。
2. 步骤一:下载并解压标注文件
运行仓库提供的脚本 tools/data/hmdb51/download_annotations.sh:
bash download_annotations.sh从脚本源码可以看到其内部执行逻辑:
- 自动创建
data/hmdb51/annotations目录(脚本中DATA_DIR="../../../data/hmdb51/annotations",即相对于tools/data/hmdb51/目录); - 通过
wget下载官方提供的test_train_splits.rar(即 7030 训练/测试划分文件,--no-check-certificate用于绕过证书校验); - 使用
unrar x解压,随后删除压缩包,并将解压出的testTrainMulti_7030_splits/*.txt全部移动到annotations目录下。
解压完成后,data/hmdb51/annotations/下会得到每个类别的划分文件(如brush_hair_test_split1.txt等),其中每行形如:
April_09_brush_hair_u_nm_np1_ba_goo_0 11表示属于训练集(2表示属于测试集),这是 HMDB51 官方的 7030 划分(约 70% 训练、30% 测试)。
提示:
download_annotations.sh脚本最后执行了rm test_train_splits.rar清理压缩包,这是脚本自身的清理行为;请勿手动删除已经解压好的标注文件。
3. 步骤二:下载并解压视频
运行 tools/data/hmdb51/download_videos.sh:
bash download_videos.sh脚本的执行流程(对应仓库源码):
- 创建
data/hmdb51/videos目录; - 下载官方原始视频压缩包
hmdb51_org.rar; unrar x ./hmdb51_org.rar解压得到按类别打包的多个子压缩包;- 遍历解压出的所有
.rar子压缩包(每个类别一个),逐个unrar x解压出视频; - 清理全部
.rar文件。
解压完成后,data/hmdb51/videos/下应包含 51 个类别子目录,每个子目录内是对应类别的.avi视频,例如:
data/hmdb51/videos/brush_hair/April_09_brush_hair_u_nm_np1_ba_goo_0.avi data/hmdb51/videos/wave/20060723sfjffbartsinger_wave_f_cm_np1_ba_med_0.avi4. 步骤三:抽取 RGB 帧与光流(可选)
如果你希望使用 rawframes(帧序列)格式进行训练(例如 TSN、SlowFast、TSM 等模型的常用做法),则需要将视频抽帧。若只使用视频加载器,可跳过本节。
4.1 抽帧前置说明
- 使用 denseflow 抽帧时,需先按照 安装指南 安装 denseflow。
- 若你拥有大容量 SSD,建议把帧存放在 SSD 上以获得更好的 I/O 性能。可通过软链接将 rawframes 目录指到 SSD:
# 假设 SSD 挂载在 /mnt/SSD/ mkdir /mnt/SSD/hmdb51_extracted/ ln -s /mnt/SSD/hmdb51_extracted/ ../../../data/hmdb51/rawframes4.2 方案 A:仅抽取 RGB 帧(denseflow)
光流抽取比较耗时,若只想用 RGB 帧训练,运行:
bash extract_rgb_frames.sh对应脚本 tools/data/hmdb51/extract_rgb_frames.sh 的核心命令为:
python build_rawframes.py ../../data/hmdb51/videos/ ../../data/hmdb51/rawframes/ --task rgb --level 2 --ext avi4.3 方案 B:未安装 denseflow 时用 OpenCV 抽帧
若未安装 denseflow,可改用 OpenCV 抽取 RGB 帧:
bash extract_rgb_frames_opencv.sh对应脚本 tools/data/hmdb51/extract_rgb_frames_opencv.sh 增加了--use-opencv参数。需要留意的是:OpenCV 方式会保留视频原始分辨率,不会像 denseflow 那样做缩放(若需固定尺寸,需在配置的数据预处理管线中自行处理)。
4.4 方案 C:同时抽取 RGB 帧与光流(tvl1 算法)
如果需要 RGB 与光流两路输入,运行:
bash extract_frames.sh对应脚本 tools/data/hmdb51/extract_frames.sh 的核心命令为:
python build_rawframes.py ../../data/hmdb51/videos/ ../../data/hmdb51/rawframes/ --task both --level 2 --flow-type tvl14.5 抽帧脚本 build_rawframes.py 的参数详解
上述命令统一调用仓库工具 tools/data/build_rawframes.py,其支持的参数(源码parse_args部分)包括:
| 参数 | 默认值 | 可选值/说明 |
|---|---|---|
src_dir/out_dir | 必填 | 视频源目录 / 帧输出目录 |
--task | flow | rgb、flow、both,抽取帧类型 |
--level | 2 | 1或2,视频目录层级(HMDB51 为类别/视频两级) |
--num-worker | 8 | 抽帧并行进程数 |
--flow-type | None | tvl1、warp_tvl1、farn、brox,光流算法 |
--out-format | jpg | jpg、h5、png,输出帧格式 |
--ext | avi | avi、mp4、webm,源视频扩展名 |
--mixed-ext | 关闭 | 处理混合扩展名的视频 |
--new-width/--new-height | 0 | 抽帧时统一缩放的目标宽/高(0 表示不缩放) |
--new-short | 0 | 按短边缩放并保持长宽比 |
--num-gpu | 8 | GPU 数量(并行相关) |
--resume | 关闭 | 断点续抽,跳过--report-file中已成功的视频 |
--use-opencv | 关闭 | 使用 OpenCV 抽取 RGB 帧 |
--input-frames | 关闭 | 基于已有 RGB 帧计算光流(而非从视频直接计算) |
--report-file | build_report.txt | 记录已成功处理视频的文件 |
从源码实现看,denseflow 抽帧时底层通过命令行拼接执行,例如 RGB 任务会生成denseflow '{video}' -b=20 -s=0 -o='{out_dir}' -nw=... -nh=... -v之类的命令;task == 'both'时则分别生成 RGB 与光流两条 denseflow 命令。所有任务通过多进程Pool并行执行(见源码main末尾的pool.map)。当使用--resume时,脚本会读取--report-file中已经成功的视频路径,仅处理剩余部分,这在数据集大、训练中断时非常实用。
4.6 抽帧产物说明
- 使用 denseflow 抽出的 RGB 帧命名为
img_00001.jpg、img_00002.jpg…; - 光流帧分为两个方向,命名为
flow_x_00001.jpg、flow_y_00001.jpg…; - 每个视频对应一个以视频名命名的子目录,位于对应类别目录下。
5. 步骤四:生成文件列表
文件列表是 MMAction2 数据集配置(ann_file)所必需的 txt 文件,每行描述一个样本。运行以下两个脚本分别生成 rawframes 与 videos 两种格式的列表:
bash generate_rawframes_filelist.sh bash generate_videos_filelist.sh5.1 脚本调用的核心工具
对应脚本 tools/data/hmdb51/generate_rawframes_filelist.sh 与 tools/data/hmdb51/generate_videos_filelist.sh 均调用仓库工具 tools/data/build_file_list.py:
# rawframes 格式 PYTHONPATH=. python tools/data/build_file_list.py hmdb51 data/hmdb51/rawframes/ --level 2 --format rawframes --shuffle # videos 格式 PYTHONPATH=. python tools/data/build_file_list.py hmdb51 data/hmdb51/videos/ --level 2 --format videos --shuffle其中--shuffle表示对生成的列表做随机打乱。
5.2 HMDB51 列表的生成逻辑
在 tools/data/parse_file_list.py 的parse_hmdb51_split函数中,列表生成包含以下关键逻辑:
- 自动生成
classInd.txt:按data/hmdb51/videos下的类别目录名排序,为每个类别赋予从 1 开始的类别 ID,写入data/hmdb51/annotations/classInd.txt(格式与 UCF101 的ClassInd.txt一致:id 类名); - 读取官方划分:遍历 51 个类别的
{class}_test_split{i}.txt(i取 1、2、3),将标记为1的行归入训练集、标记为2的行归入测试集,并拼上类别 ID; - 生成
trainlist{i}.txt与testlist{i}.txt:即data/hmdb51/annotations/trainlist01.txt、testlist01.txt、trainlist02.txt…; - 类别 ID 修正:读取
classInd.txt后建立「类名 → 0 起始 ID」的映射(int(x[0]) - 1),最终列表中的标签为0 ~ 50,与 MMAction2 的类别计数(51 类)对齐。
5.3 文件列表内容格式
生成的列表位于data/hmdb51/下,命名形如:
hmdb51_train_split_{1,2,3}_rawframes.txt hmdb51_val_split_{1,2,3}_rawframes.txt hmdb51_train_split_{1,2,3}_videos.txt hmdb51_val_split_{1,2,3}_videos.txt- rawframes 格式的每行:
相对路径 帧总数 标签(帧总数取自parse_directory对目录内帧的统计,见 tools/data/build_file_list.py 中frame_info的构造); - videos 格式的每行:
视频相对路径 标签(此时帧数记为-1)。
这两类列表分别对应VideoDataset与RawframeDataset的ann_file输入。例如 mmaction/datasets/video_dataset.py 中VideoDataset会逐行读取ann_file,并结合data_prefix['video']拼接出完整视频路径。
6. 步骤五:检查目录结构
完成上述流程后,在仓库根目录下,HMDB51 相关的目录结构应形如:
mmaction2 ├── mmaction ├── tools ├── configs ├── data │ ├── hmdb51 │ │ ├── hmdb51_{train,val}_split_{1,2,3}_rawframes.txt │ │ ├── hmdb51_{train,val}_split_{1,2,3}_videos.txt │ │ ├── annotations │ │ ├── videos │ │ │ ├── brush_hair │ │ │ │ ├── April_09_brush_hair_u_nm_np1_ba_goo_0.avi │ │ │ ├── wave │ │ │ │ ├── 20060723sfjffbartsinger_wave_f_cm_np1_ba_med_0.avi │ │ ├── rawframes │ │ │ ├── brush_hair │ │ │ │ ├── April_09_brush_hair_u_nm_np1_ba_goo_0 │ │ │ │ │ ├── img_00001.jpg │ │ │ │ │ ├── img_00002.jpg │ │ │ │ │ ├── ... │ │ │ │ │ ├── flow_x_00001.jpg │ │ │ │ │ ├── flow_x_00002.jpg │ │ │ │ │ ├── ... │ │ │ │ │ ├── flow_y_00001.jpg │ │ │ │ │ ├── flow_y_00002.jpg │ │ │ ├── ... │ │ │ ├── wave │ │ │ │ ├── 20060723sfjffbartsinger_wave_f_cm_nm_p1_ba_med_0 │ │ │ │ ├── ... │ │ │ │ ├── winKen_wave_u_cm_np1_ri_bad_1annotations目录下应包含每类视频的官方划分文件(如brush_hair_test_split1.txt)、classInd.txt,以及trainlist{1,2,3}.txt、testlist{1,2,3}.txt。
7. 数据验证与后续训练
7.1 数据完整性检查
在正式训练前,可以使用仓库的检查工具对视频文件做一遍完整性校验:
python tools/analysis_tools/check_videos.py data/hmdb51/videos/ data/hmdb51/hmdb51_train_split_1_videos.txt(具体参数以 tools/analysis_tools/check_videos.py 的--help输出为准。)该校验可提前发现损坏或缺失的视频,避免训练中途报错。
7.2 基于 HMDB51 的训练示例
仓库中已有以 HMDB51 为目标的现成配置,例如 PoseC3D 骨架动作识别配置 configs/skeleton/posec3d/slowonly_kinetics400-pretrained-r50_8xb16-u48-120e_hmdb51-split1-keypoint.py,其分类头num_classes=51,并定义了完整的 train/val/test pipeline 与调度器,可直接作为骨架识别(skeleton-based)任务在 HMDB51 上微调的参考。该配置的load_from使用 Kinetics-400 预训练的 PoseC3D 权重,说明 HMDB51 也常用于验证「预训练 + 下游微调」范式。
对于 RGB 识别任务,可仿照仓库中 configs/recognition 下的 TSN、TSM、SlowFast 等配置,将dataset_type、ann_file指向data/hmdb51/hmdb51_train_split_1_rawframes.txt(或videos.txt),并将num_classes设为 51。
7.3 训练与测试入口
数据准备完成后,HMDB51 的训练与测试流程与其他数据集完全一致,可参照官方 训练与测试教程 使用 tools/train.py 与 tools/test.py 完成训练、评估与推理。注意仓库为纯只读数据准备指南,训练脚本仅用于本地运行,无需修改仓库文件。
8. 常见问题与注意事项
- 下载失败/证书问题:官方源使用 HTTPS,脚本已带
--no-check-certificate;若网络受限,可考虑代理或更换下载源(脚本本身不含重试逻辑,可手动重跑)。 unrar未安装:会报unrar: command not found,请先安装unrar;无 sudo 环境可参考文首提到的免 sudo 安装方式。- 抽帧与训练格式匹配:使用 OpenCV 抽帧会保留原始分辨率,而 denseflow 支持
--new-short/--new-width/--new-height缩放,两种产物的尺寸不一致时需在训练配置的数据增强(如Resize、CenterCrop)中统一处理。 - 多进程资源占用:
build_rawframes.py默认--num-worker 8、--num-gpu 8,在机器资源紧张时可适当调低。 - 类别标签从 0 开始:
build_file_list.py生成的标签为 0~50(源码中将classInd.txt的 ID 减 1),配置中num_classes统一为 51,避免出现「类别数不匹配」错误。
总结
本文完整复现了 MMAction2 中 HMDB51 数据集的五步准备流程:下载标注、下载视频、抽帧(denseflow/OpenCV/tvl1 三种方案)、生成文件列表、校验目录结构,并结合 tools/data/build_rawframes.py、tools/data/build_file_list.py、tools/data/parse_file_list.py 等源码剖析了每个脚本的底层行为与关键参数。按照上述流程操作后,你将获得一份可直接用于 MMAction2 训练、验证与测试的 HMDB51 数据集,并能够在此基础上配置 TSN、TSM、SlowFast、PoseC3D 等模型进行动作识别实验。
- 人工智能
- 计算机视觉
- 深度学习
【免费下载链接】mmaction2
OpenMMLab's Next Generation Video Understanding Toolbox and Benchmark
相关推荐
MMAction2 实战:UCF-101 数据集完整准备指南(标注下载、视频处理、帧与光流抽取、文件列表生成)
MMAction2 实战:UCF 101 数据集完整准备指南(标注下载、视频处理、帧与光流抽取、文件列表生成) 导读 本文基于 MMAction2 仓库中 to
人工智能计算机视觉深度学习MMAction2 实战:UCF-101 数据集准备全流程指南(标注下载、视频处理、帧/光流抽取与文件列表生成)
MMAction2 实战:UCF 101 数据集准备全流程指南(标注下载、视频处理、帧/光流抽取与文件列表生成) 本指南以 tools/data/ucf101/
人工智能计算机视觉深度学习MMAction2 的 AVA-Kinetics 数据集准备指南:从 Kinetics700 裁剪、RGB 帧提取到标注与提案合并的完整流程
MMAction2 的 AVA Kinetics 数据集准备指南:从 Kinetics700 裁剪、RGB 帧提取到标注与提案合并的完整流程 AVA Kinet
人工智能计算机视觉深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考