双流网络:深度学习在视频动作识别上补的这两年课
sina qqZone renren ydCloud 0

刷到一段视频,有人助跑、起跳、越过横杆、落地,你几乎不用想就能说出两个字:跳高。人脑做这件事近乎本能,机器却曾在这道坎上卡了很久。
2012年,AlexNet在ImageNet图像分类比赛上打出名声,错误率从26%降到16%,深度学习从此成为计算机视觉的热门方向。不过少有人提的是,这股风吹进视频动作识别领域后,接下来整整两年,深度学习始终没赢过一个听上去很土的老办法——改进密集轨迹。这种方法靠追踪像素点在连续帧之间的运动轨迹,再统计轨迹周边的纹理与运动信息来判断动作类别,2013年由王恒等人提出,是深度学习真正站稳脚跟之前动作识别领域最强的方法。
在UCF-101测试集上,iDT能做到86%左右的准确率,这个测试集包含101类人类动作、超过1.3万段视频。2014年,卡内基梅隆的Karpathy团队试了更直接的路子:把视频一帧一帧送进卷积网络,用他们称为“慢融合”的方式训练,结果只做到60%出头,比iDT低了二十多个百分点。二十多个百分点是什么概念?同样识别五个动作,深度学习要比手工特征多认错一个还不止。图像分类领域里深度学习早已占尽上风,偏偏换到视频上就不灵了,这对比格外刺眼。
根源其实不难猜。动作的关键不只在画面里有什么,更在画面怎么变。单帧卷积网络再强,看懂的是“这是什么场景、有什么物体”,看不懂“接下来发生了什么”。
牛津大学VGG组的Karen Simonyan和Andrew Zisserman在2014年给出了一个答案。VGG组即牛津大学visual geometry group,这个研究组几个月后发表的VGGNet后来成了图像分类领域最常用的骨干网络之一,两篇工作几乎同期,出自同一批人。
他们的办法是两条路并行:一条专看画面内容,一条专看运动本身,最后把两边的判断合到一起。这就是后来被大量引用的双流网络。它由两个独立训练的卷积神经网络组成,一个输入静止视频帧,负责捕捉画面内容;另一个输入光流图,负责捕捉运动信息;两边的预测结果再融合成最终判断。
空间流,先弄明白这是在哪儿、有什么
空间流说白了就是一个普通卷积网络,输入是单帧RGB图像,结构借用成熟的图像分类架构,先在ImageNet上预训练,再到UCF101上微调。ImageNet是包含超过百万张标注图片、涵盖上千类物体的大规模图像数据库,深度学习里几乎所有图像模型的预训练起点都在这里。
这个设计背后的道理挺朴素:不少动作靠环境线索就能猜中大半,游泳池边大概率在游泳,琴房里大概率在拉小提琴,网球场上大概率在打网球。空间流要做的,就是把“场景提示动作”这种直觉教给网络。
可这条路有个绕不开的天花板。只看一张照片,很难分清一个人是要跳起还是刚落地、要坐下还是刚站起,这些动作的静态画面可能几乎一样。好比只凭一张照片判断体育比赛的具体瞬间:照片里有泳池、有泳姿、有运动员,你能猜到是游泳项目,却分不清此人是刚入水、正在换气,还是即将触壁转身。只靠这张照片,答案永远停在“这是什么场景”,回答不了“具体发生了什么动作”。空间流的局限正是如此,它看得懂背景,看不懂过程。
空间流要解的矛盾是:完全不用场景和物体的先验信息,网络得从零摸索运动模式,效率很低;只依赖场景信息,又会在需要分辨动作细节的任务上失手,比如区分走路和慢跑。实验数据也印证了这点,空间流单独在UCF101上只做到72.6%,比iDT的86%低了十几个点,光靠画面内容远远不够。
时间流,教网络看懂运动本身
时间流的输入不是普通图像,而是光流图。光流描述视频里每个像素点在相邻两帧之间移动的方向和速度,通常用两张图表示,一张记水平位移,一张记垂直位移,是计算机视觉捕捉运动最经典的手段之一。
为了让网络看到的运动信息更完整,论文没有只用相邻两帧的光流,而是把连续10帧的光流图叠在一起,变成20通道的输入(10帧乘以2个方向)。这样网络看到的是一小段时间窗口里完整的运动轨迹,而非某一瞬间的位移快照。这个设计受制于现实:当年的硬件条件下,想用三维卷积直接在原始视频立方体上学时空特征,计算量大到难以训练。把预先算好的光流图喂给普通二维卷积网络,是以计算成本换可行性的折中。
另一个现实约束是训练数据不够。UCF101只有1.3万多段视频,跟ImageNet的百万级图片比,这个规模训练深度网络很容易过拟合。
所谓过拟合,就是模型在训练数据上分数漂亮,可它把训练集里独有的细枝末节也背了下来,一换到没见过的数据上,表现就明显掉档。论文给出的对策是多任务学习:UCF101和HMDB51两个数据集一起训练,底层网络共用参数,只在输出端各留一套分类器,分别对应两个数据集的动作类别。
这里补充一下HMDB51,它是另一个常用动作识别数据集,51类动作、约7000段视频,规模比UCF101还小,研究者常把它和UCF101搭配使用,检验方法的泛化能力。打个语言学习的比方:只背一本一百句对话的教材,这一百句能背得滚瓜烂熟,换个场合遇到没背过的句子就露馅;要是同时学两套教材,语法规则在底层共用,词汇和场景各记各的,语法基础会更扎实,碰到新场景出错的概率也低一些。
反过来,只靠一个数据集的几千段视频,网络容易记住训练样本的细枝末节,而不是真正学会识别运动模式本身。时间流要解决的根本矛盾,是运动信息该怎么表示给网络,光流图给出的答案计算成本可控,又经过几十年计算机视觉研究的验证。测试阶段还有个细节:论文从每段视频里均匀采25帧,每帧做四角加中心共5种裁剪,再配合水平翻转,一段视频等于生成250个预测结果,最后取平均。这种做法当年并不罕见,但也能看出,研究者为了把网络判断稳定下来,愿意在推理阶段多花这份计算力。
时间流单独在UCF101上做到81.0%,比空间流的72.6%高出不少,说明对识别动作来说,运动信息比画面内容更关键,不过距离iDT的86%仍有差距。
双流融合,1加1为什么大于2
两条网络各自训练完之后,把输出的分类分数融合起来。最直接的做法是对两边softmax概率取加权平均;再进一步,是把两边的分类分数当成新特征,训练一个支持向量机做最终决策。支持向量机是经典的机器学习分类算法,思路是找一条最优分界线,把不同类别的样本尽量分开,深度学习流行之前,它一直是图像分类领域的主力方法之一。
合起来为什么更强,道理不复杂:画面内容告诉你大致的场景范围,运动轨迹告诉你具体在做什么动作,两者互补,能把判断的模糊区间大幅收窄。这就像同时靠脸和声音辨认一个人:只看脸,一对双胞胎可能认错;只听声音,一段失真的电话录音可能把你骗过去;脸和声音同时到位,两条信息各自的弱点正好被对方补上,认错的概率就大幅下降。
双流网络的融合也是这个道理。只用空间流,UCF101上准确率72.6%;只用时间流,81.0%;两者融合之后跳到88.0%,比表现最好的单一分支还高出七个百分点。这不是简单的数字平均,是两种信息互相纠正了彼此的误判。
融合这一步要解决的根本矛盾是,单一信息源永远有盲区。空间流在依赖运动细节的动作上天生吃亏,比如区分走路和跑步;时间流在依赖具体物体识别的动作上同样天生吃亏,比如区分弹吉他和弹贝斯。只有把两者结合,这两类盲区才能同时补上。
| 方法 | UCF101 | HMDB51 |
| 改进密集轨迹(iDT) | 85.9% | 57.2% |
| 空间流单独 | 72.6% | 40.5% |
| 时间流单独 | 81.0% | 54.6% |
| 双流融合 | **88.0%** | **59.4%** |
深度学习在视频动作识别上压过手工特征方法,这是头一回;那些手工方法已经打磨多年。这个结果若放回2014年看,分量跟两年前AlexNet赢下图像分类差不多,只是深度学习这次多花了整整两年才把这一课补上。
论文里还有一处细节容易被忽略,却很说明问题。研究者把时间流网络第一层学到的卷积核拿出来可视化,发现它们大多呈现明显的方向性条纹,和经典图像处理里检测边缘方向的滤波器长得很像。这不是人为设计出来的,是网络自己从光流数据里学出来的,说明网络确实抓住了运动信息里最关键的部分,也就是方向和速度的变化模式,而不是什么偏门的统计噪音。
这篇论文的影响没有停在2014年。一年之后,2015年,Tran等人提出C3D,直接用三维卷积核在原始视频帧上学习时空特征,事先计算光流这一步不再需要,运动信息的提取也交给网络自己完成。
C3D 的做法是拿三维卷积神经网络直接处理视频片段。它的卷积核自带时间维度,空间和时间上的特征能一起学,光流也就不必单独算了。
2016年,王利民等人提出Temporal Segment Networks。当时双流网络的问题在于,它只能盯住一小段连续帧组成的窗口,长视频的整体结构照顾不到。新做法是把整段视频先切成若干段,每段各自抽样,再联合建模。这样一来,网络就能顾及更长时间范围里的动作模式,UCF101上的准确率被进一步推到94%以上。
到了2017年,Carreira和Zisserman(对,还是那位Zisserman)拿出了I3D。思路是把双流网络里的二维卷积核直接膨胀成三维卷积核,RGB分支和光流分支的双流结构照旧保留,再拿DeepMind新发布的大规模视频数据集Kinetics做预训练。动作识别的准确率因此又上了一个台阶。
这里说的Kinetics,是DeepMind发布的大规模视频动作识别数据集,包含数十万段标注视频。它的规模远超UCF101和HMDB51,后来成了很多视频模型做预训练时的选择。
内容信息加运动信息,两条腿走路,这是双流网络的核心思路。到I3D这里,这条路依然没被放弃,变的只是实现方式:从二维卷积加光流堆叠,换成了三维卷积加光流堆叠。
写在后面
重读这篇论文时,有个细节容易被忽略,我为此多琢磨了一会儿。两条网络的训练是彻底分开的:空间流不知道时间流学了什么,时间流也不知道空间流学了什么,直到最后一步,两边的分数才被拼到一起。做法简单粗暴,可恰恰绕开了一个麻烦——自然图像和光流图差异巨大,联合训练这两种输入很可能带来优化上的困难。
那就不妨追问一句:如果当时直接端到端联合训练两条分支,会学到更好的融合方式,还是会因为优化难度暴增而适得其反?论文没给答案。不过三年后的I3D仍然保留两条独立分支,没有硬揉在一起,这多少说明,分开训练在当时乃至之后很长一段时间里,都是更实际的选择。
另一个让我印象深刻的点在于,整套方法建立在光流这个已经存在几十年的经典计算机视觉概念之上。深度学习在这里没发明新概念,它做的是把一个老工具塞进新框架,让它重新发挥作用。这背后是个更大的思考:很多突破并非凭空造出新东西,而是把旧工具放进新结构里,让旧工具重新变得有效。
下次刷到一段视频,可以试着闭上眼睛只听声音,再试着静音只看画面,看看自己能分辨出多少动作。你会发现,机器纠结了两年才想明白的事——同时处理两条信息流——你的大脑早就毫不费力地在做了。
Q&A
Q1:双流网络是什么?
A:这是2014年牛津大学Simonyan和Zisserman提出的视频动作识别方法。它由两个独立的卷积神经网络组成:一个处理单帧画面,捕捉场景内容;一个处理光流图,捕捉运动信息;最后把两边的判断结果融合起来。在UCF101上,它的准确率达到88.0%,首次超过手工特征方法iDT的85.9%。
Q2:为什么深度学习一开始在视频动作识别上打不过手工特征?
A:早期把视频帧直接丢进卷积网络,只能学到画面内容,学不到运动过程。2014年Karpathy团队的尝试在UCF101上只做到60%出头,比手工方法iDT的86%低了二十多个点。双流网络的办法是额外引入一条光流分支,这个问题才被解决。
Q3:双流网络后来被哪些方法改进了?
A:2015年的C3D用三维卷积直接学习时空特征,省去了光流计算;2016年的Temporal Segment Networks改进了长视频的时序建模,把准确率推到94%以上;2017年的I3D把双流结构里的二维卷积膨胀为三维卷积,并用Kinetics数据集预训练,性能进一步提升。