上一讲第 9 讲:目标检测、图像分割与可视化理解 下一讲第 11 讲:大规模分布式训练

第 10 讲:视频理解

Video Understanding —— 从"2D 图像 + 时间"出发,依次走过单帧 CNN、晚期/早期融合、3D 卷积与慢融合、C3D、光流与双流网络、RNN/LSTM 建模长时结构、循环卷积网络、非局部自注意力、I3D 权重膨胀、视频 Transformer 与掩码自编码器,再到时序动作定位、视听多模态、高效视频理解、自我中心视频与视频基础模型

本讲概览:

本讲是课程预告过的第一场客座讲座,主讲人是马里兰大学帕克分校计算机系助理教授 Ruohan Gao(高若瀚)博士,他主持该校的多感官机器智能实验室(Multisensory Machine Intelligence Lab),2022 至 2023 年间曾担任 CS231N 的讲师,博士后在 Fei-Fei Li、Jiajun Wu 与 Silvio Savarese 指导下完成——他的研究兴趣是包括视觉、听觉、触觉在内的多感官智能,这也解释了本讲结尾为什么会讲到"声音"。讲座从大家已经熟悉的图像分类、语义分割、目标检测、实例分割出发,指出世界不是静态的:视频 = 2D 图像 + 时间维度,输入从 \(3 \times H \times W\) 变成 \(C \times T \times H \times W\) 的 4D 张量,识别对象也从"物体/场景"变成"动作"。随后老师直面视频数据"太大"的现实(标清每分钟约 1.5 GB、1080p 每分钟约 10 GB),给出降采样与 clip 训练两大工程对策;再沿着一条清晰的技术演进线展开:单帧 CNN(必跑强基线)→ 晚期融合/早期融合3D 卷积与慢融合(含玩具网络逐层对比与"时间平移不变性"这一核心洞察)→ Sports-1M 数据集与 C3D(GFLOPs 代价)→ 光流与双流网络(运动流反直觉地强于外观流)→ RNN/LSTM 建模长时结构与循环卷积网络(败于难并行)→ 自注意力/非局部块与 I3D 膨胀初始化(2D 架构与权重都能搬进 3D)→ 视频 Transformer 与掩码自编码器(Kinetics-400 上从单帧 62.2 到约 90)。接着把视野拓宽到时序动作定位与时空检测视听多模态理解(含讲师自己做的视觉引导声源分离)、高效视频理解(X3D、智能采样、策略学习、音频预览)、自我中心视频(智能眼镜、麦克风阵列、社交互动理解),最后落在当前最热的方向:把视频接入大语言模型、构建视频基础模型

一、开场:从静态图像到动态世界

课程开头就预告过会邀请几位往届讲师回来客座讲一讲自己最熟悉的话题,本讲是第一场。老师先简短自我介绍:他在马里兰大学帕克分校(University of Maryland, College Park)计算机系任助理教授,领导多感官机器智能实验室,2022—2023 年在斯坦福做完博士后(合作导师为 Fei-Fei Li、Jiajun Wu、Silvio Savarese)期间曾执教 CS231N。他的研究品味是多模态(multimodal):不只做视觉,还关心如何像人类一样融合音频、触觉等其他感官来感知和理解这个多感官的世界——"当然,视觉仍然是最重要的模态,否则就不会有这门课了"。

正式内容从回顾开始。到目前为止,同学们已经掌握了在单张 2D 图像上能做的一整套识别任务:给定一张图,可以输出一个类别标签(图像分类,判断是狗、猫还是卡车、飞机);可以给每个像素打标签,把画面切成草、猫、树等有语义含义的区域(语义分割,semantic segmentation);可以在物体外面画框,知道狗在哪、猫在哪(目标检测,object detection);还可以更进一步,对每个类别的每个实例都给出独立的分割掩码(实例分割,instance segmentation)。

但静态图像远不是计算机视觉的全部——我们的世界不是静止的。对着一张客厅照片,你现在已经有足够多的工具:训练一个模型判断"这是客厅",给狗和婴儿画框,甚至给出像素级掩码。可一旦画面动起来,新的问题就出现了:这个人是在跑步还是走路?动作是什么?这正是本讲的主题:视频理解(video understanding)

二、视频理解的形式化:多出来的时间维度

什么是视频?最直接的定义:视频 = 2D 图像 + 时间。原本的图像张量是 \(3 \times H \times W\)(3 个颜色通道、高、宽),加上时间维度 \(T\) 之后,我们要处理的对象变成:

