SlowFast Networks
如果你做过视频动作识别,大概率会熟悉这条技术主线:把视频当作一个时空体(spatiotemporal volume),用 3D 卷积统一处理空间和时间两个维度。#i3d2017 的 I3D、#r2plus1d2018 的 R(2+1)D、#s3d2018 的 S3D——这条路线在 2015 到 2018 年几乎统治了 Kinetics-400 排行榜。这些方法的核心假设是:空间和时间是"对等"的两个维度,所以应当用 3D 卷积对称地处理它们。
但 2019 年 Facebook AI 的 Christoph Feichtenhofer、Haoqi Fan、Jitendra Malik 和 Kaiming He 发表了一篇看上去"反常识"的论文 #slowfast2019:SlowFast Networks for Video Recognition。他们的核心观察是——视频里的空间语义和时间运动根本不是同一种信号,应当用两条完全异构的通道分别处理:
- Slow 通道:低帧率采样(30 fps 视频里只取 2 fps),重点处理空间语义,通道容量大(ResNet-50/101 全量)
- Fast 通道:高帧率采样(ω=8 倍密集的帧),重点处理运动细节,通道容量只有 Slow 的 1/8,整体计算量只占总体的 ~20%
这种"双速"的设计在 Kinetics-400 上 from-scratch 训练(不用 ImageNet 预训练)就达到了 79.8% top-1 #slowfast2019,把当时所有方法(包括 I3D 72.1% 和 R(2+1)D 73.9%)甩开几个百分点。论文还顺便在 AVA 时空动作检测上刷新 SOTA,并赢得了 ActivityNet Challenge 2019 的 AVA 赛道冠军。#slowfast2019
更优雅的是,整套方案不需要光流,完全端到端可学习。这与同时期需要预计算 optical flow 的 Two-Stream 系列工作形成鲜明对比——slowfast 的 Fast 通道用更密集的原始 RGB 帧替代了光流的信息。
这篇论文之所以成为视频识别领域的经典,一方面是设计哲学层面的洞察,另一方面是它催生了 PySlowFast 开源框架,成为后续 X3D #x3d2020、MViT #mvit2021、Video Swin Transformer 等工作的重要灵感来源。下面我们就从底层 motivation 开始,一步步把 SlowFast 拆开看。
2.1 一个被忽视的统计事实
在图像分类里我们习惯了"空间各向同性"假设:自然图像在水平、竖直、对角等所有方向上统计等价(#ruderman1994 和 #huang1999 的早期工作证实了这一点)。所以 2D CNN 用方形 kernel 横扫一切很合理。但视频是三维信号 \(I(x, y, t)\),空间两维和时间一维不对等。
为什么?论文 #slowfast2019 引用了两个关键观察:
- 慢速运动更常见。人在某一瞬间看到的大多数物体其实是静止的,运动只发生在局部。Weiss 等人 #weiss2002 在贝叶斯框架下证明了"慢速运动先验"(slow movement prior)能解释人眼在孔径问题(aperture problem)中的视觉偏好:当我们看到一个边缘在移动,会倾向于把它解读为垂直于边缘方向,而不是带切向分量。
- 空间语义慢变,运动快变。挥手的人一直还是"人",不会在挥手的瞬间从人变成猫。但"挥手"这个动作可能在 0.5 秒内完成,跟"走路"切换得非常快。
所以一个自然的设计思路是:用低帧率的"慢"通道抓空间语义(不需要那么快更新),用高帧率的"快"通道抓运动细节(需要密集采样)。这就是 SlowFast 的直觉起点。
2.2 与 Two-Stream 的关键区别
一看到"两条通路",很多人会立刻想到经典的 Two-Stream 网络 #twostream2014。但 SlowFast 在多个根本层面与 Two-Stream 不同:
| 维度 | Two-Stream (2014) | SlowFast (2019) |
|---|---|---|
| 两路关系 | 同构(结构相同) | 异构(通道容量差 8 倍) |
| 第二路输入 | Optical flow(手工设计) | 原始 RGB(端到端学习) |
| 时间采样率 | 两路相同 | Fast 通道是 Slow 的 8 倍密集 |
| 是否需要光流 | 是(需预计算) | 否 |
| 计算开销 | 双流 ≈ 翻倍 | Fast 仅 ≈ 总计算 20% |
关键差异点是时间采样率不同。Two-Stream 的两个流处理同样的帧数,区别只在模态(RGB vs optical flow)。SlowFast 强调的是"不同的时间速度"——Fast 通道比 Slow 通道密集采样 ω=8 倍的帧。这是对"双流"思想的一次根本性扩展:不只是模态不同,时间速度也应当不同。
2.3 生物学启发:视网膜 P/M 双通路
论文还把这一设计与灵长类视觉系统的双通路做类比。视网膜神经节细胞中约 80% 是 Parvocellular(P-cells),约 15-20% 是 Magnocellular(M-cells)#livingstone1988:
- P-cells(副细胞):空间分辨率高、颜色敏感、时间响应慢——负责精细形状和颜色识别。
- M-cells(主细胞):时间频率高、对快速运动敏感、空间细节和颜色不敏感——负责运动检测和低光视觉。
SlowFast 的 Fast 通道在设计上几乎复刻了 M-cells 的三个特点:
- 通道容量小(占总计算 ~20%,对应 M-cells 的少数比例)
- 时间分辨率高(每层都保留密集时间特征,对应 M-cells 的高时间频率)
- 空间细节弱(消融实验证明 grayscale 输入几乎不掉点,对应 M-cells 的色盲特性)
These studies found that in these cells, ~80% are Parvocellular (P-cells) and ~15-20% are Magnocellular (M-cells). The M-cells operate at high temporal frequency and are responsive to fast temporal changes, but not sensitive to spatial detail or color.
— #slowfast2019 引言不过作者也明确说:"admittedly the analogy is rough and premature"——这是 rough 的类比,不是严格的生物学建模。但这个类比给工程设计提供了清晰的指导原则。
在搞清动机之后,我们看 SlowFast 的具体实现。论文给出了一个清晰的实例化(论文 Table 1 #slowfast2019),基于 ResNet-50/101。
3.1 整体 Pipeline
先看一张从论文里提取的整体架构图。绿色代表 Fast 通道的高时间分辨率,橙色代表它的低通道容量。
为了更清楚地展示数据流和融合点,我用 mermaid 重新画一张:
graph TD R["原始 64 帧 clip
(30 fps × 2.13s)"] -->|"τ=16 采样
(4 帧)"| S1 R -->|"τ/ω=2 采样
(32 帧)"| F1 S1["Slow 输入
T=4, 224×224"] --> S2["conv1
1×7², 64ch"] S2 --> S3["pool1
1×3² max"] S3 --> S4["res2
×3 blocks
(256,64)"] S4 --> S5["res3
×4 blocks
(512,128)"] S5 --> S6["res4
×6 blocks
(1024,256)"] S6 --> S7["res5
×3 blocks
(2048,512)"] S7 --> S8["GAP → 2048-d"] F1["Fast 输入
ωT=32, 224×224"] --> F2["conv1
5×7², 8ch"] F2 --> F3["pool1
1×3² max"] F3 --> F4["res2
×3 blocks
(32,8)"] F4 --> F5["res3
×4 blocks
(64,16)"] F5 --> F6["res4
×6 blocks
(128,32)"] F6 --> F7["res5
×3 blocks
(256,64)"] F7 --> F8["GAP → 256-d"] S4 -.->|"Lateral"| S5 S5 -.->|"Lateral"| S6 S6 -.->|"Lateral"| S7 F4 -.->|"Lateral"| S4 F5 -.->|"Lateral"| S5 F6 -.->|"Lateral"| S6 F7 -.->|"Lateral"| S7 S8 --> C["concat 2048+256"] F8 --> C C --> FC["FC → K 类"]
整张图的核心要点:
- 两路从同一段原始视频采样,采样步长不同(τ=16 vs τ/ω=2)
- 两路的 backbone 都是 3D ResNet 变体,但通道数差 8 倍
- Fast 通道通过横向连接(lateral connections)单向融合到 Slow 通道的每个 stage
- 最后两路各自 GAP → concat → 全连接分类
3.2 Slow 通道:低帧率抓空间
Slow 通道的设计哲学很直接:把它当作"高质量图像识别器",只是在时间维度上稀疏采样。
采样配置:从 64 帧原始 clip 中每隔 τ=16 帧采样 1 帧,得到 T=4 帧输入。在 30 fps 视频下,4 帧覆盖约 2.13 秒,但只占原始视频每秒 2 帧——这是一条慢速通道。
网络结构:论文 #slowfast2019 Table 1 给出了具体配置(基于 ResNet-50):
- conv1: 1×7² kernel,64 通道(2D kernel,时间维度为 1)
- pool1: 1×3² max pool
- res2: 3 个 bottleneck blocks(输出 256,中间 64)
- res3: 4 个 bottleneck blocks(512, 128)
- res4: 6 个时空可分离 blocks(1024, 256,[3×1², 1×3², 1×1²])
- res5: 3 个时空可分离 blocks(2048, 512)
- GAP → 2048-d
注意一个反直觉的设计选择:conv1 到 res3 都用 2D kernel,只有 res4、res5 用 3D kernel(带时间维度)。论文 #slowfast2019 解释:当 τ=16 这么大时,早层小空间感受野内的时间相关性很弱;只有到 res4 这种大空间感受野的层,时间维度才显示出足够的运动信息。这与 R(2+1)D #r2plus1d2018 和 S3D #s3d2018 的"top-heavy"设计哲学一致。
3.3 Fast 通道:高帧率抓运动
Fast 通道是 SlowFast 最具特色的设计。它的输入帧数是 Slow 的 ω=8 倍(ωT=32 帧),但通道数只有 Slow 的 φ=1/8(最少到 8 通道)。
采样配置:从 64 帧原始 clip 中每隔 τ/ω=2 帧采样 1 帧,得到 32 帧输入。注意 ωT=32 帧也覆盖约 2.13 秒,但每秒采 16 帧——这是一条快速通道。
网络结构:
- conv1: 5×7² kernel,8 通道(带时间维度)
- pool1: 1×3² max
- res2: 3 个时空可分离 blocks(输出 32,中间 8)
- res3: 4 个 blocks(64, 16)
- res4: 6 个 blocks(128, 32)
- res5: 3 个 blocks(256, 64)
- GAP → 256-d
与 Slow 通道的两个关键差异:
Fast 通道的两个"不"原则
- 不做时间下采样。从 conv1 到 res5,所有时间维度始终保持 ωT=32 帧。Fast 通道不进行时间池化或时间步长卷积。这样可以保留最细粒度的时间信息。
- 每层都用非退化时间卷积。Slow 通道只有 res4、res5 用 3D kernel;Fast 通道从 conv1 开始每一层都有时间维度。论文 #slowfast2019 解释:因为 Fast 通道的"时间 stride"小(τ/ω=2),每个时间步之间都有强相关性,3D kernel 都有用武之地。
3.4 横向连接:Fast 怎么"帮"Slow
两路独立运行到结束显然不行——Fast 通道的信息需要传递给 Slow 通道,让分类器同时知道"是什么物体"和"在做什么动作"。这个连接就是 lateral connection。
Slow 通道的特征形状是 \(\{T, S^2, C\}\),Fast 通道的特征形状是 \(\{\omega T, S^2, \phi C\}\),两者时间维度和通道维度都不匹配。论文尝试了三种变换方式 #slowfast2019:
三种 Lateral Connection 实现
(i) Time-to-channel (TtoC)
把 \(\omega\) 帧"打包"到一个帧的通道维度:
\(\{\omega T, S^2, \phi C\} \;\longrightarrow\; \{T, S^2, \omega \phi C\}\)
通过 reshape + transpose 实现。优点是保留所有时间信息;缺点是通道数扩了 ω 倍。
(ii) Time-strided sampling (T-sample)
从 Fast 特征中每隔 ω 帧采样 1 帧:
\(\{\omega T, S^2, \phi C\} \;\longrightarrow\; \{T, S^2, \phi C\}\)
最简单;缺点是丢掉中间帧信息。
(iii) Time-strided convolution (T-conv) — 默认
用一个 5×1² kernel 的 3D 卷积,输出 2φC 通道,stride=ω:
\(\text{Conv}_{5 \times 1^2, \text{stride}=\omega} : \{\omega T, S^2, \phi C\} \;\longrightarrow\; \{T, S^2, 2\phi C\}\)
可学习,灵活;在 K400 上取得最好结果。
横向连接的位置在每个 stage 之后(pool1 之后、res2 之后、res3 之后、res4 之后),与 FPN #fpn2017 的设计哲学一致。论文实验发现单向融合(Fast → Slow)和双向融合效果相似,所以默认采用单向。
最终分类:两路各自 GAP → concat(2048-d + 256-d)→ 全连接层 → K 类。
3.5 网络实例化对照
下表是论文 Table 1 的精简版(基于 ResNet-50 backbone,ω=8, φ=1/8, τ=16):
| Stage | Slow 通道 | Fast 通道 | 输出 T×S² |
|---|---|---|---|
| 原始 clip | — | — | 64×224² |
| data layer | stride 16, 1² | stride 2, 1² | Slow: 4×224² Fast: 32×224² |
| conv1 | 1×7², 64ch | 5×7², 8ch | Slow: 4×112² Fast: 32×112² |
| pool1 | 1×3² max | 1×3² max | Slow: 4×56² Fast: 32×56² |
| res2 | blocks(256,64)×3 | blockt(32,8)×3 | Slow: 4×56²×256 Fast: 32×56²×32 |
| res3 | blocks(512,128)×4 | blockt(64,16)×4 | Slow: 4×28²×512 Fast: 32×28²×64 |
| res4 | blockt(1024,256)×6 | blockt(128,32)×6 | Slow: 4×14²×1024 Fast: 32×14²×128 |
| res5 | blockt(2048,512)×3 | blockt(256,64)×3 | Slow: 4×7²×2048 Fast: 32×7²×256 |
| final | global avg pool → concat → fc | # classes | |
注:blockt 是 [3×1², 1×3², 1×1²] 三层时空可分离残差块,blocks 是 [1×1², 1×3², 1×1²] bottleneck。带下划线的 kernel 表示有非退化时间维度。
SlowFast 的成功不是偶然。论文 #slowfast2019 做了大量消融实验,验证了每一个关键超参的选择。本节聚焦三个最关键的设计决策。
4.1 通道容量比例 φ=1/8:为什么 Fast 通道这么瘦?
这是 SlowFast 设计哲学的精华——Fast 通道的通道容量选择。下面是论文 Table 4b 的完整消融 #slowfast2019:
| 配置 | top-1 | top-5 | GFLOPs | 说明 |
|---|---|---|---|---|
| Slow-only | 72.6 | 90.3 | 27.3 | 单独 Slow 通道 |
| φ=1/4 | 75.6 | 91.7 | 54.5 | Fast 通道较重 |
| φ=1/6 | 75.8 | 92.0 | 41.8 | 最优 top-1 |
| φ=1/8 | 75.6 | 92.1 | 36.1 | 默认配置(最优 top-5) |
| φ=1/12 | 75.2 | 91.8 | 32.8 | 更轻量 |
| φ=1/16 | 75.1 | 91.7 | 30.6 | 更轻量 |
| φ=1/32 | 74.2 | 91.3 | 28.6 | 极轻量(仅 +1.3 GFLOPs) |
几个关键观察:
- 所有 φ 值都比 Slow-only 好。即使 φ=1/32(Fast 通道只占 5% 总 FLOPs),仍比单独 Slow 通道高 1.6%。这说明 Fast 通道是"普惠性"设计,而不是"越大越好"。
- φ=1/8 是最优平衡点。它在精度和 FLOPs 之间取到了最佳 trade-off。φ=1/6 top-1 高 0.2% 但 FLOPs 多 16%。
- 计算量大致与通道数平方成正比。3D 卷积 FLOPs ∝ C_in × C_out,所以从 φ=1/4 减到 φ=1/8,FLOPs 减半。Fast 通道"瘦"不是工程妥协,而是设计目标。
这与 M-cells 在视网膜中占 ~15-20% 的比例形成精妙呼应:Fast 通道占总计算约 20%(论文 §3.2 明确提到 #slowfast2019),M-cells 占视网膜神经节约 15-20%。不是巧合,而是 SlowFast 把生物学比例翻译成了工程比例。
4.2 Fast 通道的空间能力:到底要多弱?
既然 Fast 通道的通道容量小,那它的空间建模能力也应该弱——但到底能弱到什么程度?论文 Table 4c 测试了 4 种弱化空间输入的方式:
| Fast 输入 | 空间 | top-1 | top-5 | GFLOPs |
|---|---|---|---|---|
| RGB(默认) | full | 75.6 | 92.1 | 36.1 |
| RGB, φ=1/4, half res | 112×112 | 74.7 | 91.8 | 34.4 |
| Grayscale | full | 75.5 | 91.9 | 34.1 |
| Time difference | full | 74.5 | 91.6 | 34.2 |
| Optical flow | full | 73.8 | 91.3 | 35.1 |
另一个反直觉点:手工设计的 optical flow 反而最差(73.8%)。这意味着让网络自己学"运动表示",比直接喂给它人为设计的光流更好。这是 SlowFast 抛弃光流的重要实验依据。
4.3 不需要光流:Fast 通道是光流的"可学习替代品"
Two-Stream 系列工作(#twostream2014、Feichtenhofer 2016 等)一直依赖预计算的 optical flow(FlowNet 2.0、TV-L1 等算法),存在三个问题:
- 需要额外存储:光流 ≈ RGB 大小,视频数据集光流存储开销很大
- 不能端到端学习:光流是固定算法的输出,不能与分类器联合优化
- 计算成本翻倍:两路都跑 3D/2D 网络 ≈ 翻倍
SlowFast 的设计优雅地用 Fast 通道替代了光流:
- 用更密集的 RGB 帧(ω=8 倍)替代光流携带的运动信息
- Fast 通道轻量级(仅 ~20% 总计算)— 比两流结构更便宜
- 完全端到端,不需要预计算
实验上,SlowFast 79.8% > Two-Stream I3D 75.7%(K400 #slowfast2019 Table 2)。在 AVA 上,SlowFast 用 Fast 通道提升 5.2 mAP,而 Two-Stream I3D 加光流只提升 1.1 mAP(#ava2018)#slowfast2019。Fast 通道在改善精度的同时避免了光流的所有问题。
4.4 三种 Lateral Connection 横向对比
论文 #slowfast2019 Table 4a 给了 lateral connection 的消融:
| 配置 | top-1 | top-5 | GFLOPs |
|---|---|---|---|
| Slow-only | 72.6 | 90.3 | 27.3 |
| Fast-only | 51.7 | 78.5 | 6.4 |
| SlowFast (no lateral) | 73.5 | 90.3 | 34.2 |
| SlowFast (TtoC, sum) | 74.5 | 91.3 | 34.2 |
| SlowFast (TtoC, concat) | 74.3 | 91.0 | 39.8 |
| SlowFast (T-sample) | 75.4 | 91.8 | 34.9 |
| SlowFast (T-conv) | 75.6 | 92.1 | 36.1 |
几个发现:
- Fast-only 单独精度只有 51.7%——Fast 通道需要 Slow 通道的空间语义才能工作
- 没有 lateral connection 也有提升(73.5% vs 72.6%),说明通道容量提升本身就有帮助
- T-conv 效果最好(75.6%),比 T-sample 高 0.2%
SlowFast 在四个主要视频数据集上全面刷新 SOTA。下面逐一分析。
5.1 Kinetics-400(动作分类,~240k 训练视频)
Kinetics-400 #kinetics4002017 是动作分类的"ImageNet",包含 ~240k 训练视频和 20k 验证视频,400 个类别。
| 模型 | flow | pretrain | top-1 | top-5 | GFLOPs×views |
|---|---|---|---|---|---|
| I3D #i3d2017 | — | ImageNet | 72.1 | 90.3 | 108×N/A |
| Two-Stream I3D | ✓ | ImageNet | 75.7 | 92.0 | 216×N/A |
| S3D-G #s3d2018 | ✓ | ImageNet | 77.2 | 93.0 | 143×N/A |
| Nonlocal R50 #nonlocal2018 | — | ImageNet | 76.5 | 92.6 | 282×30 |
| Nonlocal R101 | — | ImageNet | 77.7 | 93.3 | 359×30 |
| R(2+1)D #r2plus1d2018 | — | — | 72.0 | 90.0 | 152×115 |
| R(2+1)D | ✓ | — | 73.9 | 90.9 | 304×115 |
| SlowFast 4×16, R50 | — | — | 75.6 | 92.1 | 36.1×30 |
| SlowFast 8×8, R50 | — | — | 77.0 | 92.6 | 65.7×30 |
| SlowFast 8×8, R101 | — | — | 77.9 | 93.2 | 106×30 |
| SlowFast 16×8, R101 | — | — | 78.9 | 93.5 | 213×30 |
| SlowFast 16×8, R101+NL | — | — | 79.8 | 93.9 | 234×30 |
几个核心数字:
- 79.8% top-1 创下新 SOTA,比之前的 Nonlocal R101(77.7%)高 2.1%
- 所有 SlowFast 都 from scratch 训练(不用 ImageNet 预训练),而 I3D/Nonlocal 等都依赖 ImageNet 预训练
- 在不用预训练的 from-scratch 设置下,SlowFast 79.8% 比 R(2+1)D+flow 73.9% 高 5.9 个百分点——这是慢快设计的纯贡献
- 计算成本上,SlowFast 4×16 R50 用 36.1 GFLOPs 达到 75.6%,比 Nonlocal R50(282 GFLOPs, 76.5%)FLOPs 少 87%
5.2 Kinetics-600(更大规模,~392k 视频)
Kinetics-600 #kinetics6002018 是 K400 的扩展版,~392k 训练视频,600 类。注意 K600 验证集与 K400 训练集有重叠,所以 SlowFast 在 K600 上没有用 K400 预训练。
| 模型 | pretrain | top-1 | top-5 | GFLOPs×views |
|---|---|---|---|---|
| I3D | — | 71.9 | 90.1 | 108×N/A |
| StNet-IRv2 RGB #stnet2018 | ImgNet+Kin400 | 79.0 | N/A | N/A |
| SlowFast 4×16, R50 | — | 78.8 | 94.0 | 36.1×30 |
| SlowFast 8×8, R50 | — | 79.9 | 94.5 | 65.7×30 |
| SlowFast 8×8, R101 | — | 80.4 | 94.8 | 106×30 |
| SlowFast 16×8, R101 | — | 81.1 | 95.1 | 213×30 |
| SlowFast 16×8, R101+NL | — | 81.8 | 95.1 | 234×30 |
SlowFast 16×8 R101+NL 在 K600 上达到 81.8% top-1,超过 StNet-IRv2 79.0%(ActivityNet Challenge 2018 冠军)。这说明 SlowFast 架构在大规模数据上有很好的可扩展性。
5.3 Charades(长时多标签动作)
Charades #charades2016 是长时多标签动作数据集(视频约 30 秒),用 mAP 评估:
| 模型 | pretrain | mAP | GFLOPs×views |
|---|---|---|---|
| CoViAR, R-50 | ImageNet | 21.9 | N/A |
| MultiScale TRN | ImageNet | 25.2 | N/A |
| Nonlocal, R101 #nonlocal2018 | ImageNet+K400 | 37.5 | 544×30 |
| STRG, R101+NL | ImageNet+K400 | 39.7 | 630×30 |
| Slow-only (baseline) | K400 | 39.0 | 187×30 |
| SlowFast | K400 | 42.1 | 213×30 |
| SlowFast +NL | K400 | 42.5 | 234×30 |
| SlowFast +NL | K600 | 45.2 | 234×30 |
SlowFast 比 Slow-only baseline 高 3.1 mAP,比之前的 SOTA STRG(39.7 mAP)高 2.4 mAP,同时 FLOPs 更少(234 vs 630)。这是 Fast 通道在长时多标签场景下的额外价值——Fast 通道的高时间分辨率对长动作建模很有帮助。
5.4 AVA Action Detection(时空动作检测)
AVA #ava2018 是时空动作检测数据集,437 部电影,60 个原子动作。SlowFast 在 AVA v2.1 取得 27.3 val mAP,test mAP 27.1,并赢得 ActivityNet Challenge 2019 的 AVA 赛道冠军(ensemble 34.3 mAP)。
| 模型 | flow | video pretrain | val mAP | test mAP |
|---|---|---|---|---|
| I3D #ava2018 | — | K400 | 14.5 | — |
| I3D | ✓ | K400 | 15.6 | — |
| ACRN, S3D | ✓ | K400 | 17.4 | — |
| ATR, R50+NL | — | K400 | 20.0 | — |
| ATR, R50+NL | ✓ | K400 | 21.7 | — |
| 9-model ensemble | ✓ | K400 | 25.6 | 21.1 |
| I3D | — | K600 | 21.9 | 21.0 |
| SlowFast | — | K400 | 26.3 | — |
| SlowFast | — | K600 | 26.8 | — |
| SlowFast +NL | — | K600 | 27.3 | 27.1 |
| SlowFast* +NL | — | K600 | 28.2 | — |
SlowFast 在 AVA 上的核心消融值得单独看(论文 Table 7 #slowfast2019):
| 模型 | T×τ | ω | mAP |
|---|---|---|---|
| Slow-only, R50 | 4×16 | — | 19.0 |
| SlowFast, R50 | 4×16 | 8 | 24.2 |
类别分析也很有启发(论文 Figure 4 #slowfast2019):
提升最大的类别都是周期性/重复性动作(hand clap, swim, run, dance, eat)——这些恰好是 Fast 通道最擅长的"快速运动模式"。少数反而下降的类别(answer phone, lie/sleep, shoot)下降幅度都很小(<0.5 AP),可能是因为这些是相对静止或定义模糊的动作。
SlowFast 的训练配置是它能稳定训练 from scratch 的关键。论文 Appendix 给了详细超参数 #slowfast2019:
6.1 训练超参数披露表
| 配置项 | 具体设置 | 披露状态 |
|---|---|---|
| 优化器 | 同步 SGD,momentum=0.9, weight decay=1e-4 | 论文披露 |
| 学习率 schedule | Half-period cosine: $\eta_n = \eta \cdot 0.5 [\cos(\frac{n}{n_{\max}}\pi) + 1]$ | 论文披露 |
| Base learning rate (K400) | η=1.6 | 论文披露 |
| Warmup | Linear, 8k iterations (K400), 1k (AVA) | 论文披露 |
| Batch size | 8 clips/GPU × 128 GPUs = 1024 (K400) | 论文披露 |
| 训练 epochs | 256 (T≤4) / 196 (T>4) / 2× for K600 | 论文披露 |
| BN statistics | 在每个 8 clips 内计算 | 论文披露 |
| Dropout | 0.5(在 final classifier 前) | 论文披露 |
| 初始化 | He initialization | 论文披露 |
| 训练硬件 | 128 GPUs 同步 SGD | 论文披露 |
| 数据增强(空间) | 224×224 随机 crop,更短边 [256, 320] random scale,horizontal flip | 论文披露 |
| 数据增强(时间) | 随机采样 αT×τ 帧 clip | 论文披露 |
| 推理配置 | 256×256 spatial,10 temporal clips × 3 crops = 30 views | 论文披露 |
6.2 训练成本估算
从论文 Appendix 的信息可以估算训练成本:
- 硬件:128 GPUs (推测为 V100 32GB)
- 训练时长:~256 epochs × 60k iter / 1024 batch ≈ 几个 GPU-day
- 每个 iter 处理 1024 clips,每 clip 处理 64 帧
- 总训练 token 数:~240k K400 videos × 256 epochs = 60M+ samples
对于资源有限的研究者:论文提到单 8-GPU 机器也能达到相近精度,但需要相应调整学习率。
6.3 PySlowFast 开源框架
论文最重要的"工程遗产"是 PySlowFast 框架 #slowfast2019:
- 仓库:https://github.com/facebookresearch/SlowFast
- 许可证:Apache 2.0
- 状态:活跃维护(截至 2024 年)
- 提供:完整训练 pipeline、K400/K600/Charades/AVA 复现脚本、Model Zoo 预训练权重、可视化工具
PySlowFast 已经成为视频理解领域事实标准框架,是后续 X3D #x3d2020、MViT #mvit2021 等工作的代码基础。
6.4 复现建议
复现 SlowFast 的关键 tips
- 多 GPU 训练:至少 8 GPU(论文用 128)。
- BN statistics 范围:必须用 8 clips 内的 BN statistics,不能用 global BN(这与图像 ResNet 不同)。
- warmup 关键:8k iter warmup 对稳定训练很重要,否则前期 loss 会发散。
- AMP 加速:可以用 mixed precision (fp16) 加速训练,论文附录没明确说但社区已广泛使用。
- checkpoint 间隔:建议每 5 epoch 保存一次,用于恢复中断的训练。
6.5 失败案例与局限
虽然 SlowFast 在大多数类别上都超过 Slow-only,但 AVA 上有 3 个类别反而略低:
| 类别 | AP 变化 | 可能原因 |
|---|---|---|
| answer phone | -0.1 | 数据样本少,定义模糊 |
| lie/sleep | -0.2 | 动作慢,Fast 通道优势小 |
| shoot | -0.4 | 需要长程上下文 |
整体上这些下降幅度都 < 0.5 AP,远小于 5.2 mAP 的总体提升。这反映了一个普遍现象:Fast 通道对周期性/快速动作帮助大,对慢速/静态动作帮助小。
未在论文中明确讨论的局限
- 训练资源需求高:128 GPU 训练 from scratch 是一道高墙,单机复现要小心调整 LR。
- 超参依赖经验:φ=1/8, ω=8, τ=16 是经验值,没有强理论保证。
- 对极细粒度时间定位不擅长:Fast 通道擅长"模式",对"时刻点"不敏感。
- 无端到端时空定位能力:AVA 任务需要外接 Faster R-CNN 做 person detection,SlowFast 只做 action classification。
7.1 与 3D CNN 演进的对比
| 方法 | 年份 | 核心思路 | K400 top-1 | 特征 |
|---|---|---|---|---|
| C3D | 2015 | 3×3×3 3D kernel | N/A (UCF/HMDB) | 统一时空 |
| I3D | 2017 | Inception inflated to 3D | 72.1 (ImageNet) | 统一时空 |
| Two-Stream | 2014 | RGB + optical flow | — | 双模态同构 |
| R(2+1)D | 2018 | 2D + 1D 分解 | 72.0 (scratch) | 分解卷积 |
| S3D | 2018 | top-heavy 拓扑 | 69.4 (scratch) | 拓扑分离 |
| Nonlocal R101 | 2018 | 3D + non-local | 77.7 (ImageNet) | 长程依赖 |
| SlowFast | 2019 | 异构双速通道 | 79.8 (scratch) | 时间速度异构 |
| X3D | 2020 | 渐进式扩展 2D | 79.1 (scratch) | 多轴扩展 |
| MViT | 2021 | 多尺度 Transformer | 81.3 (scratch) | 多尺度 attention |
SlowFast 在这条谱系中扮演了"思想转折"的角色:它揭示了 3D CNN"对称处理空间-时间"的局限,提出异构双速作为替代范式。这影响了后续所有视频识别架构的设计哲学。
7.2 后续工作的直接继承
- X3D #x3d2020:Feichtenhofer 本人(SlowFast 一作)2020 年的延续工作,沿时间/空间/宽度/深度/帧率等多个轴逐步扩展一个 tiny 2D 网络到 video 域。在 K400 上达到 79.1% top-1,FLOPs 比 SlowFast 更少。
- MViT #mvit2021:Haoqi Fan(SlowFast 二作)2021 年提出的多尺度视觉 Transformer,把 SlowFast 的"多尺度时间建模"思想引入 Transformer。在 K400 上达到 81.3%,无需大规模预训练。
- Video Swin Transformer #videoswin2022:层级化视频 Transformer,借鉴 SlowFast 的 hierarchical 特征设计。
- Audiovisual SlowFast:把双速思想扩展到音视频融合。
7.3 可操作启发
从 SlowFast 我们能学到哪些设计原则?
7.4 适合阅读的下一篇文章
- 想看 SlowFast 一作后续工作:X3D 论文精读(待补)
- 想看 SlowFast 思想在 Transformer 上的延伸:MViT 论文精读(待补)
- 想看更基础的 3D CNN 综述:动作识别综述 和 TSN 论文精读(待补)
- 想看其他动作识别经典:I3D 论文精读(待补) / R(2+1)D 论文精读(待补)
SlowFast 不仅是一篇工程 paper,它代表了一种设计哲学:承认数据的内在非对称性,把非对称性作为设计输入而不是包袱。这个思想在 3D CNN 时代是颠覆性的,在 Transformer 时代也仍在被借鉴。
核心论文
- SlowFast 论文:Feichtenhofer et al. 2019,ICCV 2019 Oral
- 代码:https://github.com/facebookresearch/SlowFast
- 后续:X3D (CVPR 2020), MViT (ICCV 2021), Video Swin (CVPR 2022)
参考来源
- Feichtenhofer, C., Fan, H., Malik, J., & He, K. (2019). SlowFast Networks for Video Recognition. ICCV 2019. arXiv:1812.03982 · PySlowFast Code
- Carreira, J., & Zisserman, A. (2017). Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset. CVPR 2017. arXiv:1705.07750
- Simonyan, K., & Zisserman, A. (2014). Two-Stream Convolutional Networks for Action Recognition in Videos. NIPS 2014. arXiv:1406.2199
- Tran, D., Wang, H., Torresani, L., Ray, J., LeCun, Y., & Paluri, M. (2018). A Closer Look at Spatiotemporal Convolutions for Action Recognition. CVPR 2018. arXiv:1711.11248
- Xie, S., Sun, C., Huang, J., Tu, Z., & Murphy, K. (2018). Rethinking Spatiotemporal Feature Learning: Speed-Accuracy Trade-offs in Video Classification. ECCV 2018. arXiv:1712.04851
- Wang, X., Girshick, R., Gupta, A., & He, K. (2018). Non-local Neural Networks. CVPR 2018. arXiv:1711.07971
- Kay, W., et al. (2017). The Kinetics Human Action Video Dataset. arXiv:1705.06950
- Carreira, J., et al. (2018). A Short Note about Kinetics-600. arXiv:1808.01340
- Sigurdsson, G. A., Varol, G., Wang, X., Farhadi, A., Laptev, I., & Gupta, A. (2016). Hollywood in Homes: Crowdsourcing Data Collection for Activity Understanding. ECCV 2016. arXiv:1604.01753
- Gu, C., et al. (2018). AVA: A Video Dataset of Spatio-temporally Localized Atomic Visual Actions. CVPR 2018. arXiv:1705.08421
- He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep Residual Learning for Image Recognition. CVPR 2016. arXiv:1512.03385
- Ren, S., He, K., Girshick, R., & Sun, J. (2015). Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. NIPS 2015. arXiv:1506.01497
- Lin, T.-Y., Dollár, P., Girshick, R., He, K., Hariharan, B., & Belongie, S. (2017). Feature Pyramid Networks for Object Detection. CVPR 2017. arXiv:1612.03144
- Feichtenhofer, C. (2020). X3D: Expanding Architectures for Efficient Video Recognition. CVPR 2020. arXiv:2004.04730
- Fan, H., Xiong, B., Mangalam, K., Li, Y., Yan, Z., Malik, J., & Feichtenhofer, C. (2021). Multiscale Vision Transformers. ICCV 2021. arXiv:2104.11227
- Weiss, Y., Simoncelli, E. P., & Adelson, E. H. (2002). Motion illusions as optimal percepts. Nature Neuroscience.
- Livingstone, M., & Hubel, D. (1988). Segregation of form, color, movement, and depth: anatomy, physiology, and perception. Science.
- Ruderman, D. L. (1994). The statistics of natural images. Network: Computation in Neural Systems.
- Huang, J., & Mumford, D. (1999). Statistics of natural images and models. CVPR 1999.
- He, D., et al. (2018). StNet: Local and Global Spatial-Temporal Modeling for Action Recognition. AAAI 2019.
- Liu, Z., et al. (2022). Video Swin Transformer. CVPR 2022. arXiv:2106.13230