Token导航 LogoToken导航

AI 资讯 · 科技行者

两流网络如何突破CNN动作识别瓶颈

更新 2026-11-05科技行者正文 5162字阅读约 17分钟

2012年,AlexNet让计算机识别静态图片的准确率一夜之间甩开了所有传统方法,整个学界都以为深度学习接下来会顺理成章地拿下视频领域。

结果接下来发生的事让很多人没想到。整整两年,没有一支团队能让深度学习在视频动作识别这件事上,打败一个纯靠人工设计特征的老办法。

那个老办法叫做改进密集轨迹。

> iDT(改进密集轨迹):一种手工设计的视频特征提取方法,通过在视频里密集采样像素点并跟踪它们的运动轨迹,再提取方向梯度、光流方向、运动边界等多种描述子来表示一个动作,深度学习兴起前它是动作识别领域的标杆方法。

2014年初,Karpathy等人做了一次很直接的尝试,把视频拆成一帧一帧的图像,直接堆起来喂给卷积神经网络去做端到端的分类训练。听起来合情合理,CNN连猫狗都能分清了,连起来的画面应该更容易。

结果出来后,大家都愣住了。微调之后的CNN在UCF101这个标准测试集上只拿到了65%左右的准确率,而iDT这边轻松做到87%以上,整整落后了22个百分点。

22个百分点意味着什么?意味着每5个动作里,深度学习就要比手工方法多认错1个还多。

这就是本文要解决的那道题。为什么一个在图片识别上碾压一切的网络架构,到了视频上反而变得这么笨。

问题到底卡在哪

答案其实没有那么神秘。一张静态图片里,CNN学的是形状、颜色、纹理这些空间上的规律。但一段视频除了空间信息,还藏着时间上的规律,也就是物体是怎么动的。

直接把帧堆起来喂给CNN,等于让网络自己从一堆像素的变化里,摸索出"运动"这个抽象概念。这件事对CNN来说并不自然,卷积核天生擅长抓取局部的空间纹理,却没有专门为"追踪像素怎么移动"这件事设计过结构。

牛津大学视觉几何组(VGG)的Karen Simonyan和Andrew Zisserman,接下这道题的时候做了一个在当时看起来有点"笨"但后来证明极其有效的决定:既然一个网络搞不定两种信息,那就干脆用两个网络,一个专门看静态外观,一个专门看运动本身。

为什么要拆成两条路:空间流和时间流

> 两流网络:把动作识别拆成两个独立的卷积神经网络分别处理,一个处理单帧图像捕捉外观信息,一个处理光流场捕捉运动信息,最后把两边的判断结果合并。

空间流很好理解,它吃进去的就是视频里的一张静止画面,架构和当时流行的图像分类CNN差不多,甚至可以直接拿ImageNet上预训练好的权重来做初始化。它负责回答"画面里有什么",比如场地、器械、人物姿态这些跟运动无关、单看一帧也能判断的线索。

时间流负责回答"东西在往哪动",它吃进去的不是原始像素,而是提前计算好的光流场,这个概念下一节会细讲。

想象你在看一场足球比赛,教练只给你发了一张照片让你判断对方前锋下一步要做什么。你能看出他穿几号球衣、站在场地哪个位置、身体朝向哪边,这些都是外观信息,但你猜不出他是要带球冲刺还是原地停球,因为照片里没有运动的线索。反过来,如果只给你一段连续画面之间的运动轨迹图,却看不清球衣颜色和场上位置,你照样分不清是前锋还是后卫在跑。

两种信息都重要,而且处理方式差得很远,这正是两流网络要用两个独立CNN分别训练的原因。如果硬把这两种信号塞进同一个网络的同一层去学,网络就会在"球拍长什么样"和"球拍往哪挥"这两件事之间来回打架,很难同时学精,这也正是直接堆叠帧的做法效果不好的根本原因。

时间流的秘密武器:光流

> 光流:描述图像序列里每个像素运动方向和速度的向量场,通俗说就是算出"这个像素刚才往哪挪了多远",常用水平和垂直两个方向的分量表示。

时间流CNN不是直接吃原始视频帧,而是先用传统算法把连续若干帧之间的光流场算出来,再把这些光流场沿着通道方向堆叠起来,当成一张"多通道图片"喂给网络。

举个例子,教一个从没见过跳绳的人理解什么是跳绳,如果只给他看一张跳绳过程中拍下的照片,他可能以为那人在原地跳或者摆手,根本看不出绳子在转。但如果把连续十几张照片之间"每个像素挪动的方向和距离"画成一张箭头叠加图给他看,他立刻能看出手腕在画圈、脚尖在起落。