视频张量:$$C \times T \times H \times W$$ (\(C\):通道,\(T\):时间维,\(H/W\):空间维)

老师说,可以认为我们原来处理的是 3D 数据,现在升到了 4D——视频是"由一串帧构成的一个体(volume)"。\(T\) 是时间维(temporal dimension),\(H\) 和 \(W\) 是空间维(spatial dimension)

最典型的任务就是视频分类(video classification),与图像分类同构:输入一段"某人在跑步"的视频,训练一个深度学习模型,从帧的时间序列中判断他在游泳、跑步还是跳跃。好消息是,损失函数不用重新发明——前面课程学过的交叉熵损失(cross-entropy loss)原样可用,先从视频里提取特征,再套用熟悉的分类损失即可。所以真正的新问题是:如何从视频中提取特征?这是贯穿全讲的主线。

老师特别指出两处与图像分类的本质差异。其一,识别对象不同。图像分类关心的是场景和物体本身——"这是什么";视频分类通常关心的是动作(action)——"画面里的人(或动物)正在做什么",所以这个领域也常被叫做动作识别(action recognition)。其二,数据规模完全不同。这就引出下一节。

三、视频数据的现实困难与工程对策

图像只是一张 \(3 \times H \times W\) 的 RGB 矩阵,而视频是一串帧——常见帧率是每秒 30 帧,电影有时分辨率和帧率更高。存储代价非常夸张,老师给了两个数字:

如此巨大的数据量没有任何办法直接塞进 GPU——而且训练时要存的不只是输入,还有网络的权重和各层激活值,模型会变得极其庞大。

对策一:把视频变小(时空双向降采样)。视频帧之间存在大量冗余,没必要每帧都用。以一段 3.2 秒的视频为例:时间上,每秒只采 5 帧;空间上,把分辨率缩到 \(112 \times 112\)。这样处理下来,这段视频只占约 588 KB——从 GB 级直接降到 KB 级。当然,如果算力允许,也可以像图像分类一样用更大的分辨率。

对策二:长视频切 clip 训练。训练集里的片段只有 3.2 秒,但真实视频可能有几分钟、几小时。通行做法是在短 clip 上训练:用滑动窗口从长视频中采样出大量短片段,每个片段用较低的帧率(低 fps)喂给视频分类器;推理时再从整段视频里采样若干 clip(比如采 10 个),分别跑模型,把预测结果平均,作为整段视频的预测。

四、最简单的起点:单帧 CNN 基线

既然视频就是一串图像,最省事的做法当然是把每一帧当成独立的图像:拿一个已经训练好的 2D 图像分类器(single-frame CNN),逐帧做分类,再把各帧的预测结果平均。比如 30 帧的视频,采样出 10 帧,每帧过一遍图像分类器,直接平均输出。

这个"不看书名只看封面"的做法效果出奇地好,原因在于:很多视频里帧与帧之间的变化并不大。一个跑步的人,逐帧看去身体姿态变化有限,整体外观非常相似——每一帧的图像分类器大概率都会说"这是跑步",平均之后自然还是跑步。老师反复强调:单帧 CNN 是一个非常非常强的基线(a very, very strong baseline)。如果你要设计视频分类模型,永远先跑它——它实现简单,却可能已经给你不错的结果,后面所有更复杂的模型都要和它比。

本讲的第一个数字证据来自 Sports-1M 数据集(见第七节):单帧模型在该数据集上的 Top-5 准确率达到 77.7%,比早期融合(early fusion)还略高。"先把图像分类器当视频分类器用"不是偷懒,而是必做的对照实验。

帧采样(frame sampling)本身就是一个关键问题、一个活跃的研究方向。给你一段一小时的视频,你并不知道哪里重要。最简单的做法是随机采样:比如每分钟采 1 帧,跑分类器再平均——能 work,但显然不是最聪明的。更聪明的策略是自适应采样:先采一帧看看,根据这一帧的信息决定接下来往哪里采(老师预告后面讲"高效视频理解"时会给出这类工作的例子)。

五、用 2D 网络融合时间:晚期融合与早期融合

单帧 CNN 完全没有跨帧交互。要让网络"看见"时间,第一步是在 2D CNN 的骨架上做文章——什么时候把不同帧的信息合在一起?先后出现了两种极端方案。

5.1 晚期融合(Late Fusion)

