基于PyTorch的3D ResNet视频动作识别训练全流程
环境搭建与数据预处理
要运行3D ResNet模型进行动作识别任务,首先需要配置基础开发环境。推荐使用Python 3搭配PyTorch 0.4及以上版本,并通过以下命令安装核心依赖:
conda install pytorch torchvision cudatoolkit=10.1 -c soumith
同时需确保系统中已安装FFmpeg和FFprobe,用于视频帧提取。项目源码可通过Git获取:
git clone https://gitcode.com/gh_mirrors/3d/3D-ResNets-PyTorch
数据集组织结构
支持Kinetics、UCF-101、HMDB-51等多种常见动作识别数据集。建议将数据按如下目录结构存放:
~/data/
├── kinetics_videos/
│ └── jpg/
│ └── class_name/
│ └── video_id/
│ ├── frame_0001.jpg
│ └── ...
├── kinetics.json
└── results/
使用util_scripts/generate_video_jpgs.py脚本将原始视频转换为连续图像帧,并通过kinetics_json.py生成对应的标注文件。
模型架构与关键参数设置
该框架提供多种3D卷积网络结构,可通过参数灵活选择:
- ResNet: 支持深度为10, 18, 34, 50, 101, 152, 200的变体(定义于models/resnet.py)
- ResNeXt: 提供50/101/152/200层版本
- R(2+1)D: 实现时空分离卷积(models/resnet2p1d.py)
常用训练参数包括:
| 参数名 | 说明 |
|---|---|
| --batch_size | 批量大小,多GPU下可设为128 |
| --n_threads | 数据加载线程数,通常设为4 |
| --learning_rate 或 --lr | 初始学习率,默认0.1 |
| --checkpoint | 每隔N个epoch保存一次模型 |
完整训练流程示例
以在Kinetics-700上训练ResNet-50为例,执行以下命令启动训练:
python main.py \
--root_path ~/data \
--video_path kinetics_videos/jpg \
--annotation_path kinetics.json \
--result_path results \
--dataset kinetics \
--model resnet \
--model_depth 50 \
--n_classes 700 \
--batch_size 128 \
--n_threads 4 \
--checkpoint 5
若需指定使用的GPU设备,可在命令前添加环境变量:
CUDA_VISIBLE_DEVICES=0,1 python main.py ...
训练过程中模型权重会自动保存至results/目录,命名格式为save_{epoch}.pth。
断点续训与模型推理
从指定检查点恢复训练:
python main.py \
--resume_path results/save_100.pth \
--model_depth 50 \
--n_classes 700 \
...
启用推理模式对视频进行分类预测:
python main.py \
--resume_path results/save_200.pth \
--no_train --no_val --inference \
--output_topk 5 \
...
预测结果将以JSON格式输出,包含每个样本的Top-K类别及其置信度分数。
性能评估方法
使用内置脚本计算分类准确率:
python -m util_scripts.eval_accuracy \
~/data/kinetics.json ~/data/results/val.json \
--subset val -k 1 --ignore
主要评估指标包括Top-1和Top-5准确率,可用于衡量模型在视频级动作识别上的表现能力。
迁移学习实践
利用Kinetics预训练权重微调至UCF-101数据集:
python main.py \
--dataset ucf101 \
--video_path ucf101_videos/jpg \
--annotation_path ucf101_01.json \
--n_classes 101 \
--pretrain_path models/resnet-50-kinetics.pth \
--n_pretrain_classes 700 \
--ft_begin_module fc \
--model resnet --model_depth 50
其中--ft_begin_module fc表示仅从全连接层开始微调,其余层冻结参数。
优化策略与问题排查
提升性能的方法:
- 增强数据:修改spatial_transforms.py和temporal_transforms.py添加随机裁剪、水平翻转等操作
- 调整学习率调度:在opts.py中自定义衰减策略
- 模型集成:融合不同深度网络的预测结果
常见问题解决方案:
- 显存不足:降低
--batch_size或设置--inference_batch_size - 数据读取慢:增加
--n_threads或将图像转为HDF5格式存储 - 预训练权重不匹配:确认使用的是2020年4月之后更新的兼容版本