作者:互联网 时间: 2026-09-04 13:35:58
在人工智能内容学习中,视频里的动作,AI 是怎么"看懂"的是常见主题。很多人在阅读时会遇到概念分散、步骤不清和注意点难以归纳的问题。本文按照基础概念、操作流程和关键细节,对相关内容进行整理。
2014 年之前,有一件事一直让搞视频识别的研究者们很尴尬。

深度学习那时候已经在图片识别上打得所有人满地找牙了。2012 年的 AlexNet 让整个计算机视觉圈子看到卷积神经网络的威力,图片分类的错误率一路往下砸。可是到了视频动作识别这个领域,情况完全不一样。
一个叫做"密集轨迹"的手工特征方法,硬是把神经网络挡在门外整整两年。你没看错,不是差一点点,是深度学习方法压根打不过手工设计的特征。这在当时的计算机视觉界,是一件相当反直觉的事:图片能赢,视频却不行,这背后到底卡在哪儿?
这篇论文,《用双流卷积网络做视频中的动作识别》,就是冲着这个问题去的。作者是 Karen Simonyan 和 Andrew Zisserman,两人来自牛津大学的 VGG 研究组。提一句题外话,这两位几个月之后又发表了 VGGNet,那篇后来几乎人尽皆知的图像分类网络。也就是说,他们几乎是同时在打两场仗,一场是图片,一场是视频,视频这场仗打得艰难得多。
核心问题:视频比图片难在哪
先说说当时的战况。
在这篇论文发表之前,最强的手工特征方法叫做改进版密集轨迹,英文缩写 iDT
引用
iDT(improved Dense Trajectories):一种通过追踪视频里密集分布的像素点运动轨迹,再统计轨迹周围颜色、梯度、光流等信息来描述动作的手工设计方法。
在标准测试集 UCF-101 上,iDT 能拿到接近 87% 的准确率。而在这之前尝试用深度学习做动作识别的工作,比如 Karpathy 等人在 2014 年提出的一些卷积网络方案,准确率只有 65% 左右,差了整整 20 个百分点。
20 个百分点的差距是什么概念?意味着每 5 个动作里,深度学习方法就要比手工特征多认错 1 个。这不是一个可以靠调参数抹平的差距,这是方法本身出了问题。
问题出在哪儿?图片识别网络看的是空间信息,一张照片里的形状、颜色、纹理。而视频除了空间信息,还多了一个维度,时间。一个人挥手和一个人挥拳,单看某一帧的画面可能长得差不多,真正的区别在于这个动作是怎么随时间展开的。之前的深度网络方案,大多是把视频的每一帧当成独立图片扔进网络,或者简单地把几帧叠起来卷积,这种做法完全没有专门去捕捉运动的规律,自然比不过专门为运动设计的手工特征。
这就好比你想通过照片认出一个人是在鼓掌还是在拍蚊子,如果只给你一张静止的照片,两个动作在那一瞬间的手部姿态可能几乎一样,你分不出来。但如果给你连续几张照片,能看到手掌合上又分开的轨迹,你立刻就知道答案。之前的深度网络,做的事情有点像只看一张照片就要下判断,自然力不从心。
方法一:把视频拆成两条流
Simonyan 和 Zisserman 的思路,说出来其实挺直接:既然图片识别网络擅长处理空间信息,那就专门用一个网络去处理空间信息;既然动作的关键在于运动,那就再专门造一个网络去处理运动信息。两个网络分头干活,最后把结果合起来。
这就是论文标题里"双流"的意思。
引用
双流卷积网络(Two-Stream Convolutional Network):由两个独立的卷积神经网络组成的架构,一个专门处理单帧图像(空间流),一个专门处理帧间运动信息(时间流),两者独立训练,最后融合各自的预测结果。
空间流很好理解,输入就是视频里随便抽出来的一帧画面,网络结构跟做图片分类的网络几乎一样,负责识别画面里有什么东西,比如球场、水面、乐器,这些场景和物体信息本身就能提供很强的线索。比如你看到一个人站在泳池边,穿着泳衣,大概就能猜到接下来的动作八成和游泳有关。
时间流是这篇论文真正的巧思所在。它的输入不是画面本身,而是光流场。
引用
光流(Optical Flow):描述视频中相邻两帧之间,画面上每一个像素点是往哪个方向、移动了多远的一种运动场,通常用水平位移和垂直位移两张图来表示。
光流场把"运动"这件事从画面内容里剥离了出来,变成了一种纯粹的位移信息。举个例子,一个人在原地做深蹲和在原地做拉伸,画面里的场景背景很可能一模一样,单看某一帧根本分不出区别,但光流场里记录的身体各部位移动方向和幅度是完全不同的模式,深蹲是上下方向的大幅度位移,拉伸可能是局部的小幅度伸展。把这种纯运动信号单独喂给一个网络,网络就能专心学习动作的动态特征,不会被场景内容干扰。
为什么一定要拆成两条独立的流,而不是把颜色信息和运动信息一起塞进同一个网络里训练?这里有个现实的矛盾。当时能用来训练视频动作识别的数据集非常小,UCF-101 只有 1 万多个视频片段,而图片分类的数据集 ImageNet 有上百万张图片。数据量差了两个量级。如果强行用一个网络同时学空间和时间特征,网络需要学的东西太复杂,而数据又太少,很容易学成一团糊。拆成两个网络之后,空间流可以直接借用在 ImageNet 上预训练好的模型参数做迁移,相当于蹭了图片识别领域已经积累多年的经验,时间流则专注在一个相对简单、明确的任务上,用相对少的数据也能学出规律。
这有点像一家小公司想同时打磨产品设计和市场推广,如果只招一个人既管设计又管市场,这个人分身乏术,两件事都做不精。如果不这样拆分开来,招两个各自专精的人,结果会怎样?大概率是两件事都做得马马虎虎。分成两条线各自专注,反而能把每一件事做到位,最后加起来的整体效果比一个人硬扛要好得多。
网络最后怎么把两条流的结果合并起来?论文里试了两种办法,一种是把两个网络最后输出的分类分数直接做加权平均,另一种是训练一个额外的支持向量机分类器把两条流的分数当作输入再做一次判断。实验发现后一种融合方式效果更好一点。
方法二:多帧光流堆叠,让时间流看得更远
只看相邻两帧的光流,能捕捉到的运动信息其实很短暂,可能就是眨眼之间的事。很多动作需要看稍微长一点的时间窗口才能判断清楚,比如区分"正在坐下"和"正在站起来",单看一瞬间的位移方向可能会搞混,得看一小段连续的过程。
于是论文里时间流的输入并不是单独一对帧的光流,而是把连续多帧,论文里用的是 10 帧,算出来的光流图堆叠在一起,当成一个多通道的输入喂给网络。
引用
光流堆叠(Stacking Optical Flow):把连续若干帧之间计算出的光流场,按时间顺序叠加成一个多通道的输入张量,让网络能同时看到一段时间窗口内的运动变化,而不只是相邻两帧的瞬时运动。