做法:对每个(关键)帧分别跑同一个 2D CNN,各自得到 \(D \times H' \times W'\) 的特征图,\(T\) 帧就有 \(T\) 份特征。然后把所有特征图展平、拼接(concatenate)成一个巨大的特征向量,再用全连接网络(MLP)把它映射到类别分数 \(C\) 上,套交叉熵损失训练。因为各帧在被拼接之前完全独立处理,时序信息直到最后一步才汇合,所以叫"晚期"融合。

缺点一:参数爆炸。拼接后的向量长度正比于 \(T\),\(T\) 一大,后面那个把巨向量压到类别数的全连接层参数量就非常可观,效率很低。

改进:用时间池化代替拼接。不拼接,而是对 \(T\) 份特征在时间维上做池化(pooling,均值或最大值)——单帧特征维度是 \(D\),池化后仍然是 \(D\) 而不是 \(D \times T\),之后只需一个把 \(D\) 映射到 \(C\) 的线性层加交叉熵损失。全连接层小了,但池化是"有损压缩",可能把重要的信息一并池掉

缺点二(更本质):低层运动信息早已丢失。老师用一个例子讲透这一点:判断视频中的人在跑步,真正关键的线索之一是脚的一上一下(红色圆圈标出的运动区域)。可是 2D CNN 把每帧独立处理,逐层卷积、池化到很深的阶段时,特征已经变成高层语义信息,"脚在上下动"这种低层运动模式在晚期特征里根本不存在了——你拿什么池化也没用。直觉上,越靠近输入帧的早期层,特征越接近原始像素,越可能保留这类低层运动线索;可惜晚期融合恰恰在信息已经消失的地方才去做时间聚合。这正是它名字里"late"的软肋。

5.2 早期融合(Early Fusion)

既然要在靠近像素的地方聚合时间信息,那干脆从第一层就做起:把输入直接 reshape 成 \((3T) \times H \times W\)——把 \(T\) 帧的所有通道堆在通道维上,然后用第一层 2D 卷积把通道维从 \(3T\) 一步映射到 \(D\)。也就是说,让网络的第一层卷积就显式处理时间信息,之后的部分就是一个标准的 2D CNN 加分类损失。(每帧各自得到 \(D\) 维特征后,同样可以跨时间做均值/最大池化——注意是"对特征做池化",池化后仍是 \(D\) 维。)

缺点:太贪心(too ambitious)。想让单独一层卷积就把所有帧的时间信息一网打尽,负担太重,往往学不到我们期望它学到的东西。

一个太早、一个太晚,自然的想法是取中间——能不能让时间信息在网络深处慢慢地、逐层地融合?这就是 3D 卷积网络登场的动机,它的另一个名字就叫慢融合(slow fusion)

六、3D 卷积与慢融合:让网络在空间和时间上同时慢慢长大

思路:使用 3D 卷积3D 池化,让网络在逐层前进的过程中同时逐渐收缩时间维和空间维、逐渐扩大时间与空间感受野,而不是在最开始或最后一步暴力合并。

6.1 从 2D 卷积到 3D 卷积

先回顾 2D 卷积:输入 \(32 \times 32 \times 3\) 的图像,每个卷积核(filter)是 \(5 \times 5 \times 3\) 的张量——在 \(H\)、\(W\) 两个空间维上滑动(滑窗扫描所有空间位置),但在通道维上一次性贯穿。每个位置上的内积产出激活图上的一个值,最终得到 \(28 \times 28 \times 1\) 的激活图(通道维从 3 映射到核数)。

3D 卷积只是多一个维度:输入是 \(C \times T \times H \times W\)(课件上画不出来 4D,所以通道维 \(C\) 不显示——可以把特征图理解为"空间-时间立方体 \(T \times H \times W\) 的每个格点上挂了 \(C\) 个特征值")。卷积核相应变成 \(K_t \times K_h \times K_w\)(例如 \(3 \times 3 \times 3\)),它在 \(T \times H \times W\) 的立方体上滑动——既滑空间也滑时间——同时在通道维上一贯到底。叠若干层 3D 卷积后,展平特征、接全连接层输出类别分数即可。除多出来的时间维外,一切与 2D 卷积如出一辙。

6.2 玩具网络:三种融合方式逐层对比

手算

老师用一个玩具例子对比三种结构下特征图尺寸与感受野(receptive field)的演化,输入统一为 \(3 \times 20 \times 64 \times 64\)(\(T = 20\))。

