尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

双流卷积网络:当深度学习第一次在视频动作识别上打败了老办法

双流卷积网络:当深度学习第一次在视频动作识别上打败了老办法 2014 年之前如果你去问任何一个做视频动作识别的研究者“深度学习行不行”得到的答案大概是摇头。这不是因为大家不想用深度学习。恰恰相反2012 年 AlexNet 已经在图像分类上把传统方法打得溃不成军整个计算机视觉圈子都在往神经网络这条路上冲。可是一旦换成视频,换成“动作”而不是“物体”,深度学习就突然变得不好用了。当时最好的手工特征方法叫做密集轨迹 密集轨迹*一种传统的视频动作识别方法通过追踪视频中密集分布的点随时间的运动轨迹再统计轨迹周围的图像和运动特征来判断动作类别。密集轨迹在标准测试集 UCF-101 上能做到 87.9% 的准确率。而同期几个用深度学习做视频动作识别的尝试效果都不理想,有的甚至比不上手工特征。这种反差在当年是相当扎眼的图像识别领域深度学习已经全面碾压,视频识别领域深度学习却抬不起头。这篇论文要做的事情就是回答一个问题:深度学习到底能不能在视频动作识别上赢一次。答案是能,而且赢得不算勉强。这就是 Karen Simonyan 和 Andrew Zisserman 在 2014 年提出的双流卷积网络。顺带一提,这两位来自牛津大学 VGG 研究组的学者,几个月后又发表了另一篇更加出名的论文,提出了 VGGNet。两篇论文差不多是同期的工作,这说明当时那个组里,大家是同时在图像和视频两条战线上突破深度学习的边界。问题出在哪视频比图片难在哪里要理解这篇论文的巧思,得先搞清楚视频识别到底比图片识别难在什么地方。图片分类,网络只需要认出“这是一只猫”还是“这是一辆车”,靠的是物体的形状、纹理、颜色这些静态的视觉特征。而动作识别不一样,同样是一个人站在那里,“挥手”和“举手不动”在单张画面上可能长得几乎一样,真正的区别在于“动”这件事本身,在于时间维度上发生了什么变化。早期直接把 2D 卷积网络套用到视频帧上的尝试,基本上都在犯同一个错误:把视频当成一堆孤立的图片来处理,寄希望于网络自己从这些静态画面里学出动作的规律。这就好比你想教一个人理解“开门”这个动作,却只给他看一张门半开着的照片。他能从照片里猜出门大概是开着的,但他猜不出这扇门是正在被推开,还是正在被关上。缺失的正是运动的方向和速度这类时间信息,而这恰恰是动作识别最核心的线索。网络当然也可以试着通过 3D 卷积或者在网络内部堆叠多帧来隐式地学习运动模式,但作者们发现这样做效果并不好,训练难度大,也没能超过手工特征。问题不是深度学习学不会,问题是给它喂的原料就不对。双流架构:把外形和运动拆开来看这篇论文最核心的想法,说出来其实很简单:既然一个视频里包含两种完全不同性质的信息,一种是“画面里有什么”,一种是“画面里的东西怎么动”,那就干脆用两个完全独立的网络分别去处理这两种信息,最后再把结果合并起来。第一个网络叫空间流 空间流*双流网络中的一个分支输入是视频中的单帧 RGB 图像负责识别画面中的场景和物体捕捉“外形”信息。它的输入就是视频里随便抽出来的一帧静止画面,和普通图片分类网络没什么区别。它认的是“这个场景是网球场”“这个人手里拿着球拍”这类静态视觉信息。单看这一个网络的表现,其实已经不差,因为很多动作本身和场景、道具强关联,比如游泳这个动作,你只要看到一帧画面里有水池,基本就能猜个大概。第二个网络叫时间流 时间流*双流网络中的另一个分支输入是光流场专门捕捉画面中物体的运动方向和速度信息。它的输入不是原始画面,而是光流。 光流*描述图像序列中每个像素点在连续两帧之间移动方向和速度的向量场,通常用两张图分别表示水平方向和垂直方向的位移。光流场长什么样?它本质上是一张“运动地图”,每个像素上标注的不是颜色,而是这个点在下一帧往哪个方向移动了多少。作者们把连续 10 帧的光流叠在一起作为时间流网络的输入,这样网络看到的不再是一张孤立的静止画面,而是一小段时间内每个点是怎么运动的。这里有个细节值得说一下。作者做过对比实验,发现如果单纯给网络喂原始的连续视频帧,让网络自己去学习运动模式,效果远不如直接把预先计算好的光流喂给它。这说明网络并不是学不出运动特征,而是从原始像素里直接学习运动线索这件事,对网络来说太绕了,不如把这一步先用传统算法算好,再交给网络处理后续的分类任务。这就像教一个孩子看地图导航和看车速表判断车开得多快是两件不同难度的事。如果你只给他一段连续拍摄的路况录像,让他自己判断车速,他需要在脑子里做大量的换算和对比;但如果你直接把仪表盘上的车速数字给他看,他一眼就懂。光流做的正是这种“预先换算”的工作,把“运动”这件抽象的事情,转换成一张网络可以直接读取的数字地图。如果不做这一步预处理,网络就得同时兼顾“认物体”和“算速度”两件事,两件事互相干扰,谁都做不好。两条流各自训练出一个卷积网络,最后把两个网络给出的分类分数做加权融合,得到最终的判断。这个设计的巧妙之处在于,它没有强迫一个网络同时学两种性质完全不同的信息,而是分工明确,各司其职。时间流网络的输入怎么构造:堆叠光流时间流网络具体怎么处理光流,这里有一些工程细节值得展开讲讲。单独一帧的光流其实信息量有限,只能告诉你“这一瞬间东西往哪儿动了”,但动作是一个持续的过程,比如挥高尔夫球杆,是一个从后摆到挥出的连续过程,单看某一瞬间的运动向量,很难判断这到底是挥杆的哪个阶段。于是作者选择把连续 10 帧的光流叠起来,形成一个更厚的输入,让网络能看到运动随时间演化的一段轨迹,而不是一个孤立的瞬间。这就像看一场篮球投篮的慢动作回放,你不会只看运动员手部松开球那一帧就判断他投篮姿势对不对,你需要看到从蹲下、起跳到出手的一连串过程,单帧信息不够,连续的过程才有意义。如果只用单帧光流,网络对动作的时间发展趋势几乎一无所知,准确率会明显下降。作者还尝试了两种堆叠方式,一种是直接按原始坐标堆叠光流,另一种是先追踪运动轨迹再沿轨迹采样光流。实验发现直接堆叠的方式效果已经足够好,复杂的轨迹追踪并没有带来明显提升,这也算是给后续研究省了不少麻烦,证明简单直接的方案往往够用。数据不够怎么办:多任务学习和预训练迁移深度学习一个绕不开的老问题是数据不够。当时能用来训练动作识别模型的数据集,规模都不算大,比如 UCF-101 只有一万多个视频片段,这个规模对于训练一个大型卷积网络来说明显偏少,容易过拟合。作者用了两个办法来缓解这个问题。第一个办法是用图像分类的大数据集给空间流网络做预训练。空间流网络处理的是静止画面,这和普通图片分类任务本质上是一回事,所以完全可以先在大规模图片数据集上训练出一个通用的图像特征提取器,再拿到动作识别任务上微调。这个思路后来成为整个深度学习迁移学习范式的标准操作,如今几乎所有视觉任务都会先用大数据集预训练,再在小数据集上微调,这篇论文算是很早就把这条路走通了。第二个办法是多任务学习 多任务学习*让同一个网络同时在多个相关但不完全相同的数据集或任务上训练共享底层特征表示以此缓解单个数据集数据量不足的问题。具体来说,作者把 UCF-101 和另一个数据集 HMDB-51 放在一起训练同一个时间流网络,网络的底层参数是共享的,只是在最后分类层上分别对应各自数据集的类别标签。这样网络能从两个数据集里一起学习通用的运动模式,相当于人为把训练样本的规模扩大了。这个操作很像一个学生同时准备两门不同科目的考试,如果这两门课有大量重叠的基础知识,比如数学和物理都需要扎实的代数功底,那么同时学习这两门课反而能让基础知识学得更牢,比单独刷一门课的题库效果更好。如果不做多任务训练,时间流网络单独在 UCF-101 上训练时,因为数据量偏少,很容易在训练集上表现很好但在测试集上翻车,这就是过拟合的典型症状。结果:深度学习终于赢了一次说了这么多设计细节,最后要看的是效果究竟如何。| 方法 | UCF-101 准确率 ||---|---|| 密集轨迹当时最强手工特征 | 87.9% || 仅空间流网络 | 72.6%左右 || 仅时间流网络 | 81%左右 || **双流网络融合** | **88.0%** |这几个数字放在一起看,信息量很大。如果只用空间流,准确率只有 72.6% 左右,比手工特征的 87.9% 低了整整 15 个百分点。这意味着每识别 100 个动作,单靠“看画面里有什么”的方式会比手工特征多认错 15 次。这就是前面说的问题,静态画面信息不足以支撑动作识别这个任务。单独用时间流,准确率能提升到 81% 左右,已经明显好于纯空间流,证明运动信息确实是动作识别里更关键的线索。但即便如此,单条时间流依然打不过手工特征。只有当两条流融合起来,准确率才达到 88.0%,首次超过了密集轨迹的 87.9%,尽管只高出 0.1 个百分点,但这个 0.1 意义重大。它标志着深度学习在视频动作识别这个具体任务上,第一次不再是追赶者,而是反超了手工设计特征方法。放在 2014 年这个时间点上看,这个分量不亚于两年前 AlexNet 在图像分类上掀起的震动,只是视频领域的转折来得更晚一些,更艰难一些。在另一个数据集 HMDB-51 上,双流网络也达到了 59.4% 的准确率,同样超过了当时的手工特征方法。这篇论文之后发生了什么双流网络提出之后,后续的研究基本都是在它划定的框架里做加法和改良。2015 年,Wang 等人提出了 TDD TDD*Trajectory-Pooled Deep-Convolutional Descriptor,一种把深度学习特征和传统轨迹追踪结合起来的方法。TDD 把双流网络提取出来的深度特征,沿着密集轨迹的运动路径进行池化,相当于把深度学习的特征表达能力和手工特征里轨迹追踪的思路结合了起来,在准确率上又往前推进了一步。2016 年,Feichtenhofer、Pinz 和 Zisserman 三人后两位和原论文有直接关联,Zisserman 正是双流网络的作者之一发表了新的论文,提出了更深层的双流网络架构,并且探索了空间流和时间流之间应该在网络的哪一层进行融合而不是简单地等到最后分类层才合并。这篇工作证明,让两条流更早地互相交流信息,比原始版本里各自独立训练到最后才融合,效果更好。2017 年,Carreira 和 Zisserman又是 Zisserman)提出了 I3D I3D*Inflated 3D ConvNet,把 2D 卷积网络的参数直接“膨胀”成 3D 卷积核同时结合双流思想在大规模视频数据集 Kinetics 上训练。I3D 沿用了双流的框架,但把每一条流内部的卷积操作从 2D 换成了 3D,让网络能够直接在时间维度上做卷积,同时借助新出现的大规模视频数据集 Kinetics 进行预训练,大幅提升了动作识别的准确率,一度成为该领域的新标杆。这几篇后续工作有一个共同点它们都没有推翻双流网络最初的分工思路而是在“空间信息和时间信息应该分开处理再融合”这个基本框架上做优化。这也从另一个角度证明,双流网络提出的这个架构设计,抓住了视频动作识别问题里一个相当本质的矛盾。写在后面读这篇论文最触动我的一点是,好的架构设计有时候不是靠堆更深的网络或者更大的数据,而是靠对问题本质的一次重新拆解。双流网络没有发明什么全新的神经网络结构,它用的都是当时已有的卷积网络套路真正的创新在于想清楚了“动作识别里到底有哪两种性质不同的信息”然后老老实实地把这两种信息分开处理。这让我联想到很多工程问题的解法,往往不是加更多资源去硬解,而是先把问题本身的结构看清楚。光流这个环节其实挺有意思,它相当于承认了“有些计算传统算法已经做得很好,不需要非要让神经网络从零学起”,这种务实的态度,在当时那个深度学习气势正猛、什么都想端到端解决的年代,显得有点反潮流。论文里还留了一个没完全解决的问题,就是空间流和时间流最后只是简单加权融合,两者在训练过程中完全独立,互不知道对方学到了什么。后来 2016 年的论文已经开始探索更早的层间融合,说明这个简单加权方案确实不是终点。如果两条流能在训练过程中互相校正,会不会学出更聪明的特征这个问题现在看依然值得琢磨。QAQ1双流卷积网络是什么A双流卷积网络是 Simonyan 和 Zisserman 在 2014 年提出的视频动作识别模型它用两个独立的卷积网络分别处理视频的静态画面信息和运动信息再将两者的判断结果融合是深度学习第一次在该任务上超过传统手工特征方法。Q2双流网络为什么要分成空间流和时间流两部分A因为视频里包含两种性质完全不同的信息一种是画面中有什么物体和场景一种是画面中的东西怎么运动。把这两种信息交给两个专门的网络分别学习比让一个网络同时学两件事效果更好实验显示单独用空间流只有约72.6%准确率融合后能达到88.0%。Q3光流在这个模型里起什么作用A光流是一种预先计算好的运动地图记录每个像素在连续帧之间的移动方向和速度。把它作为时间流网络的输入相当于替网络先把“运动”这件抽象的事翻译成数字信号比让网络直接从原始视频帧里自己学运动模式效果更好。
返回列表