☰
mmaction2 中 TIN(Temporal Interlacing Network)的架构解析、配置详解与训练测试实战指南
2026/10/13 7:21:17 网站建设 项目流程
  • 人工智能
  • 计算机视觉
  • 深度学习

【免费下载链接】mmaction2

OpenMMLab's Next Generation Video Understanding Toolbox and Benchmark

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

本篇以 configs/recognition/tin/README.md 为主体,系统讲解 mmaction2 对视频理解算法 TIN(Temporal Interlacing Network,时间交织网络)的支持:从“用可学习的交织算子替代重型时序模型”的核心思想,到 ResNetTIN 骨干网络的源码实现、三个官方训练配置(SthV1 / SthV2 / Kinetics-400)的关键参数,再到训练、测试的完整命令与确定性训练技巧。读完本文,你可以理解 TIN 相对 TSM 的结构差异,并能够基于仓库自带配置在三个数据集上复现或微调 TIN 模型。

一、算法概述:用“时间交织”替代重型时序模型

TIN 出自 AAAI 2020 论文《Temporal Interlacing Network》(作者 Hao Shao, Shengju Qian, Yu Liu)。官方 README 给出的 Abstract 概括了其动机与结论:

  • 动机:长期来看,视觉社区倾向于把 CNN 与各类时序模型(马尔可夫链族、光流、RNN、时序卷积)组合来学习时空表示,但这种“空间-时间交替学习”的流程消耗大量算力。一个自然的问题是:能否把时序信息直接嵌入空间特征中,让两个域的信息一次性联合学习?
  • 做法:TIN 提出一个简单而强力的算子——temporal interlacing(时间交织)。它不显式学习时序特征,而是把“过去到未来”的空间表征进行交织(interlace),并把时序域的交织过程交由一个**可微的交织目标(differentiable interlacing target)**来学习控制,从而用简单交织算子替换重型时序模型。
  • 理论与实践结论:作者理论上证明,带有可学习交织目标的 TIN 与正则化时序卷积网络(r-TCN)等价,但在 6 个具有挑战性的基准上取得约 4% 的精度增益、约 6 倍更低的时延;集成模型还获得了 ICCV19 Multi Moments in Time 挑战赛第一名。

在 mmaction2 中,TIN 以骨干网络ResNetTIN的形式提供,注册于 MODELS 注册表,属于识别(recognition)任务下基于Recognizer2D的 RGB 模型族。

二、模型库与结果(Results and Models)

官方 README 给出了三个数据集的复现结果(帧采样策略均为1x1x8,即 8 个单帧片段、测试协议 8 clips x 1 crop,训练资源 32 GPUs,即 8 卡 x 4 视频/卡):

Something-Something V1

frame samplingresolutiongpusbackbonepretraintop1 acctop5 accreference top1reference top5testing protocolgpu_mem(M)config
1x1x8height 1008x4ResNet50ImageNet39.6868.5544.0472.728 clips x 1 crop6181config

Something-Something V2

frame samplingresolutiongpusbackbonepretraintop1 acctop5 accreference top1reference top5testing protocolgpu_mem(M)config
1x1x8height 2408x4ResNet50ImageNet54.7882.1856.4883.458 clips x 1 crop6185config

Kinetics-400

frame samplingresolutiongpusbackbonepretraintop1 acctop5 acctesting protocolgpu_mem(M)config
1x1x8short-side 2568x4ResNet50TSM-Kinetics40071.8690.448 clips x 1 crop6185config

这里用finetune表示:先在 Kinetics-400 上训练得到 TSM 模型,再用该 TSM 模型作为load_from在 Kinetics-400 上微调 TIN 模型(该微调配置见 k400 配置文件 第 102 行的load_from字段)。需要说明的是,README 结果表中 Kinetics-400 一行的 config 链接实际指向的是 SthV2 配置文件,从仓库文件看,K400 微调对应的真实配置为 tin_kinetics400-pretrained-tsm-r50_1x1x8-50e_kinetics400-rgb.py。

预训练模型权重与训练日志(.pth/.log)的下载地址集中记录在 metafile.yml 各模型的Weights与Training Log字段中,其中还给出了模型规模信息,例如 SthV1/SthV2 模型的 FLOPs 约为 32.96G、参数量约 23.90M(K400 微调模型参数量约 24.36M,因类别数为 400)。