光流做的就是这件事,它把颜色、纹理这些和运动本身无关的信息都滤掉了,只留下"谁往哪个方向动了多少"。这正是动作识别真正需要的信号。如果不这样做,直接把连续帧堆起来喂给网络,就是前面提到的Karpathy等人的做法,网络要自己从像素变化里分离运动模式,结果准确率明显更差。

论文里还给出了一张很直观的图,画的是时间流CNN学出来的第一层卷积核。你会发现这些滤波器大多呈现出某种方向性,像是专门识别"朝左上方移动"或者"朝右下方移动"这类局部运动模式的探测器。这不是人为设计出来的,是网络自己从光流数据里学出来的,而且这种对运动方向敏感的滤波器,和生物视觉系统里专门响应运动方向的神经细胞有些相似,说明网络确实抓住了光流场里最关键的那部分信息。

小数据集的难题和一个借数据的办法

两流网络用的训练数据是UCF101和HMDB51,前者有一万多段短视频,后者几千段,比起训练一个深度CNN通常需要的百万级图片规模,这个量级小得可怜。

空间流还好办,可以借用ImageNet上预训练好的权重,相当于已经见过上百万张图片打下的底子。但时间流处理的是光流场,这种数据在ImageNet里根本不存在,等于要从零开始学,训练数据又太少,很容易学成"背答案"而不是真正学会识别运动。

> 多任务学习:让同一个共享网络同时在多个数据集或多个任务上做训练,相当于把几份小数据集拼起来用,缓解单个任务数据量不足的问题。

研究者的办法是让时间流CNN同时在UCF101和HMDB51两个数据集上做分类,共享大部分网络参数,只在最后分出两个独立的输出层。

这有点像同时教一个学生两门语言,一门教材只有几百页,另一门有上万页。如果把两门课分开教,教材薄的那门很容易学得夹生,但如果把两门课的练习混在一起训练学生对语言结构的敏感度,教材薄的那门也能借到另一门积累下来的语感。多任务学习让数据量小的那个数据集蹭上了另一个数据集的训练信号,光流网络的表现因此明显提升。如果不这样做,单独在小数据集上硬训练光流CNN,很容易过拟合,性能会打折扣。

两条流怎么合成一个答案

两个网络各自输出一个分类概率分布之后,还需要一步把它们合并成最终判断。

论文试了两种办法,一种是直接把两边的softmax输出概率做加权平均,另一种是把两边的输出分数拼起来,再训练一个线性SVM去做最后的分类决策。

> Softmax:神经网络最后一层常用的函数,把一堆原始分数转换成加起来等于1的概率分布,方便直接解读成"属于每个类别的可能性"。

>

> SVM(支持向量机):一种经典的机器学习分类器,通过找到一个最优分界线把不同类别的样本分开,这里用来把两条流各自给出的分数融合成最终判断。

结果显示,用SVM融合比单纯做平均效果更好,这说明两条流给出的信息并不是简单加权就能用好的,不同动作类别可能更依赖外观,也可能更依赖运动,SVM能学出这种不均衡的权重分配,而简单平均做不到。

下面是论文里核心的实验结果,拿UCF101和HMDB51这两个标准数据集来对比。

| 方法 | UCF101准确率 | HMDB51准确率 |

|---|---|---|

| 直接CNN微调(Karpathy等人路线) | 约65.4% | — |

| iDT手工特征 | 87.9% | 57.2% |

| 仅空间流CNN | 72.8% | 40.5% |

| 仅时间流CNN | 81.2% | 54.6% |

| 两流融合(softmax平均) | 86.9% | 58.0% |

| **两流融合(SVM)** | **88.0%** | **59.4%** |

这张表里最值得停下来看一眼的,是仅用空间流和两流融合之间的差距。从88.0%掉到72.8%,整整少了15个点。这意味着单看外观,机器能认出大半动作,但剩下那些靠运动才能区分的动作,比如"站立"和"原地踏步",光靠一帧画面根本分不清。

更重要的一行是最后那个88.0%对比iDT的87.9%。差距看起来只有0.1个百分点,但这0.1个百分点的意义,是深度学习在视频动作识别这个任务上,第一次打平并反超了手工设计特征。放在2014年这个时间点,这件事的分量不亚于两年前AlexNet在图像识别上的横空出世。