晚期融合:全程用 2D 卷积,时间维始终不动。第一层 2D 卷积把通道从 3 映到 12,\(T\) 保持 20;接池化层,空间感受野增大,\(T\) 仍是 20;再来一层 2D 卷积,特征图变成 \(24 \times 20 \times 16 \times 16\)——空间感受野继续增大,时间维还是 20。最后用一次全局平均池化把 \(20 \times 16 \times 16\) 一次性塌缩到 \(1 \times 1 \times 1\)。总结:空间上慢慢建感受野,时间上在最后一层一步到位(时间感受野只在最后全局池化那一层建成)。

早期融合:输入相同,但第一层就把 \(3 \times 20\) 当成 60 个通道,用单个 2D 卷积层把 60 通道直接映到 12——时间感受野在第一层就从 \(1\) 跳到 \(20\);此后与晚期融合一样,用池化和 2D 卷积慢慢建空间感受野,最后的全局平均池化只对空间做平均。总结:空间上慢慢建,时间上第一层一次到位

3D CNN(慢融合):改用 3D 卷积。第一层 3D 卷积把通道 3 映到 12,同时小幅度建立一点时间与空间感受野;接着一个 \(4 \times 4 \times 4\) 的 3D 池化,同时收缩时间与空间;再来一层 3D 卷积,继续同时扩大两类感受野;最后对 \(4 \times 16 \times 16\) 的特征图做全局平均池化收尾。总结:空间与时间上都逐层慢慢建——这正是"慢融合"之名的由来。

结构空间感受野时间感受野特征图演化(输入 \(3 \times 20 \times 64 \times 64\))
晚期融合逐层缓慢增大最后一层全局池化一步建成\(\to 12 \times 20 \times H' \times W' \to 24 \times 20 \times 16 \times 16 \to\) 全局池化 \(1 \times 1 \times 1\)
早期融合逐层缓慢增大第一层一步建成(\(1 \to 20\))第一层把 \((3 \times 20)\) 通道 \(\to 12\),之后同 2D 流程
3D CNN(慢融合)逐层缓慢增大逐层缓慢增大3D 卷积 + \(4 \times 4 \times 4\) 池化交替 \(\to 4 \times 16 \times 16 \to\) 全局池化

6.3 关键洞察:时间平移不变性

早期融合和 3D CNN 都"在时间上建感受野",本质区别在哪?老师让全班想了一道题:早期融合的 2D 卷积核对某个空间格点,会一次性贯穿全部时间维(例如 \(T = 16\))——它空间上局部、时间上全全局。这会带来什么问题?

答案是:没有时间平移不变性(temporal shift invariance)。设想视频里有一种"从蓝变橙"的颜色转变,它可能发生在第 4 帧,也可能发生在第 15 帧——是同一种变化。但 2D 卷积核的时间维是"对齐写死"的:想识别发生在第 4 帧的转变需要一套专门的核,想识别发生在第 15 帧的同样转变还得再学一套一模一样的核,核无法复用。对比图像分类里我们对空间不变性的执念——无论猫在左上角还是右下角,共享的卷积核都应认得出——视频里我们同样希望同一种运动模式出现在任何时刻都能被同一个核认出

3D 卷积正好解决这个问题:把时间核从"贯穿全部 \(T = 16\)"改成局部的 \(T = 3\),让核沿时间维滑动。这样一来,同一个"蓝到橙"检测器可以在每个时刻被复用,表示上更高效(representation efficient)——不再需要为每个时间位置学习单独的滤波器。这就是 3D 卷积相对 2D 早期融合的本质优势。

6.4 把 3D 卷积核当视频看:可视化

上一讲学过可视化 2D CNN 的滤波器,3D CNN 的核同样可以看——因为核同时张在空间和时间上,每个核本身就能播放成一小段视频剪辑。观察这些学到的核:有的长得和图像分类器里的核一样,是颜色斑块、边缘检测器;有的则捕捉到从画面一角到另一角、从一种边缘模式到另一种边缘模式的时间转变;有的学各种方向的运动,有的只关注颜色模式、不学运动。把核播放出来,是理解 3D 网络学到了什么的最直观方式。

七、数据集与早期 3D 模型:Sports-1M 与 C3D

7.1 Sports-1M:视频界的 ImageNet 尝试

有了架构,用什么数据训练?2014 年发布的 Sports-1M 是早期最重要的挑战数据集:约 100 万段视频、487 个体育类别,粒度细到"马拉松"与"超级马拉松"都有各自类别(老师坦白自己也分不清区别)。结果展示中,蓝色为真值、黄色为 Top-5 预测、绿色为预测正确、红色为预测错误。