README 的四点重要说明(Note)

  1. reference topk acc是在官方原版 TIN 仓库上训练得到的结果,且修复了原版仓库中AverageMeter的统计缺陷(该 issue 会导致指标统计不正确),修复后运行才得到表中 reference 列数值;
  2. gpus指得到 checkpoint 时使用的 GPU 数量。注意:仓库提供的配置默认按 8 卡编写。根据 Linear Scaling Rule,如果改变 GPU 数或每卡视频数,可把学习率与 batch size 成比例调整,例如 4 GPUs x 2 video/gpu 用lr=0.01,16 GPUs x 4 video/gpu 用lr=0.08;
  3. “reference”列数值是在原版仓库上以相同模型设置训练得到的结果;
  4. 使用的 Kinetics400 验证集共 19796 个视频,README 同时提供了对应的数据列表文件(每行格式为video_id, num_frames, label_index)与类别索引映射文件的下载入口。

数据集准备

TIN 复现涉及的三个数据集,其下载、切帧与文件列表构建流程请参考:

  • Kinetics 数据准备
  • Something-Something V1 数据准备
  • Something-Something V2 数据准备

三、TIN 骨干网络的源码实现

TIN 的 mmaction2 实现集中在 mmaction/models/backbones/resnet_tin.py,共 4 个核心构件:linear_sampler、WeightNet、OffsetNet、TemporalInterlace,以及最终注册到MODELS的ResNetTIN。

3.1 linear_sampler:可微的时间方向采样

linear_sampler 实现“可微的时序帧采样”,本质是沿时间维的线性插值:

  • 输入被切分成若干组(groups),每组沿时间维按不同offset平移,再沿时间维做加权和;
  • 具体做法:取offset0 = floor(offset)、offset1 = offset0 + 1,通过 mmcv 的tin_shift算子(from mmcv.ops import tin_shift,导入失败会抛出ImportError提示无法使用 TIN)分别取两个整偏移处的特征,再以weight0 = 1 - (offset - offset0)、weight1 = 1 - weight0做线性插值,得到亚帧级的可微“平移”结果;
  • 由于该算子全程可微,offset本身可以由网络学习得到——这正是“可学习的交织目标”的落地方式。

3.2 WeightNet 与 OffsetNet:控制交织过程的两个子网络

WeightNet(L97-L148):由一个nn.Conv1d(in_channels, groups, 3, padding=1)加 sigmoid 组成,输出经2 * sigmoid(x)缩放到(0, 2)区间;卷积 bias 初始化为 0,使得初始输出恰为 1.0(即不改变特征幅值)。

OffsetNet(L151-L214):由一个Conv1d(kernel 3、padding 1,硬编码对齐原版仓库)+ 两个全连接层(fc1、fc2间夹 ReLU)+ sigmoid 组成,最终经4 * (sigmoid(x) - 0.5)把输出压缩到(-4, 4)区间,即最多平移 ±4 个帧位置(对num_segments=8的片段而言是安全范围);fc2的 bias 初始化为0.5108,使 post-sigmoid 初始输出从 1 附近开始。

3.3 TemporalInterlace:交织算子本体

TemporalInterlace 将上述部件组合,前向流程可以概括为:

  1. 输入解析:输入x形状为[num_batches * num_segments, C, H, W],其中C = shift_div * num_folds。代码取前num_folds个通道作为待交织的x_descriptor,形状整理为[num_batches, num_segments, num_folds, H, W];
  2. 统计描述子:对x_descriptor沿 H、W 做平均池化,得到只保留时间与通道信息的x_pooled: [num_batches, num_folds, num_segments];
  3. 预测交织参数:x_offset = offset_net(x_pooled)得到每个组的平移量,并拼接其相反数torch.cat([x_offset, -x_offset], 1)——即同时对“过去的方向”和“未来的方向”对称交织(对应论文中 past-to-future 与 future-to-past 的双向交织);x_weight = weight_net(x_pooled)得到对应权重;
  4. 可微采样与加权:linear_sampler(x_descriptor, x_offset)执行亚帧插值平移,再乘上x_weight得到交织后的特征;
  5. 拼回原通道:输出张量的前num_folds个通道替换为交织结果,其余3/4通道(shift_div=4时)原样透传(x_out[:, num_folds:, :] = x[:, num_folds:, :])。也就是说 TIN 每次只改动 1/4 的通道,其余通道保留原始空间表征。

另外两个结构性细节:deform_groups硬编码为 2(对齐原版仓库);TemporalInterlace与 ResNet 卷积层的组合由 CombineNet 完成——x先过net1(TemporalInterlace)再过net2(原卷积层),形状均为[num_batches * num_segments, C, H, W]。

3.4 ResNetTIN:把交织插进 ResNet 的每个 Block