还有一个值得一提的细节,Simonyan和Zisserman这两位作者,几个月后又发表了VGGNet,那篇后来几乎每个学计算机视觉的人都要读的论文。同一个牛津VGG实验室,同一批人,几乎在同一个时间段里,一边攻克图像分类,一边攻克视频动作识别,两条线最后都成了各自领域的奠基性工作。

后来者怎么往下走

两流网络给出的答案不是终点,它留下的明显短板是两条流直到最后一步才合并,中间几乎没有互相配合,而且每次只看一帧画面和一小段光流,没法理解一整段视频的长时间结构。

2016年,Feichtenhofer等人发表了Convolutional Two-Stream Network Fusion,把两条流提前在卷积层中段就进行融合,而不是等到最后输出层才合并,这样网络能更早地让外观信息和运动信息互相校正,UCF101的准确率被推到了92.5%左右。

同一年,Wang等人提出了时间片段网络。

> TSN(Temporal Segment Networks):把一整段视频切成若干个片段,每个片段单独跑一次两流网络,再把所有片段的结果汇总,用来捕捉整段视频的长时间动作结构。

这个办法解决了两流网络只盯着一帧和一小段光流、看不到长时间动作走向的问题,把UCF101的成绩继续推到94%上下。

2017年,Carreira和Zisserman,又是那个Zisserman,提出了I3D。

> I3D(Inflated 3D ConvNet):把图像分类用的二维卷积核直接膨胀成三维卷积核,让网络能够同时在空间和时间维度上做卷积,并配合规模更大的Kinetics视频数据集训练。

这条路线把两流网络开创的"分别处理外观和运动"的思路,进一步升级成了一个能原生处理三维时空信息的网络结构,把这个方向推向了更接近人类水平的识别精度。

从两流网络到卷积层融合,再到时间片段网络,再到三维卷积,这条脈络走下来,核心矛盾始终是同一个:怎么让一个本质上为静态图片设计的网络架构,学会处理时间这个额外的维度。两流网络给出的答案是先分而治之,后来者给出的答案则是让分开的部分越来越早、越来越紧密地重新交织在一起。

写在后面

读这篇论文时,最让我停下来想的不是准确率提升了多少,而是那个被很多人默认忽略的事实:深度学习打败手工特征,不是靠一个更深更大的网络暴力碾压出来的,而是靠承认CNN本身有短板,然后用人工设计的光流算法去弥补这个短板。

这多少打破了一种常见的直觉,很多人以为深度学习的胜利等于端到端、不需要任何人工设计环节的胜利。两流网络恰恰是反过来的例子,它的突破建立在光流这个传统图像处理算法之上,深度网络和手工算法在这里不是取代关系,是分工关系。

另一个让我印象深刻的细节是那张学出来的滤波器图。网络自己学出的运动方向探测器,和生物视觉皮层里对运动方向敏感的细胞结构有相似之处,这种从数据里自发涌现出来的结构,和人类视觉系统演化出来的解决方案不谋而合,这种跨领域的呼应比单纯的准确率数字更让人觉得这件事做对了。

论文没有解决的问题也很明显,两条流各自独立训练到最后一步才合并,这种"后期才交流"的方式注定损失一些协同信息,后来的工作几乎都在往"更早融合"这个方向补。另外光流的计算本身依赖传统算法,速度和精度都成了整个系统的瓶颈,这也是后来I3D这类直接用三维卷积取代光流预处理的工作想要绕开的问题。

一个值得接着想的问题是,当年需要靠两个独立网络分头处理外观和运动,今天的大模型会不会已经在一个足够大的网络内部,隐式地学会了类似的分工,只是我们没有像当年那样打开它、画出滤波器图去验证过。

Q&A

Q1:两流网络是什么?

A:两流网络是Simonyan和Zisserman在2014年提出的视频动作识别方法,把一个CNN拆成空间流和时间流两个独立网络,分别处理单帧图像的外观信息和光流场的运动信息,最后融合两边结果做出判断。

Q2:两流网络的准确率有多高,真的打败了手工特征吗?

A:在UCF101数据集上,两流网络融合后达到88.0%的准确率,略高于当时最强的手工特征方法iDT的87.9%,这是深度学习第一次在视频动作识别任务上反超手工设计的特征方法。

Q3:两流网络之后还有哪些重要的改进工作?

A:2016年Feichtenhofer等人提出卷积层级融合,把两条流更早地结合起来;同年Wang等人提出时间片段网络解决长视频建模问题;2017年Carreira和Zisserman提出I3D,用三维卷积直接处理时空信息,进一步提升了识别精度。

文章标签学术研究

资讯来源:由AI资讯编辑整理自互联网公开内容,版权归原作者所有,未经许可,不得转载。