文章目录
- 一 背景
- 1.1 背景
- 1.2 研究目标
- 二 模型
- 2.1 双流架构
- 2.2 光流
- 三 实验
- 四 思考
- 4.1 多流架构
- 4.2 fusion策略
- 4.3 fusion的early与late
先简单聊了双流网络最初在视频中的起源,之后把重点放在 “多流结构"和"fusion” 上。
一 背景
1.1 背景
Two-Stream Convolutional Networks for Action Recognition in Videos
作者:Karen Simonyan & Andrew Zisserman(牛津 VGG)
在图像分类(ImageNet)中,CNN 已经大获成功,但视频是图像的“时序扩展”,有两个新问题:
挑战 | 说明 |
---|---|
时空建模难 | 视频不仅有空间信息(每一帧的画面),还有时间信息(帧之间的运动) |
计算复杂 | 直接对 3D 视频卷积计算代价极高(3D CNN 很重) |
表征不足 | 如果只用单帧静态图做分类,会忽略动作的动态过程 |
1.2 研究目标
论文的目标是:
在不使用 3D 卷积或循环网络的前提下,设计一个高效的 CNN 框架,能够同时提取视频的:
- 空间外观特征(谁在做)
- 时间运动特征(动作怎么做)
核心思想:双流架构
作者提出将视频信息分为两类独立学习:
模块 | 输入 | 目标 |
---|---|---|
Spatial Stream | RGB 静态图像 | 识别外观(场景、对象) |
Temporal Stream | 光流序列 | 捕捉动作的运动信息 |
- 两个网络分别独立训练
- 最后在 softmax 输出层融合(late fusion)
二 模型
2.1 双流架构
一、Spatial Stream 输入
输入内容:
- 视频中单帧图像(RGB)
- 每个动作样本会从视频中抽取若干帧(random sampling)
Shape: (N, 3, 224, 224)
- N:batch size
二、Temporal Stream 输入
输入内容:
- 多帧之间的光流图(Optical Flow)
- 光流图反映的是像素在 x、y 方向上的位移量
- 对每帧计算 optical flow,作者用 堆叠光流帧 来表达时间信息
作者默认使用 10 帧的光流,x 与 y 两个方向:
10 帧 × 2 个方向(x, y)= 20 个通道
所以:
Shape: (N, 20, 224, 224)
2.2 光流
光流(Optical Flow)是什么?
定义:
光流是指:物体在运动时,图像上像素点的移动速度和方向,通常表现为连续两帧图像中每个像素点的位移。
- 假设一个人从左走到右;
- 我们拍了两张连续的视频帧(比如第 t 帧和第 t+1 帧);
- 那么在这两帧之间,人身上的每个像素点都“移动”了一个位置;
- 光流就是把这种位移提取出来,形成一张“光流图”;
- x方向的速度图(水平移动)
- y方向的速度图(垂直移动)
(x方向位移图, y方向位移图)
⇒ 通道数 = 2
每个像素的 (x, y) 分量告诉你它的运动方向与幅度。
光流的计算方法
- 论文中使用了 TV-L1 算法,这是经典的光流计算方法(速度和鲁棒性折中);
- 实际实现通常使用 OpenCV 的
cv2.calcOpticalFlowFarneback()
或 DeepFlow、RAFT 等现代方法。
在 Two-Stream 网络中的光流处理流程
具体来看 Temporal Stream 的数据预处理流程:
输入阶段:从视频 → 光流堆叠张量
-
取连续 T 帧视频图像
假设 T = 10 -
对每一对相邻帧计算光流
会得到 T-1 张光流图,每张包含:- x方向:shape = (H, W)
- y方向:shape = (H, W)
-
将 x 和 y 的结果堆叠起来
得到 2 × (T-1) 通道的张量:Shape: (2 × (T-1), H, W) ≈ (20, 224, 224)
视频帧序列: F1 F2 F3 ... F10
↓ ↓ ↓ ↓
光流图计算: Flow1 Flow2 ... Flow9
↓ ↓ ↓
通道堆叠: [dx1, dy1, dx2, dy2, ..., dx9, dy9] → (20, H, W)
文章还讨论了两种获取光流的方法:
左边的是“刻舟求剑”法,右边的是“追踪”法。
不过在论文的模型中,最后“刻舟求剑”反而更好,作者也无法解释。
三 实验
实验类型 | 方法 / 配置 | 数据集 | Top-1 精度 (%) | 备注说明 |
---|---|---|---|---|
主实验 | Spatial Stream (RGB 单帧) | UCF-101 | 73.0 | 使用 ImageNet 预训练 CNN |
Temporal Stream (光流序列) | UCF-101 | 81.0 | 输入为 10 帧光流 (20 通道) | |
Two-Stream Fusion | UCF-101 | 88.0 | 空间 + 时间流 softmax 输出平均融合 | |
Spatial Stream | HMDB-51 | 40.5 | - | |
Temporal Stream | HMDB-51 | 54.6 | - | |
Two-Stream Fusion | HMDB-51 | 59.4 | - | |
主对比 | Improved Dense Trajectories (IDT) | UCF-101 | 85.9 | 手工特征方法 |
Improved Dense Trajectories (IDT) | HMDB-51 | 57.2 | - | |
消融实验 | Temporal 流输入帧数 = 5 | UCF-101 | ~78.0 | 光流帧少,时序建模不足 |
Temporal 流输入帧数 = 10 | UCF-101 | 81.0 | 默认使用配置 | |
Temporal 流输入帧数 = 20 | UCF-101 | ~82.3 | 提升有限,开销更大 | |
SVM Late Fusion | UCF-101 | ≈88.0 | 与 softmax 融合相当,复杂度高 | |
Softmax Averaging Fusion | UCF-101 | 88.0 | 简洁有效,推荐使用 |
- 时间流 > 空间流:光流序列对于动作识别贡献更大;
- 融合优于单流:融合后显著提升识别性能;
- 堆叠帧数的 tradeoff:10 帧是精度与效率的较好平衡;
- 融合策略:softmax 平均足够好,不必上复杂 SVM;
- 对比 IDT:Two-Stream 模型在精度上成功超越传统特征。
四 思考
4.1 多流架构
“多流架构不是模型结构,而是一种视野和思维方式。”
它鼓励从任务本质中挖掘“不同视角”,然后用网络结构显式表达它们。
“多流架构(Multi-Stream Architecture)”的通用思想 不仅适用于视频动作识别,在很多任务中都可以迁移这种结构设计思想
核心理念:不同模态/视角/尺度的信息,各自建模,再融合
视频理解(动作识别 / 视频问答)
- Two-Stream → RGB + Optical Flow
- SlowFast → 快帧流 + 慢帧流(建模短期 vs 长期动态)
NLP 多源信息融合
- 多语言嵌入流(BERT + 翻译结果)
- Query/Document 双流(Dense Retrieval)
生物信息学
- 序列流(FASTA)+ 结构流(PDB)+ 图拓扑流(Graph)
- 蛋白质中可以分别建模残基特征 vs 二级结构 vs 相互作用图谱
图像识别 / 细粒度分类
- 原图流 + 注意力放大图流(如 Bilinear CNN)
- 多尺度输入(如 FPN)
为什么有效?
机制 | 好处 |
---|---|
解耦学习 | 每种信息流都可以专注于某种特征维度 |
表征增强 | 比单一路径更强,互补增强鲁棒性 |
易于融合 | 可以在特征级或决策级灵活组合 |
并行训练 | 多流结构天然适配分布式/并行计算 |
4.2 fusion策略
聊聊 Fusion 模型设计 ——多流网络的灵魂部分
一 特征级融合(Feature-Level Fusion)
将不同流提取的特征表示向量在隐空间中合并,生成一个更具表达力的 joint representation。
-
直接拼接(Concatenation)
fused = torch.cat([f_seq, f_phys, f_struct], dim=-1)
- 优点:操作简单,保留全部特征
- 缺点:维度急剧升高,可能冗余或造成过拟合
-
加权求和(Fixed or Learnable Weights)
fused = α*f_seq + β*f_phys + γ*f_struct
- α, β, γ 可为超参数或可训练变量
- 更轻量,也利于后续网络收敛
-
注意力融合(Attention Fusion)
# 跨模态 attention 融合多个分支输出 w_i = softmax(W_q · tanh(W_k f_i)) # 生成每个分支的 attention 权重 fused = Σ w_i * f_i
- 动态融合不同“模态”的重要性
- 可以引入 transformer-style 多头注意力
二 加权融合(Weighted Fusion)
每条信息流不仅提取自己的特征,还由模型学习一个权重 来衡量其“重要性”,用于加权组合。
-
Gating Network
gate = sigmoid(W · [f_seq, f_phys, f_struct]) fused = gate ⊙ f_seq + (1 - gate) ⊙ f_phys
- 类似于 GRU 的门控机制
- 可以设计为 scalar 或 vector 权重(每个通道或维度)
-
Modal Attention
- 给不同“模态”分配注意力权重
- 通常以 transformer 为骨干:
query = f_seq # 当前主导模态 keys = [f_phys, f_struct] values = [f_phys, f_struct] attn = softmax(query · keyᵀ) fused = query + attn · values
三 决策级融合(Decision-Level Fusion)
每个子网络(分支)独立产生一个预测输出,然后在“输出阶段”融合多个决策。
-
平均法(Averaging)
pred = (pred_seq + pred_phys + pred_struct) / 3
- 简单稳定,适合 soft target 情况(如 sigmoid 输出)
-
投票法(Voting)
- 用于 hard prediction(如 argmax 输出)
- 多数投票法:
vote = mode([argmax(p1), argmax(p2), argmax(p3)])
-
Meta-classifier(堆叠融合)
- 用一个新的 MLP 学习如何根据多个分支输出组合最终预测:
meta_input = [pred1, pred2, pred3] meta_out = MLP(meta_input)
如何选择?
对比维度 | 特征级融合(Feature Fusion) | 加权融合(Weighted Fusion) | 决策级融合(Decision Fusion) |
---|---|---|---|
原理 | 拼接所有模态特征 | 学习每个模态的重要性再融合 | 每个模态独立输出结果,后期组合 |
输入要求 | 特征 shape 可以对齐 | 各流要能共享语义空间 | 各流可以完全异构 |
模型结构 | 单一模型结构接入多个特征 | 有 Attention / Gating 模块 | 每条流都是独立模型 |
表达能力 | 高 | 最高(信息选择+建模) | 中(主要靠“投票”或 stack 学习) |
实现复杂度 | 低 | 中高(需加权机制) | 高(多模型集成 + output 决策) |
性能表现 | 较好 | 较优 | 稳定,提升有限 |
适用场景 | 多个低维或结构相似的特征 | 多模态融合,特征异质性中等偏高 | 模态完全不同,或者训练时难以对齐 |
1. 特征级融合:最常用,适合“半模态差异”
使用条件:
- 每条流提取的是中间向量(embedding、特征向量)
- 模态不完全不同(如:序列和理化、结构向量)
应用:
- 肽链序列嵌入 + PseAAC + PSSM → 拼接送入 MLP/CNN
- 图结构向量 + CNN 特征拼接 → 送入 Transformer
2. 加权融合:信息噪声多、流重要性差异大时用!
使用条件:
- 某些模态“好坏不一”,例如预测 contact map 有噪声
- 想“让模型自己决定”谁重要
应用:
- 序列流 vs 图结构流中自动识别信任度
- 多种生物特征拼接后加权(蛋白结构有时预测不准)
3. 决策级融合:结构完全不同 or 模型已训练好
使用条件:
- 流之间完全异构,不能 early 或 mid fusion
- 模型已经训练好,后面想“ensemble 提升”
应用:
- CNN 模型 vs GNN 模型,投票融合
- 多个独立网络:序列预测 + 结构预测 + 文本(文献)预测,最终结果由“多数模型决定”
4.3 fusion的early与late
然后是early fusion 和 late fusion的对比和介绍:
定义与基本区别
类型 | 定义 |
---|---|
Early Fusion | 多个模态/特征在输入阶段或浅层特征即融合,模型整体作为一个网络处理 |
Late Fusion | 各个模态/特征独立编码(不同网络或分支),在深层语义或输出阶段融合 |
对比:
对比点 | Early Fusion | Late Fusion |
---|---|---|
融合位置 | 输入前 or 第1~2层 | 特征层、中间层或决策层 |
表达能力 | 低~中 | 高(每模态单独学习) |
实现难度 | 简单,维度统一即可 | 较复杂,需要设计多分支、统一维度 |
模态干扰风险 | 高(不同模态混合过早) | 低(先独立再融合) |
信息保留 | 容易丢失语义,需 careful tuning | 每个模态语义表达充分 |
计算开销 | 通常更低 | 多个网络并行,计算量大 |
适用场景 | 模态差异小,如多组蛋白理化特征 | 模态差异大,如序列+结构+图 |
什么时候选 Early Fusion?
适合的场景:
- 特征类型“同质”:如全是理化性质数值(1D向量)
- 特征维度相近 / 对齐:如 AC, AAC, CTD(拼成一条向量即可)
- 要求轻量部署 / 计算资源受限(模型更小)
- 对融合机制无特殊要求(拼接即可)
不适合:
- 异构模态(如:结构图 + 序列)
- 大模型(Transformer、GNN 等)应用中
什么时候选 Late Fusion?
适合的场景:
- 模态差异大(比如生物信息里面的 序列 + PSSM + 图结构)
- 每个模态都希望学习语义特征(独立网络)
- 需要灵活控制信息流通(可加 attention)
- 希望进行模态消融分析(每个分支可单独关闭)
进一步增强:
- 可以使用 cross-attention 让模态间互动(如 ESM-IF)