各方法在 Sports-1M 上的 Top-5 准确率(2014 年前后的经典对比):单帧模型 77.7%,成绩好得令人惊讶;早期融合略差于单帧;晚期融合略好;3D 卷积网络带来约 2%–3% 的提升。结论:单帧基线必做且真的好用;3D CNN 有效,但 2014 年的模型只是起点,十年间数字已大幅提高(见第十节的 Kinetics-400 曲线)。

老师还讲了一个视频数据集特有的工程痛点:视频没法像 ImageNet 那样打包下载——太大。Sports-1M 发布时只给了一份 YouTube URL 列表。几年过去,用户删的删、改的改,原来 100 万个链接如今约一半已经失效,这类数据集的"稳定性"天然堪忧,也是视频研究再现性差的经典原因。

7.2 C3D:"3D CNN 界的 VGG"

2014 年后 3D CNN 持续改进,早期最有名的版本是 C3D。它的设计极其朴素:把 VGG 的架构从 2D 原样搬到 3D——卷积全部换成 \(3 \times 3 \times 3\),池化全部换成 \(2 \times 2 \times 2\)(第一层略有调整),堆深即可,因此得名"3D CNN 界的 VGG"。它由 Facebook 在 Sports-1M 上训练并发布了预训练权重,当时没有几家能负担得起训练视频模型的算力,于是大量研究者直接把 C3D 当作特征提取器:视频进来,抽出 C3D 特征,后面接一个线性分类器。这也是它流行的原因。

代价:计算非常昂贵。用 GFLOPs(每前向一次的浮点运算次数,衡量网络效率)对比:

模型GFLOPs备注
AlexNet\(0.7\)2D
VGG-16\(13.6\)2D
C3D\(39.5\)约为 VGG-16 的 \(2.9\times\)

暴力升维的代价一目了然。顺带的两个要点:其一,2D 里管用的技巧(比如 ResNet 的残差连接)同样可以加到 3D 网络上继续涨点,这方面的改进架构论文非常多;其二,回答课堂提问——这些模型都以固定长度的 clip 为输入(如统一 16 帧或 32 帧),先做 clip 级特征提取与分类,clip 级预测如何聚合成整段视频的预测是另一个问题(见第十四节)。

拓展

给 3D 卷积"减负":(2+1)D 分解与 X3D。字幕中提到"更高效的 3D 卷积网络 X3D",沿着这条线补充一个经典思路:既然 \(3 \times 3 \times 3\) 的全 3D 卷积太贵,可以把每个 3D 卷积分解(factorize)成一个空间 2D 卷积 + 一个时间 1D 卷积——即 R(2+1)D 的 "(2+1)D" 结构:空间维先做 \(3 \times 3\) 卷积,时间维再做 \(1 \times 1 \times 3\) 卷积。参数与计算量显著下降,还在空间与时间之间多插了一次非线性,经验上更好优化。X3D 则走网络架构搜索式地逐步扩张的路线(沿时间长度、帧率、空间分辨率、宽度、深度、瓶颈比等维度扩展一个微型 2D 骨架),用极小的计算量取得很好的精度-效率折中,适合移动端与大规模视频检索。这类"高效视频网络"与后文的"智能采样"共同构成高效视频理解的两条腿:一条让每个 clip 更便宜,一条让少跑一些 clip

八、双流网络:外观与运动分而治之

换一个角度想:空间信息与时间信息本来就是两种很不一样的东西——也许不该让一个网络硬扛两者,而应显式地把"运动(motion)"单独建模出来。

老师先放了一段只用十几个光点构成的"点光演示"(point-light display):没有任何外观信息,只有几个点在动,全班立刻认出是"坐下的动作"。人类处理运动的能力惊人——没有外观、只有运动,我们照样能认出活动内容。这强烈暗示:外观(appearance)与运动(motion)应当分开处理,也正是一篇 2014 年工作的动机。

8.1 光流:运动的显式度量

深入

光流(optical flow)度量相邻两帧之间每个像素的运动:对第一帧的每个像素,估计它会移动到第二帧的哪个位置,即计算像素级速度场,给出"点下一帧会在哪"的估计。形式化地,光流场

$$F(x, y) = (d_x, d_y) \quad \text{且} \quad I_{t+1}(x + d_x, y + d_y) = I_t(x, y)$$

