ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MMAction2 中 HMDB51 数据集的完整准备指南:标注下载、视频获取与帧/光流提取

MMAction2 中 HMDB51 数据集的完整准备指南:标注下载、视频获取与帧/光流提取
  • 人工智能
  • 计算机视觉
  • 深度学习

【免费下载链接】mmaction2

OpenMMLab's Next Generation Video Understanding Toolbox and Benchmark

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

导读

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 1

1表示属于训练集(2表示属于测试集),这是 HMDB51 官方的 7030 划分(约 70% 训练、30% 测试)。

提示:download_annotations.sh脚本最后执行了rm test_train_splits.rar清理压缩包,这是脚本自身的清理行为;请勿手动删除已经解压好的标注文件。

3. 步骤二:下载并解压视频

运行 tools/data/hmdb51/download_videos.sh:

bash download_videos.sh

脚本的执行流程(对应仓库源码):

  1. 创建data/hmdb51/videos目录;
  2. 下载官方原始视频压缩包hmdb51_org.rar;
  3. unrar x ./hmdb51_org.rar解压得到按类别打包的多个子压缩包;
  4. 遍历解压出的所有.rar子压缩包(每个类别一个),逐个unrar x解压出视频;
  5. 清理全部.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.avi

4. 步骤三:抽取 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/rawframes

4.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 avi

4.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 tvl1

4.5 抽帧脚本 build_rawframes.py 的参数详解

上述命令统一调用仓库工具 tools/data/build_rawframes.py,其支持的参数(源码parse_args部分)包括:

参数默认值可选值/说明
src_dir/out_dir必填视频源目录 / 帧输出目录
--taskflowrgb、flow、both,抽取帧类型
--level21或2,视频目录层级(HMDB51 为类别/视频两级)
--num-worker8抽帧并行进程数
--flow-typeNonetvl1、warp_tvl1、farn、brox,光流算法
--out-formatjpgjpg、h5、png,输出帧格式
--extaviavi、mp4、webm,源视频扩展名
--mixed-ext关闭处理混合扩展名的视频
--new-width/--new-height0抽帧时统一缩放的目标宽/高(0 表示不缩放)
--new-short0按短边缩放并保持长宽比
--num-gpu8GPU 数量(并行相关)
--resume关闭断点续抽,跳过--report-file中已成功的视频
--use-opencv关闭使用 OpenCV 抽取 RGB 帧
--input-frames关闭基于已有 RGB 帧计算光流(而非从视频直接计算)
--report-filebuild_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.sh

5.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函数中,列表生成包含以下关键逻辑:

  1. 自动生成classInd.txt:按data/hmdb51/videos下的类别目录名排序,为每个类别赋予从 1 开始的类别 ID,写入data/hmdb51/annotations/classInd.txt(格式与 UCF101 的ClassInd.txt一致:id 类名);
  2. 读取官方划分:遍历 51 个类别的{class}_test_split{i}.txt(i取 1、2、3),将标记为1的行归入训练集、标记为2的行归入测试集,并拼上类别 ID;
  3. 生成trainlist{i}.txt与testlist{i}.txt:即data/hmdb51/annotations/trainlist01.txt、testlist01.txt、trainlist02.txt…;
  4. 类别 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_1

annotations目录下应包含每类视频的官方划分文件(如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. 常见问题与注意事项

  1. 下载失败/证书问题:官方源使用 HTTPS,脚本已带--no-check-certificate;若网络受限,可考虑代理或更换下载源(脚本本身不含重试逻辑,可手动重跑)。
  2. unrar未安装:会报unrar: command not found,请先安装unrar;无 sudo 环境可参考文首提到的免 sudo 安装方式。
  3. 抽帧与训练格式匹配:使用 OpenCV 抽帧会保留原始分辨率,而 denseflow 支持--new-short/--new-width/--new-height缩放,两种产物的尺寸不一致时需在训练配置的数据增强(如Resize、CenterCrop)中统一处理。
  4. 多进程资源占用:build_rawframes.py默认--num-worker 8、--num-gpu 8,在机器资源紧张时可适当调低。
  5. 类别标签从 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

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

相关推荐

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进