两个流打架的那一年,深度学习终于赢了
(来源:科技行者)
2014年,如果你去问一个搞计算机视觉的人,深度学习能不能识别视频里的动作,大概率会得到一个苦笑。
图片识别这件事,深度学习已经靠AlexNet在2012年打了一场漂亮仗。但视频不一样,视频多了一个维度,时间。一个人是在挥手还是在鼓掌,单看一帧画面根本分不清,你得看动作是怎么随时间展开的。而当时最强的视频动作识别方法,不是神经网络,是一套纯手工设计的特征,叫做密集轨迹
密集轨迹*:一种手工设计的视频特征提取方法,通过追踪视频中密集采样的点在多帧之间的运动轨迹来描述动作
这套手工方法在权威数据集UCF-101上能做到85%以上的准确率,而当时所有尝试用深度学习做动作识别的方案,统统被甩在后面,差距能有十几个百分点。这不是深度学习不努力,而是它一直用错了姿势,大家习惯性地把3D卷积网络直接怼向视频,指望它自己学会时间信息,结果学出来的效果总是不如人工设计的轨迹特征。
这就是牛津大学Karen Simonyan和Andrew Zisserman在2014年发表那篇论文时面对的局面。这两个人的名字你可能眼熟,没错,几个月后他们又发了另一篇论文,叫VGGNet,后来成了深度学习历史上绕不开的经典架构。这篇动作识别论文和VGGNet几乎是同期的工作,出自同一个牛津视觉几何组,这个细节本身就说明,这个团队当时正处在对卷积网络结构疯狂试验的状态里。
核心问题:时间信息去哪儿找
要理解这篇论文的巧妙之处,得先搞清楚问题出在哪。
一段视频本质上是一堆连续的静态图片。如果你只把每一帧单独喂给一个图像分类网络,再把结果平均一下,你确实能抓住"画面里有什么"这种空间信息,比如场景里有没有球拍、水面、马路。但你完全抓不住"东西怎么动"这种时间信息。挥手和放下手臂在单帧画面上可能长得几乎一样,区别只体现在连续帧之间的变化里。
如果只靠单帧图像硬train一个网络去理解动作会发生什么?论文里做了实验,答案是准确率只能到72.6%,而手工特征轻松做到88%以上,足足差了15个百分点。这意味着,平均每识别5个动作,深度学习就要比老方法多认错将近1个。
这就好比你想知道一个人是不是在走路,却只给你看他某一瞬间的照片。照片里他可能一只脚抬着,一只脚落地,你光看这张照片根本判断不出他是在走路、在原地踏步,还是刚被绊了一下正在跌倒。你缺的不是这张照片本身的信息量,你缺的是"下一张照片会是什么样"这个动态线索。如果不给网络这个线索,它就只能靠猜,而猜的结果就是准确率直接掉下15个点。
双流网络:让网络同时"看画面"和"看运动"
Simonyan和Zisserman的解法,思路简单到几乎有点粗暴,但正是这种粗暴让它显得聪明:既然一个网络学不好时间信息,那就干脆用两个网络,一个专门负责空间信息,一个专门负责时间信息,最后把两边的判断结果加权融合。
这就是这篇论文的核心贡献,双流卷积网络
双流卷积网络*:Two-Stream ConvNet,由两个独立的卷积神经网络组成的架构,一路处理RGB图像捕捉空间外观信息,另一路处理光流场捕捉运动信息,最后融合两路的预测结果
空间流很好理解,就是拿视频里的单帧RGB图像喂给一个标准的卷积网络,让它学会识别画面里的物体、场景、人物姿态这些静态视觉线索。这一路本质上和普通图像分类没什么区别,甚至可以直接借用在ImageNet上预训练好的网络权重,因为背景、场景这类信息在不同数据集之间是可以迁移复用的。
时间流才是真正解决问题的关键部件。它不吃原始图像,吃的是光流场
光流场*:Optical Flow Field,描述视频相邻两帧之间每个像素点位移方向和大小的向量场,可以理解成把"哪里在动、往哪个方向动"用图像的形式画出来
光流场本质上是一种把运动信息可视化的手段。想象把两帧之间每个点的位移拆成水平方向和垂直方向两张灰度图,亮的地方代表朝这个方向动得快,暗的地方代表几乎没动。把连续多帧的光流场堆叠起来喂给一个卷积网络,这个网络学到的就不再是"画面里有什么",而是"这个画面正在怎么变化"。
论文里给出了第一层卷积核的可视化图,你会发现这些卷积核大多呈现出明显的方向性条纹,像一组组指向不同角度的滤波器。这不是随便学出来的,这恰恰说明网络自己发现了,光流场里最有用的信息就是运动方向本身,它主动把自己训练成了一个方向探测器。这一点挺让人佩服的,你没有告诉它"方向很重要",它是从数据里自己总结出来的。
两路网络各自训练,各自给出一个动作类别的预测分数,最后按一定权重把两个分数加起来,谁的分数高就判定为哪个动作。实验里,单独的空间流大约能到73%,单独的时间流已经能冲到83%以上,而两路融合之后,准确率一举冲到88%左右,首次和手工特征的密集轨迹打平甚至反超。
这套设计像什么呢,像医院看诊的时候同时挂了两个专科号。一个内科医生专门看你的化验单和影像片子,判断身体内部的静态状况,另一个康复科医生专门看你走路和活动的姿势,判断你的运动功能有没有问题。两个医生各看各的,最后会诊的时候把两边意见汇总,才能给出一个准确的判断。如果只挂内科号,不看你走路的样子,很多运动相关的毛病根本查不出来,这就是当年只用单帧图像的网络会栽跟头的原因。反过来说,如果只看你走路的姿势不看化验单,内部的病灶也照样会漏掉,这对应的就是论文里单独时间流的表现依然不如双流融合的原因,两条信息渠道各有侧重,缺一个都不完整。
多任务预训练:小数据集也能喂饱深度网络
双流的思路解决了"要不要看时间信息"的问题,但紧接着冒出另一个麻烦。深度网络出了名的数据饭量大,而当时能用的视频动作数据集,规模小得可怜,像UCF-101这种主流数据集,总共才1万多个视频片段,分摊到101个类别里,每类样本量少得根本不够喂饱一个深层卷积网络,过拟合的风险很高。
图像领域已经证明,拿ImageNet这种百万级大数据集预训练好的网络去做迁移,效果拔群。可视频动作识别没有这样的百万级数据集,巧妙的地方在这里,论文提出用多任务学习去缝合两个不同的小数据集,变相扩大有效训练数据量。
多任务学习*:Multi-task Learning,让一个网络同时学习多个相关任务,共享底层特征表示,借助任务之间的关联性互相提升效果
具体做法是,同时用UCF-101和另一个数据集HMDB-51来训练时间流网络,网络的主体结构共享,只在最后接了两个独立的分类输出层,一个输出层对应UCF-101的101个类别,另一个对应HMDB-51的51个类别。训练的时候,来自UCF-101的样本走一个输出层算损失,来自HMDB-51的样本走另一个输出层算损失,底层的卷积特征则被两边共同塑造。
这套操作的效果立竿见影,时间流网络在HMDB-51上的准确率从52.4%直接跳到59%左右,提升了将近7个百分点。这说明两个数据集里蕴含的运动模式确实有共通之处,哪怕类别定义不完全一样,底层对"如何理解光流"的感知能力是可以共享复用的。
这套做法很像两个连锁餐厅共享一个中央厨房。奶茶店A卖的是水果茶,奶茶店B卖的是奶盖茶,配方不完全一样,但两家店背后都需要同一个中央厨房提供的糖浆基底和茶叶原料。如果两家店各自单独建一个厨房,原料采购量小,成本压力大,做出来的味道也不稳定。合并成一个中央厨房集中处理基础原料,两边店铺再各自往上加自己的特色配方,成本降下来了,基础味道还更稳定。如果不这么做,两个小数据集各自单打独斗训练,每个网络能接触到的样本量都很有限,过拟合的风险会直接体现在测试集准确率的下滑上。
最终成绩单
论文在两个主流数据集UCF-101和HMDB-51上做了系统的实验对比。
在UCF-101数据集上,单独空间流大约73%,单独时间流大约83%,两流直接平均融合能到88.0%,而加上多任务学习训练技巧后,双流网络最终冲到了88.6%,超过了同期最强的手工特征方法。在HMDB-51上,双流网络结合多任务学习拿到了59.4%的准确率,同样超越了此前的手工特征基准。
这是深度学习第一次在视频动作识别这个具体任务上,正面打赢手工设计特征。放在2012年AlexNet横空出世的历史坐标里去看,这句话的分量不比当年轻,只是视频比图像多了一个时间维度,深度学习花了整整两年才补上这块拼图。
这篇论文之后的故事同样值得说一说。三年后,Feichtenhofer等人在2017年提出了时间分割网络的一系列改进,进一步优化了双流架构里两路信息融合的时机和方式,把准确率又往上推了一截。差不多同一时期,Carreira和Zisserman(还是同一个Zisserman)在2017年提出了I3D网络,把2D卷积直接膨胀成3D卷积,并结合一个规模远超UCF-101的新数据集Kinetics做预训练,准确率突破到98%以上的量级,彻底把手工特征方法甩出了历史舞台。双流网络提出的"空间加时间"这个核心思路,一直延续到了后来的3D卷积网络和视频Transformer里,变成了这个领域里几乎人人都要学的基础范式。
Q&A
Q1:双流卷积网络是什么?
A:这是Simonyan和Zisserman在2014年提出的一种视频动作识别架构,用两个独立的卷积网络分别处理RGB图像和光流场,一路捕捉画面里的静态外观信息,另一路捕捉运动信息,最后融合两路预测结果来判断动作类别。
Q2:双流卷积网络相比手工特征方法效果怎么样?
A:在UCF-101数据集上,双流网络结合多任务学习最终达到88.6%的准确率,首次超过了当时最强的手工设计特征方法密集轨迹,这是深度学习第一次在视频动作识别任务上正面击败手工特征。
Q3:为什么双流网络要单独用一路处理光流而不是直接分析原始视频帧?
A:因为单帧图像只能反映画面内容,无法体现动作随时间的变化,实验显示仅用单帧图像训练准确率只有72.6%,比手工特征低了15个百分点,而光流场能专门刻画运动方向和幅度,弥补了这个信息缺口。