我最早接触视频描述的时候,脑子里预设了一个很简单的图景:视频不就是一连串图片吗?那我把每一帧都过一遍图像描述模型,再把结果拼起来,不就成了?

这个想法错得离谱。后来我才意识到,视频描述真正难的地方,恰恰在于那些单帧里根本看不见的东西。
想象一个画面:一个人把手伸向杯子,握住,端起来喝了一口。如果你只看某一帧,你根本不知道这个动作是"准备喝水"还是"把杯子递给别人"。动作的含义藏在帧与帧之间的变化里,不在任何一张单独的帧里。
这就是视频描述和图像描述的本质区别。
图像描述只需回答一个问题:画面上有什么?视频描述要回答的是另一个问题:这里发生了什么?前者是静态的、空间的,后者是动态的、时间的。
所以你给模型喂再多单帧特征,它都无法真正"看懂"视频。它需要一种能力——把时间维度纳入理解的能力。
从"有什么"到"发生了什么":一个维度之差
图像描述模型做的事情,说白了就是把一张图的视觉特征映射成一段文字。CNN(卷积神经网络)提取空间特征,注意力机制决定"现在该描述哪个区域",语言模型把特征转成句子。
这套流程搬到视频上,最朴素的做法是:取视频的关键帧,分别跑图像描述,然后把句子串起来。我一开始就是这么干的。
结果惨不忍睹。明明是"一个人跑步",模型输出的是"一个人行走";明明是"往杯子里倒水",模型输出的是"一个人拿着杯子"。帧与帧之间的动作信息全丢了,模型看到什么就写什么,完全没有"变化"的概念。
这个失败让我意识到一个关键问题:视频描述的核心不是空间理解,而是时间理解。
要描述"动作",你必须知道物体怎么移动、状态怎么变化、事件怎么展开。而这些信息只能从帧与帧的比较中提取。
视频描述到底在预测什么?
现代视频描述模型的标准输出是这样的:给定一段视频 V,模型生成一个自然语言句子 S,使得条件概率 P(S|V) 最大。
句子里的每个词都是逐步生成的:
- 视频被拆成帧序列,通常每秒采样 2-8 帧;
- 每帧经过编码器变成特征向量;
- 所有帧的特征按时间顺序排列,构成一个特征序列;
- 解码器逐词生成描述,每生成一个词都"回看"视频特征和已经生成的词。
听起来不复杂,但这里藏着一个视频描述独有的难题:视频长度不定,帧数从几十到几千不等,而模型的输入尺寸却是固定的。你没法把所有帧一股脑塞进模型。
怎么办?行业里最常见的方案是平均池化或注意力加权——把整段视频的特征压缩成一个或几个向量。但压缩必然损失信息。一段 30 秒的视频压缩成 512 维向量,中间丢掉的动作细节比留下的多得多。
这也是为什么早期视频描述模型的输出总是特别"笼统":不是模型不想细说,是它根本没看到那么多细节。
动作是连续变化的,不是一张张快照
让我换个角度说这件事为什么难。
图像描述的世界是离散的:一张图里要么有猫,要么没猫。但视频里的动作是连续的:从"举手"到"放下手",中间有无数个中间状态。人类看视频时依赖这种连续性理解动作,但传统模型把视频切成帧,等于把连续运动变成了一堆离散快照。
快照之间发生了什么?模型只能靠猜。
为了弥补这一点,研究人员引入了两个关键组件:
- 3D 卷积(C3D、I3D)
- 在空间卷积的基础上,把时间维也当作卷积维度。通俗说,它同时观察连续几帧的小立方体,直接从帧间差异中提取运动特征。
- 时序注意力
- 生成每个词的时候,模型不只关注当前帧,而是对整段视频的不同时刻分配注意力权重。描述"喝水"这个词时,它会更多地关注"杯子接触嘴唇"那一帧。
这两个组件解决的是同一个问题:让模型具备"时间感知"。
但引入它们之后,模型参数量暴涨,训练难度也跟着暴涨。3D 卷积需要海量视频数据才能学到稳定的时空特征,而标注好的视频描述数据集少得可怜。这就引出了视频描述领域最尴尬的现状——模型的瓶颈不在架构,在数据。
数据困境:标注一段视频要花多久?
图像描述有 COCO Caption,14 万张图,每张标注 5 句话。完成这个标注只需要标注员盯着图片打字,一张图几十秒。
视频描述呢?标注员得先看完视频,理解动作的起止、事件的先后,然后用一句完整的话描述出来。一段 30 秒的视频,标注可能耗时几分钟。更麻烦的是,不同标注员对同一段视频的描述差异极大——有人说"男人把球扔给狗",有人说"男人在训练狗接飞盘",都算对,但训练信号完全不同。
| 数据集 | 视频数量 | 平均时长 | 标注风格 |
|---|---|---|---|
| MSVD | 1,970 | 约 10 秒 | 单句描述 |
| MSR-VTT | 10,000 | 约 15 秒 | 多句候选 |
| VATEX | 41,250 | 约 10 秒 | 中英双语 |
| ActivityNet Captions | 20,000 | 约 180 秒 | 密集事件描述 |
看这张表你就明白:规模最大、最常用的数据集,视频时长也只有 10-15 秒。模型的训练数据基本全是短视频,由单个动作构成。你让它描述一段 3 分钟、包含 5 个子事件的视频,它大概率会描述得支离破碎——不是它不想,是它从来没见过这么长的"句子"对应的视频结构。
这个现象的后果是:现有模型学到的"事件"概念是极其浅层的。它更擅长把"一个动作"翻译成一句话,而不是理解"一段由多个动作构成的事件链"。
生成句子的机制:为什么会出现"视频描述的语言平淡如水"?
理解了数据,再看模型输出,很多现象就有了答案。
为什么视频描述模型倾向于生成"一个人在做某事"这种单调句式?因为在 MSVD 这类数据集里,这种句式占绝大多数。模型只是在拟合训练数据的语言风格。
为什么模型经常漏掉细粒度动作?因为平均池化把细粒度特征抹平了,模型根本没"看见"那个细节。
为什么模型会描述出视频里不存在的东西?因为语言模型先天倾向输出流畅的句子。前几个词定下来之后,后面每个词的概率分布都被已生成的句子强烈影响,视觉特征反而成了次要从属。于是模型会"脑补"出一个在视觉上没依据、但语言上很自然的短语。
我还发现一个有趣的对比:同一段视频,如果改成用图像描述模型抽几帧分别描述,再让语言模型合并成段落,输出往往比端到端视频描述模型更简洁、更有层次。原因也很简单——抽帧单帧描述相当于人为保证了"每个画面都真的有内容",而端到端模型的池化过程把很多有用信号稀释了。
但这不意味着端到端模型没有价值。它的优势在于,能够捕捉单帧无法捕捉的运动信息,比如速度、方向、动作幅度。这两种路线并不是谁取代谁,而是各自在"静态内容"和"动态过程"之间取舍。
评价标准本身也有问题
你可能觉得,视频描述做得好不好,让模型生成一句话跟人工标注比一比不就行了?
行是行,但指标有它的盲区。
视频描述领域最常用的指标是 CIDEr、BLEU@4 和 ROUGE-L。它们本质上都在做 n-gram 重叠统计——生成的句子和参考句子重叠的词越多,得分越高。
问题在于,参考句子只有 1-3 句,而描述同样一段视频,人类可能写出几十种完全合理的表达。一个模型如果用了参考句子里没有的同义词,哪怕描述更准确,CIDEr 也会给它低分。
更讽刺的是,BLEU 和 CIDEr 对语序极其敏感,但对语义几乎不敏感。把"狗追猫"说成"猫追狗",词的重叠完全一样,但在语义上是完全错误的描述。现有指标照样给满分。(来源:BLEU 原论文里就说它基于 n-gram 共现,根本不管语义。)
所以视频描述领域一直存在一个尴尬局面:模型在指标上刷分,但人类评测时发现描述有明显错误。近年的趋势是引入基于预训练语言模型的语义相似度评测,比如 CLIP 相似度,但这类指标又容易被表面的措辞变化欺骗。评测的问题至今没被彻底解决。
视频生成模型的出现,意外推动了视频理解
有一个很有意思的转折发生在近两年。本来视频生成和视频理解是两个方向——一个是文字生成视频,一个是视频生成文字——但研究者发现,生成模型训练过程中被迫学习到的时序结构,可以被用来做更好的视频描述。
OpenAI 的 Sora 技术报告里有一个细节让我印象深刻:为了让模型生成连贯的视频,研究者需要让它理解"物体在物理世界里怎么移动、遮挡关系怎么变化、一个动作带来什么后果"。这些理解,恰好是视频描述模型最缺的东西。(来源:OpenAI 官方技术报告。)
于是出现了新的研究思路:先用海量无标注视频训练一个视频生成模型,让它学时间结构和物理规律,再把这个模型的中间特征拿来作为视频描述的视觉编码器。相当于让"会生成视频的模型"告诉你它理解了什么,你再把它的理解翻译成文字。
这条路能不能走通?目前看很有希望,但还没到颠覆的地步。原因还是数据——生成模型学到的多是像素层面的规律,而视频描述需要的是"事件"层面的语义。从像素到事件,中间还是有鸿沟。
到底什么样的架构才算"真正理解"视频?
这个问题困扰了我很久。以前我写代码时总是想,模型有注意力、有时序建模、有预训练,应该已经"懂"了吧?直到我看到一个简单的测试:给模型看一段"鸡蛋从桌上滚落、摔碎"的视频,让它描述。模型输出:"鸡蛋从桌上滚落,摔到地上。"它漏掉了"碎"这个结果。
这不是随机失误,而是暴露了一个深层问题:模型把"发生的事"描述成了一系列视觉变化的快照组合,但不一定理解事件的因果结构——为什么蛋会碎?因为摔了。它看到了"摔"和"碎"的空间相邻关系,但没有建立"摔导致碎"的因果关系。
我们把这种理解叫事件理解(Event Understanding):不仅要识别出发生了什么,还要理解事件的参与者、时序关系、因果链条。这是视频描述的下一个前沿,也是目前反复强调"从单帧描述到时序描述"的真正含义。
而要实现这一点,模型需要的不只是更好的注意力机制,还有更强的抽象能力。它得知道"水开了"意味着"水达到沸点",而不仅仅是"出现很多气泡";得知道"一个人跑向公交车"意味着"他可能想赶车",而不仅仅是"一个人移动"。
这种常识推理能力,目前只有大规模语言模型里隐隐约约有一点,但要注入到视频模型里,很难。
FAQ:视频描述的常见误区
视频描述就是把每帧的图像描述拼起来吗?
不是。拼接会丢失动作信息,而且拼出来的句子会重复、啰嗦。真正的时间建模需要跨帧的特征融合。
视频描述和动作识别是一回事吗?
不一样。动作识别是给视频贴一个动作类别标签,输出是离散的类别;视频描述输出的是完整的自然语言句子,通常包含对象、动作、场景、关系,更接近开放式的文本生成。
为什么视频描述模型的输出总是那么"干巴巴"的?
因为训练数据(如 MSVD、MSR-VTT 的描述)本来就是干巴巴的短句。数据风格决定了模型风格。要让输出更丰富,需要更丰富的标注数据或利用语言模型的先验。
视频描述能实际用在哪儿?
自动给短视频配字慕、无障碍辅助视障人士理解视频内容、视频搜索和检索、视频摘要。目前还达不到直接替代人工编辑的程度,但作为辅助工具已经可用。
它会继续变好吗?
我的判断是:会,但瓶颈会从"模型架构"转向"数据标注"和"评测标准"。
在过去五年,视频描述模型的指标的确在逐年提升,但这种提升有多少来自架构改进、多少来自预训练数据规模的增大,很难说清。有研究者发现,仅仅把视觉特征从 ResNet 换成更强的预训练特征,指标就能涨不少,模型本身没有任何变化。
这说明一个残酷的事实:视频描述模型的架构可能还没真正触到瓶颈,它最大的短板依旧是视觉特征的质量和数量。每一代更强的视觉模型出现,视频描述模型都能"被动变强"。
所以我对未来的预期是:视频理解的基础能力会继续受益于大规模预训练的推进,但视频描述这项任务本身,如果评测标准不进步,我们将很难判断模型是真正理解了视频,还是在刷分数。
这就像考试题目本身出得有问题,学生考了高分,不代表他真的学会了。
想深入的话,建议读这几篇
- Sequence to Sequence Video to Text(论文:arXiv:1505.00487)——最早把 sequence-to-sequence 引入视频描述的论文之一。
- Describing Videos by Exploiting Temporal Structure(论文:arXiv:1502.08029)——S2VT 工作,虽然老,但把时间结构讲得很清楚。
- VATEX: A Large-Scale, High-Quality Multilingual Dataset for Video-and-Language Research(论文:arXiv:1904.03493)——目前质量最好的视频描述数据集之一。
- OpenAI Sora 技术报告:Video generation models as world simulators——理解视频生成如何反哺视频理解。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/647.html