双流网络

基本信息

项目 内容
论文标题 Two-Stream ConvNets for Action Recognition in Videos
作者
作者单位 牛津大学
时间 2014
发表会议/期刊
全称 Two-Stream Network

方法概览

特点 文章性质
输入 一个输入图像序列,一个输入光流图序列
输出 分类
所属领域 视频分类,视频理解,视频动作识别

在 双流网络之前,视频动作识别主要有前两种方式:

方法 问题
2D CNN + LSTM/RNN 2D 卷积只提取空间特征,RNN 建模时序,但时空分离,难以捕捉时空联合特征
纯 3D CNN(如 C3D) 能同时建模空间和时间,但通常从零训练,参数多、训练难、性能有限。
双流网络 在时间和空间上分别用卷积神经网络,时间上是先抽取光流,然后用卷积神经网络来学习光流到最后动作的一个映射关系,最后再融合(late fusion,做加权平均)起来。
3d-fused双流神经网络 前半部分和双流网络的结构相同,只是在最后并不是用later fusion将2个网络的结果做加权平均,而是在最后用一个小的3d卷积神经神经网络替代,做early fusion。
双流I3D网络 双流网络相比就是用3d cnn替代了2d cnn

创新点

  1. 双流网络(Two-Stream Network) 是视频理解领域的一个开创性思想,它通过分别建模视频的外观(appearance)和运动(motion)信息
  2. 双流网络包含两个并行的分支(stream):光流 = 像素的运动矢量,表示相邻帧之间每个像素的位移方向和大小,生成一个2通道图像(水平位移 u,垂直位移 v)。颜色表示方向(Hue)向右运动 → 红色,向上运动 → 黄色,亮度表示速度(Value)
分支 输入 作用
Spatial Stream(空间流) 单帧 RGB 图像 学习“外观”信息(如人、物体、场景)
Temporal Stream(时序流) 光流图(Optical Flow) 学习“运动”信息(如方向、速度)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import torch
import torch.nn as nn

class TwoStreamNet(nn.Module):
def __init__(self, num_classes=101, backbone='resnet18'):
super(TwoStreamNet, self).__init__()
# 共享权重?通常不共享
self.spatial_net = torchvision.models.resnet18(pretrained=True)
self.temporal_net = torchvision.models.resnet18(pretrained=True)

# 修改输入通道:光流通常是 2 或 10 帧堆叠 → 20 通道
self.temporal_net.conv1 = nn.Conv2d(20, 64, kernel_size=7, stride=2, padding=3, bias=False)

# 分类头
self.spatial_net.fc = nn.Linear(512, num_classes)
self.temporal_net.fc = nn.Linear(512, num_classes)

def forward(self, rgb_frame, flow_stack):
# rgb_frame: (B, 3, H, W)
# flow_stack: (B, 20, H, W) # 10 帧光流,每帧 2 通道

spatial_out = self.spatial_net(rgb_frame) # (B, num_classes)
temporal_out = self.temporal_net(flow_stack) # (B, num_classes)

# 融合:平均、加权、SVM
fused_out = (spatial_out + temporal_out) / 2
return fused_out, spatial_out, temporal_out