资讯动态

MMAction2 模型微调实战指南:从 Kinetics-400 预训练模型迁移到自定义数据集

发布时间:2026/10/13 6:02:53 来源:尧图企业网站定制
人工智能计算机视觉深度学习【免费下载链接】mmaction2OpenMMLabs Next Generation Video Understanding Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmaction2点击查看免费下载本篇指南围绕 MMAction2 的模型微调Finetuning主题展开完整讲解如何复用仓库中基于大型数据集如 Kinetics-400训练好的视频理解模型通过修改配置将其迁移到 UCF101 等新数据集上以获得更好的下游任务性能。读完本文你将掌握模板配置的选择与复制、分类头类别数修改、数据集路径与注释文件配置、训练计划学习率与周期调整、预训练权重加载以及单卡/多卡训练命令的完整实战方案。微调的整体流程在 MMAction2 中将一个模型微调到新数据集上通常分为两步为新数据集添加支持包括准备数据文件和注释文件参见 准备数据集 与 自定义数据集。修改配置文件即本指南的核心内容。在配置系统中针对不存在的键需要新增针对已存在的键需要修改二者缺一不可。以官方提供的 TSN 模板配置tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py位于 configs/recognition/tsn/为例微调需要重点关注四个部分分类头Head、数据集Dataset、训练计划Training Schedule和预训练模型加载load_from。选择模板配置首先把模板配置复制到相同目录下并重命名。本例将其改名为tsn_ucf101.py作为 UCF101 微调的基础cp configs/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py \ configs/recognition/tsn/tsn_ucf101.py选择模板时可以从配置文件命名读懂其全部信息。按照 配置系统教程 的命名约定{algorithm info}_{module info}_{training info}_{data info}.pytsn算法为 TSNTemporal Segment Networksimagenet-pretrained主干网络使用 ImageNet 预训练权重r50主干为 ResNet-508xb328 卡 × 每卡 32 个样本1x1x3采样参数clip_len x frame_interval x num_clips即每段取 1 帧、间隔 1 帧、共 3 个片段100e训练 100 个 epochkinetics400-rgb训练数据为 Kinetics-400 的 RGB 模态。_base_继承机制决定了模板配置由三类基础配置组合而成详见 configs/base/models/tsn_r50.py、configs/base/schedules/sgd_100e.py 与 configs/base/default_runtime.py。修改分类头Modify Head新数据集的类别数通常与预训练数据集不同因此必须修改cls_head中的num_classes。预训练模型的权重除最后一层预测层fc_cls外都会被复用所以修改类别数是安全且必要的。本例中 UCF101 共有 101 个类别需要把 Kinetics-400 的 400 改为 101# model settings model dict( cls_headdict( typeTSNHead, num_classes101 # change from 400 to 101 ))从源码角度看TSNHead 在__init__中通过nn.Linear(self.in_channels, self.num_classes)构建fc_cls全连接层输出维度由num_classes决定其init_weights仅对fc_cls做标准差为init_std默认 0.01的正态初始化其余层复用预训练权重。因此改动num_classes只会重建输出层不会破坏主干特征提取能力。修改类别数时需同步确认几个关联配置model.cls_head.in_channels主干输出的通道数ResNet-50 为 2048一般无需改动model.cls_head.average_clips测试时多个 clip 预测结果的聚合方式默认prob按概率平均model.cls_head.consensusTSN 的片段级共识模块默认dict(typeAvgConsensus, dim1)。修改数据集Modify DatasetMMAction2 原生支持 UCF101、Kinetics-400、Moments in Time、Multi-Moments in Time、THUMOS14、Something-Something V1V2、ActivityNet 等数据集。对于仓库未内置的新数据集需要参考 准备数据集 和 自定义数据集 将其整理为已有数据集类型支持的格式。UCF101 已被多种数据集类型支持这里直接使用VideoDataset。需要修改以下四个关键键# dataset settings dataset_type VideoDataset data_root data/ucf101/videos_train/ data_root_val data/ucf101/videos_val/ ann_file_train data/ucf101/ucf101_train_list.txt ann_file_val data/ucf101/ucf101_val_list.txt从 VideoDataset 实现 可以确认注释文件的格式一个纯文本文件每行表示一个样本视频由相对路径和类别标签以空格分隔some/path/000.mp4 1 some/path/001.mp4 1 some/path/002.mp4 2load_data_list会按data_prefix即data_root拼接相对路径因此注释文件里应写相对路径而非绝对路径同时支持多标签multi_classTrue时每行可含多个标签和推理用无标签行标签自动置为 -1。数据集准备细节含tools/data/下各数据集的 shell 脚本请参考 准备数据集。数据加载流程由train_pipeline/val_pipeline/test_pipeline定义。模板中训练阶段使用DecordInitSampleFramesclip_len1, frame_interval1, num_clips3MultiScaleCrop输入 224尺度(1, 0.875, 0.75, 0.66)Flip概率 0.5做数据增强验证阶段用CenterCrop测试阶段用num_clips25TenCrop做多视角评估。若新数据集数据量较小可适当降低增强强度以避免过拟合。修改训练计划Modify Training Schedule微调通常需要更小的学习率和更少的训练周期以防破坏预训练特征。模板的 100 epoch 计划位于 configs/base/schedules/sgd_100e.py微调时修改如下train_cfg dict( typeEpochBasedTrainLoop, max_epochs50, # change from 100 to 50 val_begin1, val_interval1) val_cfg dict(typeValLoop) test_cfg dict(typeTestLoop) # learning policy param_scheduler [ dict( typeMultiStepLR, begin0, end50, # change from 100 to 50 by_epochTrue, milestones[20, 40], # change milestones gamma0.1) ] # optimizer optim_wrapper dict( optimizerdict( typeSGD, lr0.005, # change from 0.01 to 0.005 momentum0.9, weight_decay0.0001), clip_graddict(max_norm40, norm_type2))各关键参数的调整要点max_epochs从 100 缩减到 50可按新数据集规模进一步调整milestones学习率衰减节点需与max_epochs匹配本例从[40, 80]改为[20, 40]即学习率在 20/40 epoch 时各乘以gamma0.1lr初始学习率从 0.01 降为 0.005。若新数据集较小可进一步降到 0.001 量级clip_grad梯度裁剪max_norm40, norm_type2建议保留可防止微调初期梯度爆炸。另外配置末尾的auto_scale_lrenableFalse, base_batch_size256表示默认不自动缩放学习率base_batch_size 8 GPUs × 32 samples per GPU。若实际使用的 GPU 数或 batch size 不同可通过--auto-scale-lr参数开启自动按批量大小缩放学习率。使用预训练模型Use Pre-Trained Model要让预训练权重加载到整个网络在配置中设置load_from。基础配置 configs/base/default_runtime.py 中默认load_from None得益于配置系统的继承设计子配置只需直接覆盖该键即可# use the pre-trained model for the whole TSN network load_from https://download.openmmlab.com/mmaction/v1.0/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb_20220906-cd10898e.pth # model path can be found in model zoo预训练权重下载地址可以从对应模型的 metafile.yml 的Weights字段获取也可以从 Model Zoo 页面查找。加载时的注意事项load_from只负责加载权重不负责恢复训练状态若希望断点续训应使用resume或tools/train.py的--resume参数预训练模型默认加载整个网络的权重若只希望冻结主干或加载部分层可通过tools/train.py的--cfg-options或自定义init_cfg实现类别数不一致时fc_cls层的权重因输出维度不同会自然跳过加载这正是先修改num_classes再加载预训练权重的顺序要求。完整的微调配置文件将上述修改汇总即可得到一份完整的微调配置。下面给出完整展开版便于理解全部细节_base_ [ ../../_base_/models/tsn_r50.py, ../../_base_/schedules/sgd_100e.py, ../../_base_/default_runtime.py ] # model settings model dict( cls_headdict( typeTSNHead, num_classes101 # change from 400 to 101 )) # dataset settings dataset_type VideoDataset data_root data/ucf101/videos_train/ data_root_val data/ucf101/videos_val/ ann_file_train data/ucf101/ucf101_train_list.txt ann_file_val data/ucf101/ucf101_val_list.txt file_client_args dict(io_backenddisk) train_pipeline [ dict(typeDecordInit, **file_client_args), dict(typeSampleFrames, clip_len1, frame_interval1, num_clips3), dict(typeDecordDecode), dict(typeResize, scale(-1, 256)), dict( typeMultiScaleCrop, input_size224, scales(1, 0.875, 0.75, 0.66), random_cropFalse, max_wh_scale_gap1), dict(typeResize, scale(224, 224), keep_ratioFalse), dict(typeFlip, flip_ratio0.5), dict(typeFormatShape, input_formatNCHW), dict(typePackActionInputs) ] val_pipeline [ dict(typeDecordInit, **file_client_args), dict( typeSampleFrames, clip_len1, frame_interval1, num_clips3, test_modeTrue), dict(typeDecordDecode), dict(typeResize, scale(-1, 256)), dict(typeCenterCrop, crop_size224), dict(typeFormatShape, input_formatNCHW), dict(typePackActionInputs) ] test_pipeline [ dict(typeDecordInit, **file_client_args), dict( typeSampleFrames, clip_len1, frame_interval1, num_clips25, test_modeTrue), dict(typeDecordDecode), dict(typeResize, scale(-1, 256)), dict(typeTenCrop, crop_size224), dict(typeFormatShape, input_formatNCHW), dict(typePackActionInputs) ] train_dataloader dict( batch_size32, num_workers8, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleTrue), datasetdict( typedataset_type, ann_fileann_file_train, data_prefixdict(videodata_root), pipelinetrain_pipeline)) val_dataloader dict( batch_size32, num_workers8, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleFalse), datasetdict( typedataset_type, ann_fileann_file_val, data_prefixdict(videodata_root_val), pipelineval_pipeline, test_modeTrue)) test_dataloader dict( batch_size1, num_workers8, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleFalse), datasetdict( typedataset_type, ann_fileann_file_val, data_prefixdict(videodata_root_val), pipelinetest_pipeline, test_modeTrue)) train_cfg dict( typeEpochBasedTrainLoop, max_epochs50, # change from 100 to 50 val_begin1, val_interval1) val_cfg dict(typeValLoop) test_cfg dict(typeTestLoop) # learning policy param_scheduler [ dict( typeMultiStepLR, begin0, end50, # change from 100 to 50 by_epochTrue, milestones[20, 40], # change milestones gamma0.1) ] # optimizer optim_wrapper dict( optimizerdict( typeSGD, lr0.005, # change from 0.01 to 0.005 momentum0.9, weight_decay0.0001), clip_graddict(max_norm40, norm_type2)) val_evaluator dict(typeAccMetric) test_evaluator val_evaluator default_hooks dict(checkpointdict(interval3, max_keep_ckpts3)) # Default setting for scaling LR automatically # - enable means enable scaling LR automatically # or not by default. # - base_batch_size (8 GPUs) x (32 samples per GPU). auto_scale_lr dict(enableFalse, base_batch_size256) # use the pre-trained model for the whole TSN network load_from https://download.openmmlab.com/mmaction/v1.0/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb_20220906-cd10898e.pth更简洁的继承写法更推荐的做法是直接继承模板配置只覆盖需要修改的键。注意自定义配置必须与configs/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py放在同一目录下_base_中直接写模板文件名即可_base_ [ tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb.py # inherit template config ] # model settings model dict( cls_headdict( typeTSNHead, num_classes101)) # change from 400 to 101 # dataset settings dataset_type VideoDataset data_root data/ucf101/videos_train/ data_root_val data/ucf101/videos_val/ ann_file_train data/ucf101/ucf101_train_list.txt ann_file_val data/ucf101/ucf101_val_list.txt train_dataloader dict( datasetdict( ann_fileann_file_train, data_prefixdict(videodata_root))) val_dataloader dict( datasetdict( ann_fileann_file_val, data_prefixdict(videodata_root_val))) test_dataloader dict( datasetdict( ann_fileann_file_val, data_prefixdict(videodata_root_val))) train_cfg dict( typeEpochBasedTrainLoop, max_epochs50, # change from 100 to 50 val_begin1, val_interval1) val_cfg dict(typeValLoop) test_cfg dict(typeTestLoop) param_scheduler [ dict( typeMultiStepLR, begin0, end50, # change from 100 to 50 by_epochTrue, milestones[20, 40], # change milestones gamma0.1) ] optim_wrapper dict( optimizerdict( typeSGD, lr0.005, # change from 0.01 to 0.005 momentum0.9, weight_decay0.0001), clip_graddict(max_norm40, norm_type2)) # use the pre-trained model for the whole TSN network load_from https://download.openmmlab.com/mmaction/v1.0/recognition/tsn/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb/tsn_imagenet-pretrained-r50_8xb32-1x1x3-100e_kinetics400-rgb_20220906-cd10898e.pth这种继承写法大幅减少重复代码同时天然继承了模板中经过验证的 pipeline、dataloader、evaluator 与 hooks 配置是官方推荐实践。关于配置继承层级、--cfg-options运行时改参等更多细节可阅读 配置系统教程。启动训练使用 tools/train.py 即可开始微调python tools/train.py ${CONFIG_FILE} [optional arguments]确定性训练示例固定随机种子并开启 CUDNN 确定性python tools/train.py configs/recognition/tsn/tsn_ucf101.py \ --seed0 --deterministictools/train.py支持的常用参数详见 tools/train.py 的parse_args--work-dir指定日志和模型保存目录默认为./work_dirs/{配置文件文件名}--resume断点续训。指定 checkpoint 路径则从该权重恢复传auto则自动从 work_dir 中最新的 checkpoint 恢复--amp开启自动混合精度AMP训练--no-validate训练期间不执行验证--auto-scale-lr根据实际 batch size 自动缩放学习率--seed设置随机种子--deterministic设置 CUDNN 确定性选项--cfg-options在命令行就地覆盖配置键例如--cfg-options model.backbone.norm_evalFalse列表类型值需带引号如model.data_preprocessor.mean[128,128,128]--launcher分布式启动方式none/pytorch/slurm/mpi。多卡训练使用 tools/dist_train.shbash tools/dist_train.sh ${CONFIG_FILE} ${GPUS} [optional arguments]例如 8 卡训练bash tools/dist_train.sh configs/recognition/tsn/tsn_ucf101.py 8 \ --seed0 --deterministic测试与评估训练完成后使用 tools/test.py 评估微调模型的精度python tools/test.py ${CONFIG_FILE} ${CHECKPOINT} [optional arguments]例如python tools/test.py configs/recognition/tsn/tsn_ucf101.py \ ./work_dirs/tsn_ucf101/best_acc1_epoch_50.pth常用参数包括--dump将预测结果保存为 pkl 供离线评估、--show/--show-dir可视化预测结果、--cfg-options与--launcher。评估指标由配置中的val_evaluator dict(typeAccMetric)决定输出 Top-1 / Top-5 准确率。训练与测试的完整说明见 训练与测试教程。微调实践要点小结先改头再加载权重num_classes修改会在构建模型时重建fc_cls输出层后续加载预训练权重时该层因维度不匹配被自动跳过无需手动处理。学习率不宜过大微调一般将学习率降为原计划的 1/2 到 1/10如 0.01 → 0.005 或更低并配合梯度裁剪防止震荡。epoch 数与数据量匹配新数据集越小训练周期越短同时适当调整MultiStepLR的milestones保证学习率衰减仍发生在训练后半程。优先使用继承式配置将自定义配置与模板放在同一目录并只覆盖差异键可以最大化复用已验证的管线降低出错概率。数据格式先对齐确保注释文件中的路径为相对路径、与data_root拼接后真实存在标签从 0 开始连续编号VideoDataset每行为视频相对路径 标签RawFrameDataset每行为帧目录 总帧数 标签。赞分享人工智能计算机视觉深度学习【免费下载链接】mmaction2OpenMMLabs Next Generation Video Understanding Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmaction2点击查看免费下载相关推荐MMDetection 模型微调完全指南从 COCO 预训练权重迁移到自定义数据集MMDetection 模型微调完全指南从 COCO 预训练权重迁移到自定义数据集 MMDetection 在 COCO 等大规模数据集上预训练的检测器可以人工智能计算机视觉深度学习模型评测mmaction2 中 I3D 模型完全指南从权重膨胀原理到 Kinetics-400 训练评测实战mmaction2 中 I3D 模型完全指南从权重膨胀原理到 Kinetics 400 训练评测实战 I3DTwo Stream Inflated 3D C人工智能计算机视觉深度学习Lit-LLaMA自定义数据集训练从文本预处理到模型微调Lit LLaMA自定义数据集训练从文本预处理到模型微调 想要使用自己的数据集训练强大的语言模型吗Lit LLaMA提供了完整的自定义数据集训练解决方案让人工智能大模型预训练微调LoRA模型量化上一篇解决OBS Studio浏览器源远程调试难题从卡顿到丝滑的实战指南下一篇gh_mirrors/images5/images多语言支持详解Java、Go、Rust等开发环境配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