用两只眼睛看视频:光流与图像的双流对决

📅 发布时间:2026/8/20 2:36:57
用两只眼睛看视频:光流与图像的双流对决
2014 年秋天如果你去问一个搞计算机视觉的研究者深度学习能不能识别视频里的动作,大概率会得到一个尴尬的沉默。不是因为深度学习不行,恰恰相反,那一年深度学习正在图像识别领域杀得对手片甲不留。AlexNet 两年前横空出世,把图像分类的错误率硬生生砍掉了十个百分点。整个学术圈都在讨论,深度学习是不是要终结手工设计特征的时代了。可是一转到视频动作识别,风向完全变了。当时最好的深度学习方法,在 UCF-101 这个动作识别数据集上只能做到 65.4% 的准确率。而一个叫做密集轨迹的手工特征方法,能做到 87.9%。差了 22.5 个百分点。这个数字意味着什么?意味着如果你随便挑 5 段视频让两种方法去判断里面的人在做什么动作,深度学习会比手工方法多认错超过 1 个。在图像识别上呼风唤雨的深度学习,到了视频领域,突然变成了那个考试不及格的学生。这就是 Karen Simonyan 和 Andrew Zisserman 在 2014 年动笔写这篇论文时面对的现实。他们俩来自牛津大学,同一个实验室,几个月后又发表了另一篇后来家喻户晓的论文,提出了 VGGNet。一边在琢磨怎么把图像网络做得更深更强,一边在琢磨视频这块硬骨头怎么啃,这两件事同时发生在同一群人身上,不是巧合,是同一个问题的两种解法。视频比图片难在哪先说清楚一件事:视频识别为什么比图像识别难得多。一张图片,你要判断这是不是一只猫,网络只需要认出耳朵、胡须、毛发的纹理,这些都是静态的空间信息。可视频里的一个动作,比如挥高尔夫球杆,光看某一帧画面根本判断不出来,你可能看到的只是一个人站在那里,手里拿着一根杆子,这跟准备挥杆和刚打完球站着长得几乎一样。动作是一个过程,它藏在时间维度里,藏在画面如何随时间变化里。早期研究者试过一个很直接的思路:把视频的每一帧当成一张图片喂给卷积神经网络,然后把结果做个平均或者投票。这个思路听起来合理,可实际效果很差,原因就是它完全丢掉了运动信息,只是在做很多次孤立的图像分类,却没有真正理解动这件事本身。也有人尝试用 3D 卷积,让网络的卷积核同时在空间和时间两个维度上滑动,直接从原始像素堆里学运动模式。这个想法更接近直觉,但当时的数据量和计算资源都撑不起这么复杂的模型去从零学习运动规律,效果同样不理想,离手工特征的 87.9% 还差得远。 卷积神经网络*:一种通过卷积核在图像上滑动提取特征的深度学习模型,广泛用于图像识别领域。 密集轨迹*:2013 年提出的一种手工设计的视频特征提取方法,通过追踪视频中密集采样的点的运动轨迹来描述动作,在当时是视频动作识别的最强方法。这时候 Simonyan 和 Zisserman 想到了一个问题:为什么手工特征能赢?密集轨迹这类方法之所以强,核心秘密在于它们大量依赖光流信息,也就是画面里每个像素点在相邻两帧之间移动的方向和速度。这是一种专门为捕捉运动而设计的信号,而不是通用的图像特征。如果深度学习的网络也能直接看见这种运动信号,而不是自己费力地从原始像素里去猜运动是什么,会不会效果就完全不同?拆成两条河:空间流和时间流这篇论文最核心的想法,叫做双流网络。 双流网络*:Two-Stream Network,一种把视频识别任务拆分成两个独立卷积网络分别处理的架构,一条处理静态画面,一条处理运动信息,最后融合两条网络的判断结果。具体怎么拆的?第一条网络叫空间流,它的输入就是普通的视频帧,单独一张 RGB 图片。它负责识别画面里有什么东西,场景是什么样子,比如这是一个有游泳池的场景这是一片草地,这些静态的外观信息本身也是判断动作的重要线索,毕竟游泳这个动作大概率发生在游泳池附近。第二条网络叫时间流,它的输入不是原始画面,而是光流场。 光流*:Optical Flow,描述图像中每个像素点在连续两帧之间移动方向和幅度的向量场,可以理解为把画面里什么东西往哪个方向动了多快用箭头画出来。研究者会预先用传统算法,从连续的视频帧里计算出光流,把水平方向的运动和垂直方向的运动分别存成两张图,叠在一起形成一个多通道的输入,喂给一个结构类似的卷积网络去学习。这条网络完全不看画面里的颜色和纹理,它只看运动本身的模式。两条网络各自独立训练,各自输出一个动作类别的预测概率,最后把两边的结果加权平均或者用一个小的分类器融合起来,得到最终答案。这个设计的巧妙之处在于,它没有让一个网络同时干两件事,而是把认场景和认动作这两个本质不同的任务彻底分开,分别用最合适的输入信号去解决。这里必须做一个类比,因为这个设计决策的取舍非常值得说清楚。想象你去警察局做证人辨认,警察给你两种材料。一种是案发现场的静态照片,你能看出这是在什么地方、有什么人、穿什么衣服。另一种是监控录像剪出来的一段动态轨迹图,专门标出了谁往哪个方向跑、跑多快。如果只给你静态照片,你很难判断这个人是在逃跑还是在散步,因为姿势可能长得差不多。如果只给你运动轨迹图,你又不知道背景环境是什么,可能连这是室内还是室外都判断不出来。真正靠谱的辨认方式,是把两种材料结合起来看。双流网络就是把这两种材料分别做成两份专业报告,再综合判断,而不是把两张图硬塞进同一个侦探的脑子里让他自己去分辨哪部分信息该用在哪里。如果不这样拆会怎样?论文里的实验数据给出了答案。只用空间流,也就是只让网络看普通画面,在 UCF-101 上的准确率是 72.6%。只用时间流,也就是只让网络看光流,准确率能到 81.2%。而把两条网络的结果融合起来,准确率跳到了 88.0%。单独看这几个数字,你会发现一个很反直觉的地方:只看运动信息的时间流,比只看画面内容的空间流,效果反而更好。这恰恰印证了前面说的,动作识别的核心信息藏在动里,而不是藏在长什么样里,这也解释了为什么之前那些只把视频帧当静态图片处理的方法会栽跟头,它们从一开始就丢掉了最重要的信息源。光流怎么喂给网络这里有个技术细节值得展开讲讲,因为它决定了这个方法到底能不能落地。光流场不是一张普通的图片,它的每个像素点存的不是颜色,而是这个点在两帧之间的位移向量,拆成水平方向的分量和垂直方向的分量。研究者的做法是把这些位移值也当成图像的像素强度来处理,做归一化之后,叠成一个类似图片的输入交给卷积网络。为了让网络能捕捉到稍长一点时间跨度的运动信息,而不只是相邻两帧那么短暂的一瞬,论文里还试验了把连续多帧的光流叠在一起作为输入,相当于给网络展示一小段时间窗口内的运动变化过程,而不是单帧快照。实验发现,叠加 10 帧左右的光流效果最好,比只用单帧光流的准确率提升了大约 3 个百分点。还有一个巧妙的处理,叫做双向光流。普通光流只算从当前帧到下一帧的运动方向,论文里额外计算了反方向的光流,也就是从当前帧往前看的运动方向,把正向和反向的光流都作为网络输入的一部分。这样网络能同时感知到运动的来路和去路,信息更完整。 双向光流*:同时计算视频帧向前和向后两个时间方向的像素运动信息,让网络获得更完整的运动上下文。另外,由于当时能标注好的视频动作数据集规模有限,直接从零训练一个大型卷积网络很容易过拟合。研究者用了一个现在看起来很自然、但在当时颇有创见的做法:借用图像识别任务里已经训练好的网络权重做初始化,再用视频数据做微调,这就是所谓的迁移学习思路在视频领域的早期应用之一。这一段值得再做一个类比。你可以把训练神经网络想象成教一个新员工上手工作。如果每次招人都要从零教他怎么用鼠标、怎么打字、怎么发邮件,那效率极低,而且新员工很容易在这些基础操作上犯错,因为他见过的案例太少了。更聪明的做法是招一个已经有基础办公技能的人,只需要针对具体岗位的业务做针对性培训。用图像网络的预训练权重去初始化视频网络,就是招一个已经会看图识物的员工,再专门教他看运动识动作这门新手艺,而不是从认字开始教。如果不这样做,直接在小数据集上从零训练,网络很容易记住训练集里的细枝末节,却在没见过的新视频上表现很差,这就是过拟合的代价。融合的方式:谁说了算两条网络各自给出预测之后,怎么把它们的意见合并成一个最终答案,这本身也是一个需要设计的问题。论文里最简单直接的做法是加权平均,把空间流和时间流各自输出的类别概率按照一定权重加起来,权重是通过在验证集上试验调出来的。实验发现,给时间流稍微更高的权重效果最好,这再次印证了运动信息在这个任务里的重要性更突出。除了简单加权,论文还尝试了用一个支持向量机把两条网络的输出特征拼在一起做联合分类,效果比单纯加权平均还要好一些,能再往上提升接近 1 个百分点。这说明单纯的各打各的分再平均并不是最优解,让一个学习到的分类器去发现两路信息之间更复杂的配合关系,能挤出更多性能。结果摆在桌面上说了这么多设计思路,最终的效果到底如何,直接看数字最有说服力。| 方法 | UCF-101 准确率 | HMDB-51 准确率 ||---|---|---|| 密集轨迹当时最强手工特征 | 87.9% | 57.2% || 仅空间流网络 | 72.6% | 40.5% || 仅时间流网络 | 81.2% | 54.6% || **双流网络融合后** | **88.0%** | **59.4%** |这张表格里最关键的一行是最后一行。双流网络在 UCF-101 上的 88.0%,第一次超过了密集轨迹的 87.9%,虽然只多了 0.1 个百分点,但这个 0.1 背后的意义远远大于数字本身。这是深度学习在视频动作识别这个具体任务上,第一次打赢了手工设计特征的方法。放在 2014 年这个时间点,这句话的分量不亚于两年前 AlexNet 在图像识别比赛上震惊世界。区别在于,图像识别那次深度学习赢得干净利落,差距巨大,而视频识别这次是艰难地、几乎是贴着地板才爬过了那道线。但正是这种刚好追平又反超的姿态,证明了一件事:深度学习不是不能处理视频,只是之前的方法没有找到正确的信息输入方式。给网络喂对了信号,它照样能追上甚至超越几十年积累出来的手工经验。在 HMDB-51 这个更难的数据集上,双流网络的优势更明显,59.4% 对 57.2%,领先了 2.2 个百分点。这个数据集的动作类别更细碎,场景更复杂,双流方法的鲁棒性在这里体现得更充分。这条路后来走到了哪里双流网络这篇论文发表之后,它并没有成为终点,而是打开了一条新赛道,后续的研究者顺着这个思路继续往前走。2016 年,Christoph Feichtenhofer 等人发表了一篇论文,提出了时空融合卷积网络,把双流网络里两条各自独立到最后才合并的结构,改成了在网络中间层就进行融合,让空间信息和运动信息更早地互相交流,而不是等到最后一步才见面。这个改动把 UCF-101 上的准确率进一步推高到了 92.5% 左右。2017 年,Joao Carreira 和 Andrew Zisserman(没错,又是 Zisserman)发表了 I3D 网络的论文,这次他们没有再依赖预先计算好的光流,而是把 2D 卷积网络直接膨胀成 3D 卷积网络,让网络自己从原始视频帧里学习时空特征,同时还引入了大规模的 Kinetics 数据集做预训练。这一步相当于把双流网络里空间流时间流分开处理的思路,和早期 3D 卷积直接学习时空特征的思路做了融合,借用了预训练迁移学习的经验,最终在多个数据集上的表现全面超越了双流网络,准确率提升到 95% 以上。这两篇后续工作有一个共同的脉络,它们都没有推翻双流网络提出的核心洞察,运动信息需要专门的机制去捕捉,而是在怎么更高效地捕捉和融合运动信息这个方向上不断精进。写在后面写这篇论文最触动我的地方,是那个只差 0.1 个百分点的胜利。如果 Simonyan 和 Zisserman 当时看到 87.9% 对 88.0% 这样的结果,选择放弃发表,觉得这个提升太微不足道,后面整整一条研究路线可能都要往后推几年。科学突破有时候不是靠碾压式的优势,而是靠证明这条路是通的剩下的提升空间留给后来的人去挖。另一个让我反复琢磨的细节是,时间流单独的表现居然比空间流好这么多,81.2% 对 72.6%。这其实在提醒我们一件更普遍的事:很多时候,我们以为最重要的信息是看得见的样子,但真正决定判断结果的,可能是那些看不见、需要专门方法才能提取出来的隐藏信号。这个思路放到别的领域是不是也成立,值得想一想。论文里没有解决的问题是,光流本身是用传统算法预先计算出来的,不是网络端到端学出来的,这意味着整个系统的上限被光流算法的质量卡住了。后来的研究一直在想办法绕开这个限制,这条线到今天有没有真正走完,是个值得继续追的问题。一个女孩站在游泳池边,举起手臂,下一秒画面切换。你看到的只是一张静止的照片,却已经知道接下来会发生什么。这份直觉,机器用了整整两年,才勉强追上。QAQ1双流网络是什么A双流网络是2014年由Simonyan和Zisserman提出的视频动作识别方法把任务拆成两条独立的卷积网络一条处理普通画面空间流一条处理光流运动信息时间流最后融合两者的预测结果。Q2双流网络相比手工特征方法密集轨迹有什么优势A双流网络在UCF-101数据集上达到88.0%准确率首次超过密集轨迹的87.9%是深度学习在视频动作识别上第一次打赢手工设计特征方法标志性意义大于数字本身的差距。Q3为什么双流网络要把光流单独作为一条网络的输入A因为动作识别的关键信息藏在运动变化里而不只是画面外观里。实验显示单独用光流的时间流网络准确率达81.2%比只用画面的空间流网络72.6%还高说明运动信息对识别动作更关键。