AlexNet后两年:两流网络为何仍打不过iDT?
2012年,AlexNet让计算机识别静态图片的准确率一夜之间甩开了所有传统方法,整个学界都以为深度学习接下来会顺理成章地拿下视频领域。结果接下来发生的事让很多人没想到。整整两年,没有一支团队能让深度学习在视频动作识别这件事上,打败一个纯靠人工设计特征的老办法。那个老办法叫做改进密集轨迹。> iDT(改进密集轨迹)..
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,用三维卷积直接处理时空信息,识别精度进一步提升。