意思是:\(t\) 帧中位于 \((x, y)\) 的像素,沿位移 \((d_x, d_y)\) 移动后,恰好对应 \(t+1\) 帧中同亮度的位置。光流是二维的——\(d_x\) 记录水平运动、\(d_y\) 记录垂直运动,因此可以分别可视化成两张"水平流图 / 垂直流图",从中能清楚看到低层运动线索。如何计算光流本身是一大研究领域:经典方法依赖各种假设,最常见的是亮度恒定假设(brightness constancy)——假设像素随运动亮度不变,再据此推导求解算法。

8.2 双流网络的结构与一个反直觉的结果

双流网络(two-stream network)由两条并行的 CNN 组成:空间流(spatial stream)拿单帧 RGB 图像做外观分类;时间流(temporal stream)对每对相邻帧计算光流,把水平流与垂直流分开、堆叠成多帧光流体积,喂进一个独立的卷积网络。两流各自给出预测,最后聚合(如平均)成最终结果。

UCF-101 数据集(101 个动作类别)上的结果有一个令所有人意外的现象:只用运动(时间流)的成绩明显好于只用外观(空间流)。老师的假设是:光流更不容易过拟合——外观流里有大量与动作分类无关的背景信息可供模型"背下来",而光流恰好只保留关键的运动信息,小数据集上反而更占便宜。

双流网络教给我们的方法论:当两种信息本质不同时,与其在一个网络里硬融合,不如显式分离、各自建模、末端集成。"点光演示"说明运动信息本身就足以支撑动作识别——这与晚期融合丢掉低层运动的教训形成呼应。

九、建模长时结构:RNN、LSTM 与循环卷积网络

到此为止讲的都是短片段结构。课堂早些时候有同学问"到底该用多少帧",老师在此回应:识别相隔更远的长时间结构(long-term temporal structure)同样重要。而在场各位其实已经握有处理序列的工具——第 7 讲的循环神经网络(RNN)

做法:用 CNN(单帧 2D 网络或 3D 网络)对每个 clip 提取特征向量,得到"特征的时间序列",再交给 RNN 或 LSTM 逐时间步处理,建模长时结构。输出形式两种:多对一——整段视频一个标签,用最后一个时间步的隐藏状态做预测;逐步输出——对每帧都给预测。这套想法其实早在 2011 年就被提出,比 AlexNet(2012)还早,可谓远超时代;到 2015 年才由一篇论文(LRCN)普及。训练上有个务实技巧:CNN + RNN 一起端到端很难训,常见做法是只在 RNN 部分反向传播,或先在图像/clip 分类上预训练 CNN(甚至直接用 C3D/I3D 当现成特征提取器),冻结后再训循环网络。

9.1 循环卷积网络(Recurrent Convolutional Network)

既然 CNN 与 RNN 各有所长,能否合体?回忆多层 RNN的结构:每个时间步的隐藏状态依赖两个输入——同层上一时间步的隐藏状态,和上一层同一时间步的输出。把这个二维网格搬到视频上:隐藏状态不再是向量,而是特征图网格,每个格点挂一个 \(C\) 维特征(即每个"状态"是 \(C \times H \times W\) 的 3D 张量);每个特征图同样依赖两个输入——本层上一时间步的特征图、上一层同一时间步的特征图。数学上,只需把 RNN 里的矩阵乘法全部换成 2D 卷积

$$h_t = \tanh(\, W_{hh} \ast h_{t-1} + W_{xh} \ast x_t \,)$$ (\(\ast\) 表示 2D 卷积,而非矩阵乘法)

两路各做一次 2D 卷积、相加、过 tanh,得到当前隐藏特征图。这一思路同样适用于 GRU、LSTM 等循环变体。循环卷积网络确实同时融合了空间与时序信息——但它没被广泛使用,败因正是第 7 讲讲过的 RNN 命门:循环结构本质串行、极难并行,而视频又长又需要大规模并行处理。于是注意力登场了。

十、自注意力进视频:非局部块、I3D 与视频 Transformer

10.1 非局部块(Non-local Block):视频里的自注意力

