![]()
2014年之前,深度学习圈子里流传着一个让人挺尴尬的事实。
图像分类领域,卷积神经网络早就靠AlexNet一飞冲天,把传统方法甩出老远。但只要把静止的图片换成会动的视频,神经网络就突然变得不太灵光了。
在动作识别这个任务上,也就是让机器判断视频里的人在做什么动作,比如跳舞、打拳还是骑车,当时最好的深度学习模型准确率停留在65.4%左右。而一个叫做"密集轨迹"的手工特征方法,早就做到了87.9%。
这中间差了整整22个百分点。什么概念?意味着每5个动作里,深度学习模型就要比手工方法多认错1个还多。这不是差一点,这是被吊打的水平。
**密集轨迹*:一种传统计算机视觉方法,通过追踪视频里密集分布的点随时间移动的轨迹,人工设计特征来描述动作,不依赖神经网络学习。**
这事儿反直觉的地方在哪?CNN在图像上碾压一切人工设计的特征,这已经是公认的常识了。可换到视频上,同一套神经网络的思路却打不过老办法。这说明视频里一定藏着图片里没有的东西,而神经网络当时还不知道怎么去抓。
牛津大学的Karen Simonyan和Andrew Zisserman两位研究者,就是这个时候站出来解这道题的。有意思的是,这两位几个月后又发表了另一篇重量级论文,提出了后来大名鼎鼎的VGGNet。也就是说,他们同一时期在做两件事:一边琢磨怎么让CNN认图,一边琢磨怎么让CNN认动作。这两件事其实互相印证了同一个判断,CNN的潜力被低估了,只是姿势没找对。
问题出在哪:CNN看视频到底难在哪
要理解这篇论文的巧思,得先搞清楚CNN处理视频到底卡在哪个环节。
最直接的想法是什么?把视频当成一堆图片,一帧一帧地喂给CNN,每帧单独判断,最后把结果综合一下。这个思路听起来挺合理,但实验证明它效果很差。
问题在于,一张静止的图片能告诉你的信息,只是"这个场景里有什么",而动作恰恰是"东西怎么变化"这件事。一张打拳的照片和一张挥手的照片可能长得差不多,肩膀和手臂的姿势区别很小,但两个动作的运动方式完全不同。只看单帧,就像蒙着一只眼睛看3D电影,你能看到画面,但看不出深度和运动的方向。
那为什么不直接把连续多帧堆叠起来,让CNN自己去学习帧与帧之间的变化规律?这个思路也有人试过,但效果依然不理想。研究者分析后发现,原始像素堆叠起来,CNN很难从中直接提炼出"运动"这个抽象概念,运动信息被淹没在了大量和运动无关的像素细节里,比如背景、光照、颜色这些干扰项。
这就好比让你通过对比两张静止照片来判断风的方向和强弱,你能看到树叶从这个位置变到了那个位置,但要从像素颜色的变化里直接算出风速和风向,是件很别扭的事。如果有人已经把风的运动轨迹画成箭头图给你看,事情就简单多了。这个"把运动直接画出来"的思路,恰恰是这篇论文的突破口。
双流网络:把一个问题拆成两个问题
Simonyan和Zisserman的核心想法说出来其实很简单:既然一个网络同时学"这是什么"和"它怎么动"太难,那就干脆用两个网络,一个专门负责认物体和场景,另一个专门负责认运动。
这就是论文提出的双流卷积网络。
**双流卷积网络*:将视频动作识别拆分成两条独立处理流的神经网络结构,一条处理静态画面,一条处理运动信息,最后融合两条流的判断结果。**
第一条流叫空间流,处理的是普通的视频帧,也就是一张一张的静止图片。这条流的任务是识别画面里有什么,比如球场、乐器、游泳池,这些场景信息本身就能提供动作分类的重要线索。这条流的结构几乎和当时经典的图像分类CNN一样,可以直接借用在海量图片数据上预训练好的模型参数,站在巨人的肩膀上。
第二条流叫时间流,这条才是这篇论文真正的创新点。它不处理原始图像,而是处理光流场。
**光流*:描述视频中每个像素点从上一帧到下一帧移动方向和速度的向量场,可以理解成给画面里每个点画一个箭头,指出它往哪儿动、动多快。**
也就是说,研究者提前用传统算法把视频里的运动计算成一张一张的光流图,每张光流图记录着画面上每个点的移动方向,然后把这些光流图当作输入喂给第二个CNN。这个CNN不需要再费劲从像素颜色变化里猜运动,因为运动已经被显式地计算出来摆在它面前了。
这一步的设计思路,其实是承认了神经网络在当时还不擅长自己去发现运动这个抽象概念,那就人工先帮它把这一步做了,把最难啃的骨头提前嚼碎了再喂给它。
这就像教一个从没滑过雪的人看别人滑雪的视频去学习重心怎么转移。直接看视频,他可能光是盯着人的身形和雪地的颜色变化就眼花了,很难提炼出"重心往左移"这个抽象动作。但如果你提前把每一帧的运动轨迹用箭头标注出来,告诉他"看,这一帧到下一帧,肩膀的箭头往左下方偏了15度",他一下子就能抓住重点。如果不做这个箭头标注,直接让他自己从原始视频里总结运动规律,他大概率会被无关的雪地反光、衣服颜色这些细节带偏,学得又慢又差。
论文里给光流场的具体形式是这样的,把水平方向和垂直方向的运动分量分别存成两张图,再堆叠若干连续帧的光流,形成一个多通道的输入,一起喂进时间流CNN。这样CNN看到的不是散乱的像素变化,而是结构化、被提炼过的运动信号。
两条流各自独立训练,各自输出一个动作类别的预测概率,最后用一个简单的方法把两边的预测结果加权融合,得到最终判断。论文实验发现,直接把两条流的softmax输出取平均或者用支持向量机做融合,效果最好。
**Softmax*:神经网络最后一层常用的函数,把网络输出的数值转换成0到1之间、加起来等于1的概率分布,方便判断模型认为每个类别的可能性有多大。**
值得一提的是,为什么不干脆把两条流从一开始就合并成一个网络训练?研究者也做过尝试,但发现分开训练效果更稳定。这背后的原因可能是空间信息和运动信息的统计特性差别太大,图像像素和光流场的数值分布完全不是一回事,硬塞进同一个网络里学,容易互相干扰,谁也学不精。分开训练,让每条流专心把自己的活干好,反而效果更扎实。
光流哪里来:一个绕不开的现实限制
这里有个技术细节值得展开讲讲,光流场不是凭空出现的,它需要额外的计算。
论文里用的是当时比较成熟的传统光流估计算法,先对每一对相邻帧计算出光流,再存下来给时间流CNN用。这意味着整个系统其实不是一个端到端的纯深度学习方案,中间嵌着一段传统算法的手工计算环节。
这个设计选择在当时看是务实的,因为2014年让神经网络自己从零学出可靠的光流估计,技术上还不成熟,直接借用现成的传统算法反而更靠谱,效率也更高。
但这也留下了一个明显的软肋,光流计算本身需要额外的时间开销,而且传统光流算法在遇到快速运动、遮挡、光照变化剧烈的场景时容易出错,这些错误会直接传递给下游的时间流网络,成为整套系统的天花板。
这就像装修房子的时候,你请了两个工人,一个专门刷墙,一个专门铺地板,铺地板的工人需要先从五金店买来提前切割好的瓷砖才能干活,而不是自己现场烧制瓷砖。这样效率确实高,房子装修速度快,但瓷砖的质量完全取决于五金店给的货好不好,如果五金店送来的瓷砖本身有裂缝,铺地板工人再厉害也没法把裂缝补好。这正是双流网络的现实处境,时间流的天花板被光流计算的质量锁死了。
数据说话:22个百分点是怎么被追平甚至超越的
论文在两个当时的标准数据集上做了实验,UCF-101和HMDB-51,这两个数据集都是从真实视频里剪出来的动作片段,覆盖打球、跳舞、弹琴等上百种动作类别。
| 方法 | UCF-101准确率 |
| 单帧CNN(只用空间流) | 72.6% |
| 只用时间流(光流CNN) | 81.2% |
| 密集轨迹(手工特征,当时最强基线) | 87.9% |
| **双流网络(空间流+时间流融合)** | **88.0%** |
这张表格信息量很大,值得细品。
首先,只用空间流,也就是把视频当成一堆图片来分类,准确率是72.6%。这验证了前面说的判断,只看画面不看运动,天花板很低。
然后单独看时间流,只喂光流场进去,准确率跳到了81.2%,比只看图片高了将近9个百分点。这说明运动信息本身就藏着大量能区分动作的线索,甚至比静态画面还管用。这个结果其实挺震撼的,因为它说明CNN不是学不会视频,而是之前没人喂给它正确的信息。
最后两条流融合起来,准确率来到88.0%,第一次超过了手工特征方法的87.9%。
这0.1个百分点看起来微不足道,但它的历史分量完全不在这个数字本身。这是深度学习第一次在视频动作识别这个具体任务上追平并超越精心打磨了多年的手工特征方法。放在2014年的背景下看,这句话的分量不亚于两年前AlexNet在图像分类上掀起的那场革命。区别只是,图像那边深度学习赢得干净漂亮,视频这边深度学习是憋了好几年,找对了钥匙才勉强破门。
论文里还有一张关于第一层卷积核的可视化图,展示的是时间流CNN学到的第一层滤波器长什么样子。你会看到这些滤波器大多呈现出明显的方向性条纹结构,这不是巧合,这恰恰印证了光流输入的设计是对的,网络自己学会去捕捉运动的方向性模式,这正是光流场里最核心的信息。如果输入的是原始像素而不是光流,第一层滤波器学到的更可能是边缘和颜色这类和运动无关的东西。
后来的故事:双流思路走了多远
这篇论文发表之后,双流的思路成了视频理解领域接下来好几年的主流范式,很多团队都在这个骨架上做加法。
2016年,Feichtenhofer等人的论文提出了一个改进,让空间流和时间流不再是各自独立训练到最后才融合,而是在网络中间层就开始互相交流信息,通过卷积层之间的跨流连接,让两条流能提前共享彼此学到的特征,这个改进进一步提升了准确率。
2017年,Carreira和Zisserman,也就是这篇论文的合著者之一,又推出了I3D网络,把双流的思路和三维卷积结合起来,用三维卷积核直接在时间和空间两个维度上同时提取特征,减少了对额外光流计算的依赖,同时在更大规模的Kinetics数据集上验证了效果,把准确率进一步推高。这篇论文后来也成了视频理解领域的另一个重要节点。
这两篇后续工作有个共同的方向,都是在想办法削弱双流网络对独立光流计算这一步的依赖,因为大家逐渐意识到,光流计算这个外挂环节既拖慢速度,又限制了整个系统的效果上限。这也从另一个角度证明了,2014年这篇论文里那个务实的妥协方案,虽然当时是最优解,但也精准地暴露出了下一步该往哪儿突破。
写在后面
读这篇论文最触动我的地方,不是准确率数字本身,而是这个解决问题的姿势。研究者没有硬逼着神经网络自己去从零发现运动的概念,而是先承认了当时神经网络做不到这件事,然后老老实实地借用传统算法把最难的部分先算出来,再把简化后的问题交给神经网络。这种不逞强、先绕道再攻坚的策略,某种程度上比"端到端一步到位"的浪漫想法更朴实,也更有效。
另一个让我意外的细节是,单独的时间流准确率居然能到81.2%,比单独的空间流高出快9个百分点。这说明在动作识别这件事上,运动信息本身的信息量可能比静态画面更关键。这和我们直觉里"先认清场景再判断动作"的思路有点相反,画面里有什么反而是次要线索,怎么动才是主线索。
这个思路后来也让我联想到人类感知运动的方式。人眼视网膜上其实有专门对运动敏感的细胞通路,和识别形状颜色的通路是分开的,某种程度上人类大脑处理视觉信息本身就有点像双流结构。这不知道是不是研究者当初设计时的灵感来源,但巧合得让人忍不住多想一层。
这篇论文没解决的问题也很明显,光流计算这个外挂步骤始终是个包袱,后来整个领域花了好几年时间才慢慢把这个包袱卸下来。如果2014年就有办法让网络自己端到端学会捕捉运动,故事会不会完全不一样?这个问题现在已经有了答案,但当时的研究者显然还看不到那么远。
Q&A
Q1:双流卷积网络是什么?
A:双流卷积网络是2014年提出的一种视频动作识别方法,用两个独立的神经网络分别处理静态画面和运动信息,一条叫空间流处理普通视频帧,一条叫时间流处理光流场,最后融合两边的判断结果。
Q2:为什么时间流要用光流场而不是直接用原始视频帧?
A:因为直接从原始像素里让神经网络自己学出运动规律很难,运动信息会被颜色、光照等无关细节淹没。提前用传统算法计算出光流场,相当于把运动信息显式地画成箭头图,再喂给网络,网络学起来更容易。
Q3:双流网络的准确率比传统手工特征方法高多少?
A:在UCF-101数据集上,双流网络融合后达到88.0%的准确率,比当时最强的手工特征方法密集轨迹的87.9%略高,这是深度学习第一次在视频动作识别任务上追平并超越手工特征方法。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.