ResNetTIN 继承自ResNetTSM(TSM 骨干),关键差异在init_structure:当is_tin=True(默认)时调用make_temporal_interlace(),对 layer1~layer4 的每个 Block执行:

blocks[i].conv1.conv = CombineNet(tds, blocks[i].conv1.conv)

即用TemporalInterlace(in_channels=b.conv1.in_channels, num_segments, shift_div)包装每个 Block 的第一个卷积conv1.conv。结合基类 ResNetTSM 的默认参数(num_segments=8、shift_div=8),TIN 配置中把shift_div显式设为 4。测试用例 test_resnet_tin.py 验证了这些结构性事实:num_segments=-1会触发断言错误;正常构建后每个 block 的conv1.conv均为CombineNet且net1是TemporalInterlace;(8, 3, 64, 64)的输入前向输出为(8, 2048, 2, 2);同时验证了partial_bn=True时前 2 个 BN 正常更新、其余冻结的行为。

四、配置体系与关键参数详解

4.1 模型基础配置

三个数据集配置均继承base/models/tin_r50.py,核心内容:

model = dict( type='Recognizer2D', backbone=dict( type='ResNetTIN', pretrained='torchvision://resnet50', # ImageNet 2D 预训练权重 depth=50, norm_eval=False, shift_div=4), # 通道被分为 4 份,仅 1 份参与交织 cls_head=dict( type='TSMHead', num_classes=400, in_channels=2048, spatial_type='avg', consensus=dict(type='AvgConsensus', dim=1), # 8 帧片段在时间维平均池化 dropout_ratio=0.5, init_std=0.001, is_shift=False, # 关键:TIN 骨干自带交织,关闭 TSM 式 shift average_clips='prob'), data_preprocessor=dict(type='ActionDataPreprocessor', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], format_shape='NCHW'))

参数要点:

参数位置说明
backbone.shift_divtin_r50.py通道分组数,交织只作用于前C/shift_div通道;TIN 默认 4(TSM 的shift_div默认是 8),见 ResNetTIN 文档串
backbone.is_tinResNetTIN是否插入时间交织,默认True
backbone.num_segmentsResNetTSM片段数,默认 8,对应采样策略1x1x8
cls_head.is_shiftTSMHead基础配置中为False,因为交织已在骨干的conv1处完成,无需再走 TSM 的 shift 分支;TSMHead 中is_shift=True时才会在 head 内做时序池化/移位
consensusTSMHeadAvgConsensus(dim=1)将 8 个片段特征在时间维平均
norm_eval=Falsebackbone验证时 BN 保持训练态统计

与 TSM 基础配置 对比可见:两者共享Recognizer2D + TSMHead的骨架,差异仅在骨干类型(ResNetTINvsResNetTSM)、shift_div(4 vs 8)和is_shift(False vs True)——TIN 把“时间算子”从 TSM 的固定移位换成了可学习的交织。

4.2 三个训练配置

(1) SthV1:tin_imagenet-pretrained-r50_8xb6-1x1x8-40e_sthv1-rgb.py

  • 数据集:RawframeDataset(基于预抽帧的 rawframes,filename_tmpl='{:05}.jpg'),174 类(num_classes=174、dropout_ratio=0.8);
  • 预处理:训练管线为SampleFrames(clip_len=1, num_clips=8) → RawFrameDecode → Resize(-1, 256) → MultiScaleCrop(input_size=224, scales=(1, 0.875, 0.75, 0.66)) → Resize(224, 224),验证/测试为Resize(-1, 256) → CenterCrop(224);
  • 训练循环:EpochBasedTrainLoop, max_epochs=40, val_begin=1, val_interval=1(每轮验证一次);
  • 优化器:SGD, lr=0.01, momentum=0.9, weight_decay=0.0005,构造器为TSMOptimWrapperConstructor且paramwise_cfg=dict(fc_lr5=True),梯度裁剪max_norm=20;
  • 学习率策略:第 0 轮LinearLR线性热身(start_factor=0.1),第 1~40 轮CosineAnnealingLR(T_max=39, eta_min=0)。

(2) SthV2:tin_imagenet-pretrained-r50_8xb6-1x1x8-40e_sthv2-rgb.py

结构与 SthV1 一致(分辨率高度 240),两处差异:clip_grad的max_norm=40(更宽松),以及val_interval=2(每 2 轮验证一次)。

(3) Kinetics-400(TSM 微调):tin_kinetics400-pretrained-tsm-r50_1x1x8-50e_kinetics400-rgb.py

  • 数据集换成VideoDataset+DecordInit/DecordDecode(直接读视频),训练/验证列表分别为kinetics400_train_list_videos.txt/kinetics400_val_list_videos.txt,训练管线额外含Flip(flip_ratio=0.5);
  • model = dict(cls_head=dict(is_shift=True)):微调时开启 TSMHead 的 shift 分支以对齐 TSM 权重中的 head 结构;
  • 继承 sgd_50e.py:max_epochs=50、MultiStepLR(milestones=[20, 40], gamma=0.1)、SGDlr=0.01, weight_decay=0.0001、clip_grad max_norm=40;
  • load_from指向 TSM ResNet50 在 K400 上训练的权重(50 epoch),实现“TSM 预训练 → TIN 微调”。

关于TSMOptimWrapperConstructor的分组学习策略,其实现(tsm_optim_wrapper_constructor.py)对参数分组:第一个卷积用基础lr/wd;BN 参数零权重衰减;各 bias 为2x lr且零衰减;开启fc_lr5=True时,cls_head 最后一个 FC 层权重为5x lr、bias 为10x lr且零衰减。

五、训练(Train)

通用命令:

python tools/train.py ${CONFIG_FILE} [optional arguments]

官方示例:以确定性模式训练 SthV1 上的 TIN 模型,并开启周期验证(randomness.seed=0固定随机种子,randomness.deterministic=True使 CUDNN 走确定性路径):

python tools/train.py configs/recognition/tin/tin_imagenet-pretrained-r50_8xb6-1x1x8-40e_sthv1-rgb.py \ --work-dir work_dirs/tin_imagenet-pretrained-r50_8xb6-1x1x8-40e_sthv1-rgb randomness.seed=0 randomness.deterministic=True

补充说明:从当前仓库的 tools/train.py 源码看,覆盖配置项的参数是--cfg-options(DictAction类型,接受key=value形式),同时提供--work-dir、--resume、--amp、--no-validate、--seed、--deterministic、--launcher等选项;上例中的randomness.seed=0 randomness.deterministic=True属于配置覆盖写法,实际执行时通过--cfg-options randomness.seed=0 randomness.deterministic=True传入,或等价地改用命令行参数--seed 0 --deterministic。多卡分布式训练可使用 tools/dist_train.sh。更多训练细节(工作目录结构、断点续训、验证策略)见训练与测试教程的 Training 章节。

六、测试(Test)

通用命令:

python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [optional arguments]

官方示例:在 SthV1 上测试 TIN 模型并把结果转储为 JSON:

python tools/test.py configs/recognition/tin/tin_imagenet-pretrained-r50_8xb6-1x1x8-40e_sthv1-rgb.py \ checkpoints/SOME_CHECKPOINT.pth --dump result.json

其中 checkpoint 文件名形如tin_imagenet-pretrained-r50_8xb6-1x1x8-40e_sthv1-rgb_20220913-9b7804d6.pth(完整下载 URL 见 metafile.yml 对应模型的Weights字段)。测试评估器为AccMetric,输出 top-1 / top-5 准确率。测试的更多细节(--out、--format-only、--eval等)同样参见训练与测试教程的 Test 章节。

七、引用

如果使用了本仓库的 TIN 实现,请按论文信息引用:

@article{shao2020temporal, title={Temporal Interlacing Network}, author={Hao Shao and Shengju Qian and Yu Liu}, year={2020}, journal={AAAI}, }

八、小结

  • TIN 的核心是TemporalInterlace算子:由OffsetNet预测对称的 ±offset、WeightNet预测 (0,2) 区间权重,经可微linear_sampler完成亚帧交织,且每次只重写 1/4 的通道;
  • ResNetTIN继承ResNetTSM,在四个 stage 的每个 Block 的conv1前插入CombineNet(TemporalInterlace, 原卷积),配置层面用shift_div=4、cls_head.is_shift=False与 TSM 区分;
  • 仓库提供 SthV1、SthV2(ImageNet 预训练,40 epoch,Cosine 调度)与 Kinetics-400(TSM 权重微调,50 epoch,MultiStepLR 调度)三套可直接复现的配置,并给出官方 checkpoint、训练日志与结果表的对照,配合确定性训练参数可完整复现表格中的精度。
  • 人工智能
  • 计算机视觉
  • 深度学习

【免费下载链接】mmaction2

OpenMMLab's Next Generation Video Understanding Toolbox and Benchmark

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

相关推荐

上一篇:3步解锁电视盒子新生命:从闲置设备到全能Linux服务器
下一篇:iOS 7.1.1滚动元素无法滚动到头:Mars中的scrollfix实现

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询