本文共 3975 字,大约阅读时间需要 13 分钟。
mmaction2是一个基于SlowFast网络的强大的视频动作识别框架,旨在高效识别人类行为。该项目主要包含行人检测、追踪和行为识别三个模块。本文将详细介绍从项目搭建到模型训练及测试的实践经验和问题解决方案。
首先,我在自己的ubuntu18.04系统上创建了一个专门用于mmaction2的anaconda环境。以下是具体操作步骤:
# 进入mmaction2根目录cd $MMACTION2# 创建并激活新的环境conda create -n mmaction2-pytorch1.5-py3.6 -ypython=3.6conda activate mmaction2-pytorch1.5-py3.6# 安装必要的库pip install torch==1.5.0+cu101 torchvision==0.6.0+cu101 -f https://download.pytorch.org/whl/torch_stable.htmlpip install -r requirements/build.txtpython setup.py developpip install decord -i https://pypi.douban.com/simple
在之前的博客中,已经提供了数据下载链接。下载完成后,我按照如下方式组织数据:
创建必要的目录结构:
./Dataset/ucf101/├── videos/└── annotations/
解压并重命名文件:
UCF-101.tar.gz
解压后重命名为 videos/UCF-101
ucfTrainTestList.tar.gz
解压后重命名为 annotations/ucfTrainTestList
为了便于后续处理,我执行了以下脚本:
cd tools/data/python./build_rawframes.py --task rgb --level 2 --ext avi --new-short 0 --new-width 320 --new-height 240./generate_rawframes_filelist.sh./generate_videos_filelist.sh
这样处理后,数据目录结构变为:
./data/ucf101/rawframes/├── test/| └── 01/| └── 00/| └── rawframes/| └── video_320_240_.ToLower(abcdef).avi├── train/| └── 01/| └── 00/| └── rawframes/| └── video_320_240_.ToLower(abcdef).avi└── val/ └── 01/ └── 00/ └── rawframes/ └── video_320_240_ToLower(abcdef).avi
我选择了一个预先配置好的SlowFast模型进行训练:
configs/recognition/slowfast/my_slowfast_r50_4x16x1_256e_ucf101_rgb.py
在修改配置文件时,特别关注以下部分:
# 原始配置# test_cfg = dict(average_clips=None)# dataset_type = 'RawframeDataset'# data_root = 'data/kinetics400/rawframes_train'# data_root_val = 'data/kinetics400/rawframes_val'# ann_file_train = 'data/kinetics400/kinetics400_train_list_rawframes.txt'# ann_file_val = 'data/kinetics400/kinetics400_val_list_rawframes.txt'# ann_file_test = 'data/kinetics400/kinetics400_val_list_rawframes.txt'# dataset_type = 'RawframeDataset'# data_root = 'data/ucf101/rawframes'# data_root_val = 'data/ucf101/rawframes'# ann_file_train = 'data/ucf101/ucf101_train_split_1_rawframes.txt'# ann_file_val = 'data/ucf101/ucf101_val_split_1_rawframes.txt'# ann_file_test = 'data/ucf101/ucf101_val_split_1_rawframes.txt'# 修改后的配置dataset_type = 'VideoDataset'data_root = 'data/ucf101/videos'data_root_val = 'data/ucf101/videos'ann_file_train = 'data/ucf101/ucf101_train_split_1_videos.txt'ann_file_val = 'data/ucf101/ucf101_val_split_1_videos.txt'ann_file_test = 'data/ucf101/ucf101_val_split_1_videos.txt'
执行训练命令时,我优化了训练策略:
python tools/train.py configs/recognition/slowfast/my_slowfast_r50_4x16x1_256e_ucf101_rgb.py--work-dir work_dirs/my_slowfast_r50_4x16x1_256e_ucf101_rgb--validate--seed 0--deterministic
在训练过程中遇到了KeyError: 'CosineAnealingLrUpdaterHook is not in the hook registry'
错误。这是由于某些配置文件中的学习率策略不存在。此解决方法是修改train_pipeline
和val_pipeline
的间隔设置:
train_pipeline = [ dict(type='DecordInit'), dict(type='SampleFrames', clip_len=16, frame_interval=2, num_clips=1), dict(type='DecordDecode'), dict(type='Resize', scale=(-1, 256)),]val_pipeline = [ dict(type='DecordInit'), dict(type='SampleFrames', clip_len=16, frame_interval=2, num_clips=1, test_mode=True), dict(type='DecordDecode'), dict(type='Resize', scale=(-1, 256)),]
由于显存不足,调整了训练interval:
# 原始配置# checkpoint_config = dict(interval=4)# 修改后的配置checkpoint_config = dict(interval=1)
这样设置后,每个epoch结束后保存一次模型,减少显存压力。
训练完成后,模型的输出路径在work_dirs/my_slowfast_r50_4x16x1_256e_ucf101_rgb/epoch_1.pth
。通过测试指标可知,这次训练成功识别了多个动作类别。
为了评估模型性能,我运行了测试脚本:
python tools/test.py configs/recognition/slowfast/my_slowfast_r50_4x16x1_256e_ucf101_rgb.pywork_dirs/my_slowfast_r50_4x16x1_256e_ucf101_rgb/epoch_1.pth--eval top_k_accuracy mean_class_accuracy--out result.json--average-clips=prob
测试结果显示,模型准确率达到了预期水平,验证了训练效果的正确性。
通过以上实践,我成功地在本地环境中搭建了mmaction2框架,并完成了UCF101基准集的视频动作识别任务。未来,我计划深入研究SlowFast网络的原理,以及如何优化其性能和训练逻辑,以应对更复杂的视频数据和更大规模的动作识别任务。
如需进一步了解SlowFast网络的细节或有其他问题欢迎随时联系!
转载地址:http://xvigz.baihongyu.com/