炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会!
(来源:科技行者)
2014年之前,如果你想让计算机识别一段视频里的人在做什么动作,比如判断这是在打网球还是在游泳,最靠谱的办法居然不是深度学习。
这句话放在今天听起来有点奇怪。毕竟深度学习在图像识别领域已经把传统方法打得毫无还手之力,AlexNet在2012年一战封神,把图像分类的错误率直接砍掉了一大截。可是在视频动作识别这个领域,深度学习却接连吃了几年败仗,一个叫做"密集轨迹"的手工特征方法稳稳占据着榜首,深度学习模型死活追不上。
这事儿听起来是不是有点反直觉?图像都能搞定了,视频不就是一帧一帧的图像加上时间维度吗?照理说深度学习应该更强才对。但事实是,直到2014年,牛津大学的Karen Simonyan和Andrew Zisserman发表了一篇论文,才第一次让深度学习在这个任务上超过了手工特征方法。这篇论文的名字叫《Two-Stream Convolutional Networks for Action Recognition in Videos》,也就是我们今天要聊的"双流卷积网络"。
顺便说一句,Simonyan和Zisserman几个月后又发表了VGGNet,也就是后来被广泛使用的那个经典卷积网络架构。这两篇论文其实是同一个研究小组在同一段时间里搞出来的成果,你可以理解为他们一边琢磨怎么让网络更深更强,一边琢磨怎么让网络理解动态的视频。这两条线后来在深度学习历史里都留下了名字。
视频识别到底难在哪
先说说当时的处境有多尴尬。
在图像识别任务上,卷积神经网络已经证明了自己能从像素堆里自动学出有意义的特征,不需要人工设计。可是一旦换成视频,直接把卷积网络搬过来用效果却很一般。当时最好的深度学习方法在UCF-101这个动作识别数据集上只能达到大约65%到70%的准确率,而手工设计的密集轨迹特征却能做到85%以上。
这个差距意味着什么?意味着每识别10个动作,深度学习方法就要比手工方法多认错接近2个,这在实际应用里是个相当大的问题。
问题出在哪儿?研究者们发现,视频比静态图像多了一个关键维度:运动。一张网球拍挥出去的照片,你可能猜不出这人是要发球还是要接球,但如果你看到的是一段连续的画面,动作的轨迹一下子就把答案暴露了。传统的卷积网络在处理视频时,往往是把每一帧当成独立的图片来看,或者简单地把多帧堆叠起来喂给网络,指望网络自己学会捕捉运动信息。
这就好比你想教一个人看懂手语,却只给他看几张静止的手势照片,而不让他看手指真实移动的过程。手势的意义往往就藏在"怎么动"这个过程里,只看静态快照会丢失大量关键信息。如果不解决这个问题,网络学到的东西就只是"这一帧长什么样",而不是"这个动作是怎么发生的"。这也正是为什么早期深度学习方法在视频任务上表现平平,它们抓住了空间信息,却漏掉了运动信息。
双流架构:让网络同时看"长什么样"和"怎么动"
Simonyan和Zisserman的解决思路其实很直白:既然一个网络很难同时学好"外观"和"运动"这两种完全不同的信息,那就干脆用两个网络分别处理,最后再把结果合起来。
这两个网络一个叫空间流
空间流*:接收视频中的单帧RGB图像作为输入,专门负责识别画面里有什么物体、什么场景、什么人,也就是传统卷积网络擅长的静态外观信息。
另一个叫时间流
时间流*:接收连续多帧计算出来的光流场作为输入,专门负责捕捉画面中物体和人体的运动模式。
这里冒出一个新名词,光流
光流*:描述视频相邻两帧之间,画面中每一个像素点是往哪个方向、以多大幅度移动的一种表示方法,本质上是一张记录运动方向和速度的图。
光流场看起来跟普通图片完全不一样,它不记录颜色和纹理,只记录"这个点往哪儿动了"。比如一个人挥手,光流图上就会呈现出手部区域明显的运动矢量,而背景几乎是静止的,呈现出接近于零的数值。
这个设计的巧妙之处在于,网络不用自己费力去猜运动信息藏在哪儿,研究者直接把运动信息用光流的形式预先计算好,喂给专门的网络去学。这就像考试之前有人帮你把重点内容单独整理出一份笔记,你不需要自己从教材里大海捞针地找。如果不这么做,网络就得同时兼顾"这是什么"和"它怎么动"两件事,训练难度会大很多,效果也会打折扣,这正是之前深度学习方法一直落后的原因。
论文里提供了一张对比图,展示了RGB图像和对应的光流图长什么样。你会看到在光流图里,运动的部位会以明显的箭头状色块呈现,而静止的背景基本是灰暗一片。这不是随便画出来的效果,这是光流算法通过分析像素在连续帧之间的位移计算出来的结果,它把"动"这件事从画面里单独剥离出来,变成一种网络更容易学习的信号。
那这两条流具体怎么合并呢?论文里尝试了两种融合方式。
一种是直接平均两个网络输出的分类分数,另一种是训练一个额外的支持向量机
支持向量机*:一种经典的机器学习分类算法,常用于在两组特征之间找出最优的分类边界。
来综合两条流给出的结果。实验发现用支持向量机融合的效果更好一些,这说明简单的平均没能充分利用两条流各自的优势,而让一个专门的分类器去学习怎么权衡两条流的意见,效果会更扎实。
空间流的设计:为什么单帧图像也要单独训练
你可能会问,既然运动信息这么重要,为什么还要保留一条专门处理单帧静态图像的空间流?直接把所有力气都放在时间流上不是更省事吗?
答案是很多动作光靠运动轨迹是分不清楚的。比如"打网球"和"打羽毛球",挥拍的运动模式可能高度相似,但只要看一眼画面里的球拍形状、球场颜色、球的大小,人一眼就能分辨出来。这类信息只有静态外观能提供,运动轨迹反而帮不上忙。
空间流的网络结构其实跟当时做图像分类的卷积网络差别不大,输入单帧RGB图像,输出动作类别的概率分布。它的好处是可以直接借助已经在大规模图像数据集上训练过的网络参数做初始化,这样即便动作识别的训练数据量有限,网络也能有一个相对靠谱的起点。
这就像一个刚入职的新员工,如果他之前在其他岗位上积累过通用技能,哪怕这份新工作没给他太多培训时间,他也能凭借之前的底子快速上手。如果不利用这种迁移,网络就得从零开始在有限的视频数据上摸索所有视觉概念,效果必然大打折扣。
实验数据也验证了这条流单独存在的价值:只用空间流,在UCF-101上能达到大约73%的准确率,而当时最好的手工特征方法能到85%以上。差距摆在这儿,说明单靠外观信息确实不够,但它依然是整个系统里不可或缺的一部分。
时间流的设计:光流该怎么喂给网络
时间流这边的设计更讲究一些。研究者没有只用两帧之间算出的光流,而是把连续10帧的光流场堆叠在一起,作为网络的输入。这样网络看到的不是一瞬间的运动快照,而是一段时间窗口里运动的演变过程。
论文里还专门讨论了光流的表示方式该用哪种。他们尝试了两种,一种是直接用光流场原始的水平和垂直位移分量,另一种做了归一化处理。这里面还有个细节,就是要不要减去相机自身的运动。
因为很多视频是手持拍摄或者镜头本身在移动的,如果不做处理,画面里整体的运动趋势会被相机的晃动干扰,网络可能会把"镜头在平移"误判成"物体在移动"。研究者对此做了消除相机运动的实验,发现在某些情况下确实能带来性能提升。
这就好比你坐在行驶的汽车里,想判断车窗外一个人是不是在跑步。如果你不考虑汽车本身在移动这件事,光看这个人相对于车窗的位置变化,很容易把"车在开"和"人在跑"这两种运动混为一谈。只有先把车自身的运动这个"背景噪音"减掉,才能准确判断出人到底动没动、怎么动的。
时间流单独测试的结果相当亮眼,在UCF-101上能达到83%左右的准确率,比空间流高出将近10个百分点,这个结果本身就说明了运动信息对动作识别有多重要。而当两条流融合之后,整体准确率能提升到88%左右,超过了当时手工特征方法的85%。
数据不够怎么办:多任务学习的补丁
深度学习一直有个绕不开的痛点,就是需要大量标注数据才能训练出好效果,但当时的视频动作识别数据集普遍偏小。UCF-101虽然算是比较大的一个,也只有101类动作,共计约13000段视频片段,跟图像识别动辄百万级的数据集比起来,差得不是一点半点。
研究者用了一个叫多任务学习的办法来缓解这个问题。
多任务学习*:让同一个网络同时在两个不同的数据集或任务上训练,共享大部分网络参数,只在最后输出层做区分,这样可以让数据量较小的任务也能受益于另一个任务提供的额外监督信号。
具体来说,他们让网络同时在UCF-101和另一个数据集HMDB-51上训练,两个数据集的动作类别不完全一样,但共享底层的卷积特征提取部分,只在最后分类层分开。这样一来,网络能看到的有效训练样本量变多了,学到的特征也更通用,不容易在单个小数据集上过拟合。
这有点像一个学生同时准备两门相关的考试,比如物理和数学,虽然考试内容不完全一样,但底层的逻辑推理能力是通用的。同时准备两门课,反而能让他把基础打得更牢,比只死磕一门课刷题更有效果。如果不这样做,网络在小数据集上很容易记住训练样本的细枝末节,而不是学到真正有泛化能力的规律。
实验结果汇总
下面这张表格汇总了论文里几个关键的对比结果,能帮你更直观地感受这套方法到底强在哪儿。
| 方法 | UCF-101准确率 |
| 手工特征方法(密集轨迹改进版) | 85.9% |
| 仅空间流 | 73.0% |
| 仅时间流 | 83.7% |
| 双流融合(平均) | 86.9% |
| **双流融合(SVM融合)** | **88.0%** |
从这张表里能看出几个关键信息。第一,单独的空间流表现明显弱于手工特征方法,说明只看静态画面确实不够。第二,时间流单独的表现已经很接近手工方法了,证明光流这个信息通道抓住了动作识别的核心。第三,两条流融合之后终于超过了手工特征方法,而且用支持向量机融合比简单平均效果更好,这说明两条流提供的信息确实存在互补性,值得用更精细的方式去整合,而不是简单地各打五十大板。
这是深度学习在视频动作识别上第一次真正超过手工特征方法的时刻,放在2014年这个节点上看,分量不亚于两年前AlexNet在图像识别上掀起的那场革命。
后续的故事:这条思路走了多远
双流网络这套思路提出之后,很快就成了视频理解领域的标准范式,后续一大批工作都是在这个骨架上做改进。
2015年,Wang等人发表了一篇工作,把双流网络和传统的轨迹特征结合起来,进一步提升了识别精度,证明手工经验和深度学习并不是非此即彼的关系,两者结合能带来额外收益。
2016年,Feichtenhofer、Pinz和Zisserman三人(后面这位正是双流网络的作者之一)发表了《Convolutional Two-Stream Network Fusion for Video Action Recognition》,这篇论文重新审视了两条流该在网络的哪一层融合,而不是像原始双流网络那样只在最后的分类分数上做融合。他们发现在网络中间层就开始融合空间和时间信息,能进一步提升准确率,这说明两种信息的互补关系不只体现在最终决策阶段,在特征提取的中间过程里也存在。
同样是2016年,Wang等人提出了Temporal Segment Networks,这篇工作解决了双流网络的另一个局限:原始方法只能处理很短的时间片段,对于长视频里跨越较长时间的动作模式捕捉能力有限。他们把一段视频切成多个片段,分别跑双流网络再做整体融合,让模型能够感知更长时间跨度的动作演变。
这几篇后续工作有一个共同的方向,就是它们都没有推翻双流网络"分别处理外观和运动"这个核心假设,而是在这个框架内部做精细化改进,无论是融合的位置、融合的方式,还是处理时间跨度的方式。这也侧面说明了双流网络提出的这个基本思路,在当时确实抓住了视频理解问题的一个本质结构。
写在后面
读这篇论文时最触动我的一点,是研究者没有硬逼着一个网络去学会所有事情,而是承认了"外观"和"运动"是两种性质不同的信息,值得用两个专门的网络分别处理。这种"分而治之"的思路在深度学习后来的发展里其实反复出现,比如多模态模型里图像和文本经常也是分开编码再融合。
另一个让我意外的细节是,光流这种传统计算机视觉里的经典技术,并没有被深度学习完全淘汰,而是被巧妙地用作了神经网络的输入。这说明技术演进不一定是新方法彻底取代旧方法,有时候是新旧方法找到了一种互相成就的组合方式。
论文没有解决的问题也很明显,光流的计算本身是独立于神经网络之外的一步预处理,整个系统没法做到端到端训练。后来的3D卷积网络和一些直接从原始帧里学习运动特征的方法,某种程度上也是在回应这个局限。如果网络能自己学会该怎么表示运动,而不依赖外部算好的光流,会不会学到比光流更好的运动表示?这个问题在后续的研究里一直被反复追问。
Q&A
Q1:双流卷积网络是什么?
A:双流卷积网络是2014年由Simonyan和Zisserman提出的视频动作识别方法,用两个独立的卷积网络分别处理单帧图像的外观信息和光流场的运动信息,再融合两者的结果来判断视频中的动作类别,是深度学习首次在这一任务上超过手工特征方法的工作。
Q2:双流网络为什么要分空间流和时间流两条通道?
A:因为外观信息和运动信息性质不同,一个网络很难同时学好两者。空间流负责识别画面里的物体和场景,时间流通过光流场捕捉动作的运动轨迹,两者互补,融合后的准确率能达到88%,超过当时手工特征方法的85.9%。
Q3:光流在这个方法里起什么作用?
A:光流是描述视频相邻帧之间像素运动方向和幅度的一种图像表示,把它作为时间流网络的输入,可以让网络直接学习运动模式,而不需要自己从原始像素里摸索运动信息,这大大提升了模型对动作的识别能力。