自注意力(self-attention)有一个决定性优点:高度可并行——所有输入的对齐与注意力分数可以完全并行计算。把它搬到 3D 特征图上:设 3D CNN 已给出 \(C \times T \times H \times W\) 的特征图,用 \(1 \times 1 \times 1\) 的 3D 卷积(只动通道维)分别把特征映成查询 \(Q\)、键 \(K\)、值 \(V\) 三份特征图(各为 \(C' \times T \times H \times W\));\(Q\) 与 \(K\) 转置相乘得到每个 (query, key) 位置的注意力分数,构成注意力图;用注意力图加权 \(V\),再经一个 \(1 \times 1 \times 1\) 卷积映射回 \(C\) 维,与输入特征残差相加。用公式概括:

$$\mathrm{Attention}(Q, K, V) = \mathrm{softmax}\!\left( Q K^{\mathsf{T}} / \sqrt{d} \right) V$$

这就是 非局部神经网络(Non-local Neural Networks)提出的非局部块:一个自成一体、可即插即用的构件。往现有 3D CNN 里塞几个非局部块(3D 卷积—非局部块—3D 卷积—非局部块……),即可让网络在空间和时间上同时做全局融合。本质上,这是把第 8 讲的自注意力从序列/图像推广到了视频立方体。

10.2 I3D:膨胀——把 2D 架构与权重一起搬进 3D

非局部块里还缺一块拼图:里面的"3D 卷积网络"到底用什么?一个有趣的想法:直接复用那些大获成功的 2D 架构I3D(Inflated 3D ConvNet)的做法分两步。

第一步:膨胀架构。把 2D 网络中每个 \(K_h \times K_w\) 的卷积/池化核,替换成 \(K_t \times K_h \times K_w\) 的 3D 版本——纯粹"吹胀",骨架(如 Inception 块)不变,立即得到一个视频网络架构。

推导

第二步:膨胀权重(本讲最漂亮的技巧)。架构能搬,在图像上预训练好的权重也能搬。做法:把 2D 卷积核 \(W_{2D}\) 沿时间维复制 \(K_t\) 份,再除以 \(K_t\),得到 3D 核:

$$W_{3D}[i] = W_{2D} / K_t, \quad i = 1, \ldots, K_t$$ (每个时间切片相同)

为什么除以 \(K_t\)?验证一下就明白:给这个 3D 核输入一段"每帧都相同"的恒定视频(\(3 \times K_t \times H \times W\)),时间维上的卷积求和相当于对同一张图像内积 \(K_t\) 次,每份又只有 \(1/K_t\) 权重,总输出恰好等于原 2D 核吃这张图的输出。也就是说,膨胀后的网络在恒定视频上的响应与原 2D 网络在单帧上的响应严格一致——图像预训练权重携带的先验被无损地"热启动"进视频模型,之后再在视频数据上微调即可。效果实测:I3D 超过双流网络;进一步把光流运动流也做膨胀(双流 I3D),还有提升。

这条"回收 2D 资产"的思路影响深远:我们手里大量被验证过的 2D 架构与权重,都可以通过膨胀直接为视频所用。

10.3 视频预训练的进展与性能曲线

老师快速点名了几个后续方向(细节请自行读论文):时空因子化注意力(对空间与时间分别做 factorized attention,降低注意力开销)、更高效的 Transformer 架构,以及掩码自编码器(masked autoencoder)风格的可扩展视频预训练。性能进步直观可见:在大型数据集 Kinetics-400 上,从单帧模型的 62.2% 出发,如今新的视频 Transformer 编码器已达约 90%——视频分类可以说已经被解决得相当好了。

10.4 视频模型可视化:梯度上升照搬

与图像模型一样,可以对视频网络做梯度上升可视化:随机初始化一张外观图像和一张光流图像,前向算出某类别的分数,对输入做反向传播、沿提升该类分数的方向迭代更新。以双流网络为例:外观流的最优刺激往往难以辨认;光流流的最优刺激则带有时间约束(防止变化过快),一张捕捉慢运动、一张捕捉快运动。课堂演示的例子里可以清楚看出是举重(weightlifting):一张图是杠铃的抖动,一张图是向上推举的运动轨迹——证明模型确实学到了"运动"本身,而不只是外观。

十一、更多任务:时序动作定位与时空检测

前面所有内容都在做 clip 级/整段级分类,但类比图像任务就知道视频不止分类:正如图像有目标检测,视频有时序动作定位(temporal action localization)——不仅识别动作,还要定位动作发生在视频的哪段时间(前一段在跑步,后一段在跳跃)。方法也完全类比 Faster R-CNN 的两阶段思路:先生成时间提议(temporal proposals),再对每段提议做分类。再进一步是时空检测(spatio-temporal detection):同时在空间上定位动作发生在画面何处、在时间上定位发生在哪一段——"什么时候、在画面里的哪里、在做什么"三位一体。

十二、缺失的维度:视听多模态理解

临近结尾,老师重放了开场那段"婴儿与狗"的视频——这次打开了声音:婴儿的笑声、狗的叫声。视频理解还有一整个此前从未涉及的维度:声音(audio)。少了它就少了很多乐趣与信息:情绪的感知、视觉与听觉的交互都无从谈起。把音频与视觉流合起来,催生了一大批有趣的任务。

12.1 视觉引导的声源分离

老师分享了他本人过去做过的一个例子:视觉引导的声源分离(visually-guided audio source separation)。设定:音频里是一个混合体(比如多个人同时说话、多种乐器同时演奏),目标是利用视觉信息把各个声源分离出来。两个演示:语音——两人同时说话的混合音频,结合两人的视觉与音频信息联合处理,可以单独抽出左边说话人的声音;乐器——通过分析乐器的运动(物体中心的视觉信息)与音频流,把合奏中的乐器一件件分开。视觉在这里是"哪个嘴/哪件乐器在动"的先验,为分离提供了关键线索。

12.2 音频作为分类线索

即便只做视频分类,音频也是宝贵线索,由此发展出视听视频理解(audio-visual video understanding):基于 Transformer 注意力的模型,把视频切成 patch、音频频谱(spectrogram)也切成 patch,一起喂进 Transformer 做分类;也可以做掩码自编码器风格——同时预测被遮住的图像 patch 与频谱 patch,用大规模无标注视听数据做可扩展的预训练。

十三、高效视频理解:不可能处理每一个 clip

本讲大部分时间都在做 clip 级分类,但真实需求是长视频的动作识别——视频太长,不可能把每个 clip 都跑一遍。高效化沿两条路推进:

十四、自我中心视频:智能眼镜上的理解

面向 VR/AR 与智能眼镜的未来,自我中心视频(egocentric video)流会越来越多,这是视频理解的另一大方向。它不只带来第一人称画面,还伴随多麦克风阵列、多通道音频等多模态传感。老师举例:结合自我中心视频流、多通道音频与视觉信息,可以预测"谁在对谁说话、谁在听谁说话"(active speaker / social interaction 分析)——想象未来戴上智能眼镜,它帮你理解眼前这桌人正在发生的社交互动。多模态自我中心视频理解目前是很热的研究课题。

十五、视频基础模型:把视频接进 LLM

最后一页幻灯片呼应当下:LLM 时代的视频基础模型(video foundation models)是当前大量工作的方向。思路与视觉-语言模型一致——把视频 token 化,映射进 LLM 的嵌入空间,然后直接向视频基础模型提问:"视频里的人在做什么?"模型输出文本描述视频内容。从"固定类别的动作分类"走向"开放式提问、自由文本回答",视频理解正在重演图像理解经历过的那场范式转移。

拓展

视频多模态大模型速览。字幕只点到"把视频 tokenize 后接入 LLM"的思路,这里补充几个具体形态:其一,视频问答/字幕模型(如 Video-LLaVA、Qwen-VL 系列、Gemini 等多模态模型的视频输入能力),通常在语言模型前面接一个视频编码器(多为 VideoMAE/InternVideo 类预训练的 ViT),每隔若干帧采样、每帧切成空间 patch,经投影层对齐到词嵌入空间,与文本 token 一起进 LLM;其二,流式/长视频理解,用键帧压缩、记忆机制应对小时级视频;其三,数据与评测,VideoQA、Video-ChatGPT 等基准用于衡量时间推理、因果推理能力——这是纯分类指标(Top-1/Top-5)覆盖不到的。可以说,本讲前半部的全部架构演进(3D 卷积、双流、注意力、掩码预训练)最终都汇成了这些模型的"视觉前端"。

拓展

另一个方向的"视频 + 深度学习":视频生成。本讲只谈"理解"未谈"生成",但视频生成近年的爆发与理解模型共享大量基础设施。早期有逐帧生成+时序一致性约束的 GAN/VAE 路线(如视频预测 next-frame prediction),以及把 3D 卷积/时间注意力塞进生成器的视频 GAN;2023 年后,扩散模型(diffusion models)接管了这一领域:在 Latent Diffusion 的潜空间中加入时间层(3D 卷积或时间注意力)做时空去噪(如 Stable Video Diffusion、AnimateDiff),而 Sora 类系统则展示了"扩散 Transformer + 时空 patch 化"路线——把视频切成时空 token 统一去噪生成,能产出分钟级、时空一致性极佳的视频。一个有趣的对称:理解侧从"帧 + 光流"走向"时空 token",生成侧同样从"逐帧"走向"时空 token",两条线在表示方式上殊途同归。

十六、本讲要点回顾

上一讲第 9 讲:目标检测、图像分割与可视化理解 下一讲第 11 讲:大规模分布式训练