想象你是刑侦队的新人,抱着一整晚的酒店监控录像,任务是找出所有“可能有情况”的时段。12 个小时的画面,大部分时间只有走廊灯和静止的盆栽。如果一秒一秒盯着看,眼睛先崩溃。有经验的老刑警会告诉你:先让技术助手把“画面有动静”的时段全部圈出来,列成一张可疑时段清单,再逐条确认到底发生了什么。 视频理解里的时序动作提案,干的就是这位“技术助手”的活儿。面对未剪辑的长视频,它先把动作可能出现的片段——也就是那些“可疑时段”——快速圈出来,至于里面具体是打架还是奔跑,留给后续的识别环节去确认。圈得全、圈得准,后面的分析就轻松;圈得稀里糊涂,整个系统都会事倍功半。 这篇文章会从“圈时段”这个朴素直觉出发,依次拆解锚点法、边界回归、自底向上、BMN 模型和 Actionformer 模型,看看研究者们如何各显神通,把长视频变成一张干净利落的“可疑时段清单”。
学会时序动作提案,等于掌握了“长视频结构化”的钥匙。无论做安防监控、体育集锦还是视频检索,你都能先把海量素材压缩成可检索的候选片段,这是后续一切精确分析的起点。
目录
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
任务概述:先圈出“可疑时段”
酒店深夜失窃,刑警小李抱回一整晚的监控录像。整整 12 小时,大部分画面都安安静静,只有几个时段有人影晃动。老刑警教他一招:先别急着逐段辨认谁在干什么,让技术助手把“画面有明显动静”的时段全部圈出来,列成一张可疑时段清单。这个“先圈可疑时段”的助手,就是视频理解中的时序动作提案(Temporal Action Proposal,简称 TAP)。
给定一段未剪辑的长视频,TAP 的输出是一组候选时间区间 [起点,终点],每个区间都“可能包含一个动作”。它不负责判断区间里是打架、奔跑还是挥手——那是后续动作检测(Temporal Action Detection,简称 TAD)的任务。正因为先有提案把“发生在哪”粗筛出来,再做“是什么动作”的精判,整套系统才不至于在浩如烟海的帧里大海捞针。
为什么要把任务拆成两步?因为长视频里的动作极其稀疏:一段 2 小时的素材,真正含动作的时间可能只有几十秒。若直接对每一帧做分类,正负样本严重失衡,计算量也难以承受。提案阶段的任务是“高召回”——宁可多列几个可疑时段,也不要漏掉真正的动作;随后分类阶段再逐段确认,从而兼顾效率与精度。评价一个提案圈得准不准,需要一把刻度尺,这就是时序交并比(tIoU)。
回到刑侦现场:tIoU 就是“嫌疑时段”与“真实案发时段”重合度的尺子。圈得越贴边,后面的侦查工作就越省力;圈得离谱,再好的审讯技巧也无从下手。
- 求交集时长提案区间与真实动作区间在时间轴上重叠的帧数,重叠部分说明“圈中了”。
- 求并集时长两段总共覆盖的时间长度,重复部分只算一次。
- 算重合比例两个长度相除,得到一个 0 到 1 的比值,用来判断圈得准不准。
锚点法:备好不同长度的“时间尺”
刑侦队里最朴素的排查法,是把 12 小时录像按 30 秒、2 分钟、8 分钟切成一个个格子,把每个格子都当成一个潜在的可疑时段。这个办法笨,但可靠——只要尺子够密、够全,总有一把能套中真正的案发段。
锚点法(Anchor-based Method)背后的直觉正是如此:预先定义一组锚点(Anchor),每个锚点由“中心位置 c + 长度 l”描述。锚点沿时间轴滑动并覆盖多种尺度,就像把不同刻度的尺子铺满整条录像。锚点的数量越多、尺度越丰富,越能覆盖长短不一的动作:1 秒的挥手有 1 秒的尺子,1 分钟的扭打有 1 分钟的尺子。
锚点法在思想上与目标检测中的 Faster R-CNN 一脉相承——二维的“锚框”被压扁成一维的“时间区间”。实施时,通常按若干尺度与步长在时间轴上密集摆放锚点,每个锚点对应一个候选提案,数量常常成千上万。锚点铺得越满,漏检越少,但大量重叠和粗糙边界也随之而来,因此锚点法几乎总是和边界回归、筛选后处理绑定在一起。
尺子多的好处是不怕动作长短不一,代价是“宁可错杀一千”——原始锚点输出往往粗糙、冗余,必须交给边界回归去打磨。
- 锚点表示每个时间锚点用一个“中心 + 长度”的二元组描述,记作 d_i。
- 中心位置c_i 表示这段候选在时间轴上的中点,决定它落在录像的哪个位置。
- 锚点总数量下标 i 从 1 取到 N_a,表示按多尺度多步长铺出的锚点总数。
边界回归:把“大约两点到四点”修正到“2:13:05 到 3:47:22”
用尺子量出来的范围是粗的:“大约下午 2 点到 4 点”——但监控里真正可疑的时段是 2:13:05 到 3:47:22。粗网格要变成精准区间,靠的是边界回归。它就像刑警在初筛清单上补写的批注:“重点看 2 点 13 分前后。”
边界回归(Boundary Regression)对每个锚点预测一组偏移量:起点相对锚点中心的偏移、终点相对锚点中心的偏移。偏移量用锚点长度 l 做归一化,让不同尺度的锚点拥有可比较的回归目标——不管尺子长 1 秒还是 1 分钟,偏移量都被压到相近的数值范围,模型更容易学。
训练时,我们已知每个锚点对应的真实动作边界 g_s、g_e,用 Smooth L1 或 MSE 损失让预测偏移逼近真实偏移;推理时,把预测偏移反推回绝对时间戳。这一步让提案从“大约两点到四点”细化到“2:13:05 到 3:47:22”,在锚点法流水线中几乎是标配。
就像刑警在初筛清单上补写“重点看 2 点 13 分前后”,边界回归把时间窗口从“大概”校准到“精确”,为后续取证省下大量时间。
- 真实起止边界g_s 与 g_e 表示这一动作真实的开始帧与结束帧,是训练时的“标准答案”。
- 起点偏移量真实起点与锚点中心之差再除以锚点长度,消除不同尺度的影响。
- 终点偏移量同理,用锚点长度归一化真实终点与中心的偏离程度。
- 还原预测边界推理时把预测偏移乘回锚点长度再加上中心,得到精细化的起止时刻。
自底向上:先逐帧打分,再拼接嫌疑段
另一路做法完全不同——不预设任何尺子,而是让助手把每一分钟甚至每一秒都标上“有没有动静”,再把连续“有动静”的片段拼成一条可疑时段。这种先逐点判断、再拼接组装的思路,叫自底向上(Bottom-up)。它像值班保安盯着屏幕,每一秒记录“有人影、没人影”,报警器连成一条线就成了嫌疑段。
自底向上的核心概念是动作性分数(Actionness Score):每个时序位置属于动作的概率。视频先经过特征提取器(如 I3D、SlowFast)变成特征序列 h_t,再通过一个打分层得到 s_t。s_t 由 sigmoid 函数压到 (0, 1),表示“这一帧像不像动作的一帧”。训练时用动作片段的标注做监督,让含动作的帧分数高、背景帧分数低。
推理时给定一个阈值,把连续高于阈值的帧连成段,过滤掉太短的碎片,就得到一组提案。自底向上方法不需要预定义锚点,对任意长度的动作都更灵活,但分数预测的质量决定了提案上限——如果网络把“风吹树叶”都当成高动作性,候选质量就会直线下降。
保安逐秒报告“有人影、没人影”,报警器连成一条线就成了可疑时段。这种拼图式方法不依赖固定尺码,长短事件都能还原,正是它最大的优势。
- 视频特征h_t 是第 t 个时刻的语义特征向量,通常由预训练的视频编码器提取。
- 打分变换权重矩阵 W 和偏置 b 把特征向量映射成一个实数,可学习的参数在训练中不断更新。
- 概率压缩sigmoid 函数 σ 把任意实数压缩到 (0, 1),直接解释为“该时刻属于动作的概率”。
BMN模型:把“开头候选”和“结尾候选”配对
如果刑侦队有一套更聪明的系统,它会先把“哪些时刻像是案发开始”和“哪些时刻像是案发结束”分别列成两张表,再把开头和结尾一一配对。BMN(Boundary-Matching Network)正是这套系统的经典实现,它把“掐头去尾”的配对工程做到极致。
BMN 有一个时序评估模块(TEM),为每个时刻输出三个分数:作为动作起点的概率 P_start、作为动作终点的概率 P_end、以及动作性分数。另一个关键设计是边界匹配(Boundary Matching):对任意起点 i 和终点 j,用一个匹配概率衡量“从 i 开始、到 j 结束”的候选是否可信——起点越“像开头”、终点越“像结尾”,这个候选越可信。
由此可以得到一张 T×T 的边界匹配图(BM 图),图中每个格子对应一个候选区间。再通过提案评估模块(PEM)逐格回归置信度,最后按置信度排序并做非极大值抑制(NMS),输出 top-K 提案。BMN 在 ActivityNet 数据集上取得了领先的定位精度,成为后续许多工作的基线。
把“可能开头”和“可能结尾”配对,就像把案情片段的两端拼图对上茬——两头都像,才敢写进可疑时段清单。BMN 把这种配对做成了一张巨大的概率表,工程上非常优雅。
- 起点概率P_start(i) 表示第 i 个时刻被网络判定为动作开始位置的概率。
- 终点概率P_end(j) 表示第 j 个时刻被判定为动作结束位置的概率。
- 边界匹配两者相乘,得到“起点 i 到终点 j”这个区间的置信度,所有配对构成一张概率图。
Actionformer:指挥官全局通读
还有一种更高阶的思路:不依赖局部配对,而是让系统像一位站在监控墙前的指挥官,把整段录像“通读”一遍,让相距很远的画面在脑中相互参考。这正是 Actionformer 背后的哲学——目光所及,皆是案情线索。
Actionformer 把视频特征序列当作 Transformer 的输入,用自注意力让任意两个时刻直接交互,从而建模长程依赖。相比卷积只能看到局部邻域,注意力机制能把“开头 30 秒的入场”与“10 分钟后的出手”关联起来。这对长视频中的慢热动作、多阶段动作尤其重要:一个动作从酝酿到爆发可能跨越几十秒,局部窗口根本装不下。
具体做法上,视频特征加上位置编码后送入多层 Transformer,结合局部与全局的多尺度结构,输出每个时刻的起止概率;再以阈值筛选加 NMS 得到最终提案。它不需要手工锚点,也不依赖逐帧拼接,靠全局注意力一次性建模整段上下文。团队在 2022 年 CVPR 发表这项工作后,它迅速成为长视频动作定位的新一代强基线。
指挥官不必盯住每一秒,但每一秒的信息都会被其他时刻“看见”。全局通读带来的长程视野,让那些前后呼应、慢热展开的动作片段也能被完整圈出来。
- 三种投影把时间特征分别投影为查询 Q、键 K、值 V,分别回答“我想找什么”“我有什么标签”“我要携带什么信息”。
- 缩放点积相似度Q 与 K 的转置做点积,得到两两相关分数;除以根号 d_k 防止数值过大导致梯度不稳。
- 归一化权重softmax 把相关性分数变成和为 1 的权重,表示“每个时刻应该关注其他地方多少”。
- 加权融合权重乘以 V,得到融合全局信息的输出特征,每个时刻都携带了整段视频的上下文。
评价与优化:给提案助手打分
提案助手干得好不好,刑侦队长要考核两件事:有没有漏掉真正的案发时段?列出的可疑时段里有多少是废话?这正是召回率(Recall)与精度(Precision)的权衡,而在提案任务里,漏掉真凶比多列几条线索更致命,所以大家更看重召回率。
标准做法是算 Recall@N:把模型输出的提案按置信度排序,取前 N 个,看它们覆盖了多少真实动作。由于“覆盖”取决于 tIoU 阈值,研究者会在多个阈值(如 0.5、0.75、0.9)上分别计算召回,再取平均,得到平均召回率 AR(Average Recall),这是 ActivityNet 等主流数据集评估提案质量的标尺。
优化提案质量有四个常用抓手:一是 NMS 去冗余,避免几十个重叠框堆在一起;二是加入边界细化模块,把起止边界磨得更准;三是换更强的视频特征提取器,如从 I3D 升级到 VideoMAE;四是部署时对超长视频切窗处理,并缓存帧特征,控制内存与延迟。每一步都能实打实提升最终的动作定位效果。
一次完整的监控排查,最后看的就是“破案率”。提案阶段把可疑时段圈准了,后续检测与人工复核都能事半功倍。这套“先圈范围、再精确认定”的流水线,正是长视频理解最通用的地基。
- 遍历真实动作对所有真实动作区间取平均,G 表示全部真实动作的集合。
- 检查前 N 个提案P_N 是置信度最高的 N 个提案,只要其中存在一个满足条件的候选。
- 重叠达标判据tIoU 大于等于阈值 τ,代表该真实动作被成功“圈中”。
- 指示函数计数满足条件记 1、不满足记 0,最后除以总数得到 0~1 的召回率。
AI 应用场景
视频监控与安防侦查
阶段:数据预处理 → 提案生成 → 人工复核
解决的问题:传统安防靠保安同时盯几十路监控,视线疲劳导致漏报率居高不下。用时序动作提案对夜间录像做预处理,先把“画面剧烈变化”的时段压缩成几分钟的可疑摘要,再由值班员复核,既缓解眼疲劳,又不放过深夜潜入的可疑目标。
具体案例:某园区接入 30 路摄像头,每天产生上千小时监控。系统先用提案模型对每路视频按小时切窗扫描,输出高分候选时段,再拼成每日“可疑时段简报”。保安只需在平板上快速翻阅简报,一个月内成功拦截了 3 起夜间闯入事件。
体育赛事精彩集锦自动生成
阶段:视频特征提取 → 动作提案 → 集锦排序与剪辑
解决的问题:一场足球赛 90 分钟,人工剪辑精彩集锦需要反复回放、逐段比对,耗时 2 小时以上。用提案模型先圈出“射门、扑救、抢断、庆祝”的高分时段,再交给分类器确认动作类型,最后按精彩度排序自动拼出集锦。
具体案例:某体育媒体平台对中甲联赛全场录像运行 Actionformer 模型,先产出 200 条候选提案,再用动作分类器筛选出“射门、红牌、点球”三类事件,自动生成 3 分钟集锦。剪辑效率提升 80%,上线后每轮比赛都能在终场 10 分钟内发布集锦。
海量视频内容检索与审核
阶段:离线提案索引 → 在线动作过滤 → 人工审核
解决的问题:短视频平台上几十万条内容,按“是否含吸烟、飙车、打架”等动作筛选,若对全视频逐帧分类,计算成本极高。先做提案索引,把每个视频的可疑片段预计算出来,在线检索时只对候选片段做分类,速度和成本都能优化一个数量级。
具体案例:某内容审核平台为入库视频建立提案索引库,审核员输入“危险驾驶”,系统只在提案区间内运行分类模型,命中后自动截取证据片段并转人工复核。相比逐帧扫描,检索耗时从 40 秒降到 2 秒,审核通过率也显著提升。
Python 演示
import numpy as np def simulate_actionness(n_frames=100, seed=42): """模拟一段视频的逐帧动作性分数,动作段加高、背景段压低。""" rng = np.random.default_rng(seed) score = rng.rand(n_frames) * 0.15 + 0.03 for start, end in [(20, 40), (62, 80)]: score[start:end] += 0.55 + 0.2 * np.sin( np.linspace(0, np.pi, end - start)) return np.clip(score, 0.0, 1.0).round(3) def build_proposals(score, threshold, min_len=4): """自底向上:分数超过阈值的连续帧拼成一个候选提案。""" mask = score >= threshold proposals, i = [], 0 while i < len(mask): if mask[i]: j = i while j < len(mask) and mask[j]: j += 1 if j - i >= min_len: proposals.append((i, j - 1)) i = j else: i += 1 return proposals def temporal_iou(p, g): """计算提案 p 与真实动作 g 的时序交并比。""" s1, e1 = p s2, e2 = g inter = max(0, min(e1, e2) - max(s1, s2) + 1) union = (e1 - s1 + 1) + (e2 - s2 + 1) - inter return inter / union if union > 0 else 0.0 def recall_at_threshold(proposals, gt, tau): """计算召回率:有多少真实动作被至少一个提案覆盖。""" hits = 0 for g in gt: if any(temporal_iou(p, g) >= tau for p in proposals): hits += 1 return hits / len(gt) def main(): gt = [(20, 40), (62, 80)] score = simulate_actionness() print("模拟动作性分数前 20 帧:", score[:20]) for threshold in [0.3, 0.4, 0.5, 0.6, 0.7]: props = build_proposals(score, threshold) r50 = recall_at_threshold(props, gt, tau=0.5) r75 = recall_at_threshold(props, gt, tau=0.75) print(f"threshold={threshold:.1f} proposals={len(props):2d} " f"Recall@0.5={r50:.2f} Recall@0.75={r75:.2f}") if __name__ == "__main__": main()
for start, end in [(20, 40), (62, 80)]:指定两个真实动作区间,作为评估召回率的“标准答案”。score[start:end] += 0.55 + 0.2 * np.sin(...)在真实动作段上叠加一个峰形高分,模拟网络预测出的动作性分数。mask = score >= threshold阈值筛选,把浮点分数转成布尔掩码。while i < len(mask):遍历掩码,寻找连续为 True 的区段。if j - i >= min_len:过滤掉太短的碎片,防止把一两帧噪声当成提案。inter = max(0, min(e1, e2) - max(s1, s2) + 1)求两个区间在帧维度的重叠长度。hits / len(gt)真实动作被“覆盖”的比例,就是召回率。
常见误区
误区很多初学者把 TAP(提案)和 TAD(检测)当成一回事,认为提案模型应该直接输出“这段是打架”的类别标签。
正解提案只回答“哪里可能有动作”,输出的是时间区间加置信度;检测才回答“那里是什么动作”,输出的是区间加类别。类比刑侦流程:提案是圈出“这页可能有重点”,检测是“这句话是定义、是例子还是结论”。BMN、Actionformer 的输出都是候选片段,类别由后续的分类器完成。
为何常见:两个任务名字里都有“动作”,很多论文又把“提案 + 分类”的最终精度放在一起报,让人误以为它们是同一件事。
误区初学者觉得锚点越长越好,用一两个覆盖整个视频的大窗口,似乎就不会漏掉任何动作。
正解真实动作时长差异巨大,从 1 秒的挥手到 1 分钟的体操。单一尺度的大窗口要么把大量背景也框进来,要么对短动作完全不敏感。多尺度锚点密集覆盖,再配合边界回归精修,才能兼顾召回与边界质量。
为何常见:直观上“框大一点总没错”,但忽略了提案的质量——框太大反而让后续分类难以聚焦,也会产生大量冗余。
误区以为自底向上不需要训练,拿原始帧的像素差做个阈值分割就算提案了。
正解动作性分数必须由深度网络从高级语义特征中学习,比如 I3D、SlowFast 提取特征后再接打分头。阈值分割只是最后的组装步骤,分数的质量直接决定提案上限。像素差只能捕捉“画面变了”,无法理解“有人在挥手”。
为何常见:看到“阈值切割”这么简单的后处理,容易误以为整个方法都是规则式的,忽略了前端的深度特征学习才是核心。
误区看到论文里两者互相比拼,就以为它们是互斥的两条路线,不能出现在同一条流水线里。
正解BMN 是边界匹配机制的经典实现,Actionformer 是 Transformer 方案。两者都只是“提案前端”,可以共享视频特征提取器,也可以被同一个检测头复用。实践中完全可以根据场景选型,甚至用 Actionformer 生成粗提案、再用 BMN 的匹配思想做边界精修。
为何常见:对比图表强化了“竞争关系”的印象,但它们其实是同一流水线中可替换、可串联的部件。
面试题
Q1. 时序动作提案(TAP)的输出是什么?
- A.每个视频帧的动作类别标签
- B.可能包含动作的时间区间集合← 正确答案
- C.视频整体的动作类别判断
- D.动作目标的时空轨迹坐标
答案:B。TAP 输出候选时间区间,只回答“动作可能在哪里”,不负责分类。A 是逐帧分类的结果,C 是视频级分类,D 是时空动作检测的目标,均非提案输出。
Q2. TAP 与 TAD(时序动作检测)的关系是什么?
- A.TAP 是 TAD 的预处理步骤← 正确答案
- B.TAD 是 TAP 的预处理步骤
- C.两者功能完全不同且无关
- D.TAP 比 TAD 额外输出动作类别
答案:A。先由提案圈出候选时段,再做分类与边界精修,这是标准的“两阶段”流水线。D 把关系说反了,分类任务属于检测阶段,不属于提案阶段。
Q3. tIoU(时序交并比)衡量什么?
- A.提案与真实动作的时序重叠度← 正确答案
- B.视频相邻帧的像素差异大小
- C.候选提案数量的多少量级
- D.模型的推理速度的优劣情况
答案:A。tIoU 是提案区间与真实动作区间的交集除以并集,衡量时间维度上的重合程度,是提案质量的基本刻度尺。
Q4. 锚点法生成候选时,锚点由哪两个参数描述?
- A.中心位置和长度← 正确答案
- B.起始帧和颜色
- C.速度和方向
- D.面积和宽高比
答案:A。时序锚点是一维的时间区间,用“中心位置 + 长度”即可表示。颜色、速度、方向都与时间锚点的定义无关,面积和宽高比属于二维检测框。
Q5. 边界回归的主要目标是什么?
- A.将锚点中心对齐到视频中心
- B.预测偏移量细化起止边界← 正确答案
- C.把边界框缩放至全图尺寸
- D.将提案直接转换为特征向量
答案:B。边界回归学习真实边界相对锚点中心的归一化偏移,把粗锚点修正为精细区间。它不改变锚点位置的定义,也不负责特征转换。
Q6. 自底向上方法中的“动作性分数”指什么?
- A.视频整体内容的复杂程度
- B.每个时序位置是动作的概率← 正确答案
- C.动作类别的概率分布
- D.候选提案之间的重合程度
答案:B。动作性分数是逐时序位置判断“这一帧像不像动作的一帧”,由网络输出后经 sigmoid 压缩到 0~1。它是自底向上方法组装提案的基础。
Q7. BMN 模型边界匹配机制的核心思想是什么?
- A.起始与结束概率相乘组图← 正确答案
- B.用 K-Means 聚类所有边界
- C.对每一帧单独做分类判断
- D.对所有提案做随机采样处理
答案:A。BMN 把“第 i 帧是起点”与“第 j 帧是终点”的概率相乘,构成边界匹配图,图中每个格子对应一个候选区间。聚类、逐帧分类、随机采样都不是边界匹配的核心。
Q8. 下列哪些属于时序动作提案的典型应用场景?
- A.视频监控中的异常事件定位← 正确答案
- B.自动生成体育比赛精彩集锦← 正确答案
- C.人脸关键点精细对准与校正
- D.海量视频中的动作片段搜索← 正确答案
答案:ABD。监控异常定位、体育集锦生成、视频动作检索都需要先在长视频中圈出可疑时段。人脸关键点对齐属于静态图像任务,与时序提案无关。
Q9. 关于自底向上方法与锚点法,下列说法正确的有?
- A.先逐帧预测再组装候选段← 正确答案
- B.预定义多尺度锚点来采样← 正确答案
- C.后处理不需要非极大值抑制
- D.边界回归常配合锚点方法← 正确答案
答案:ABD。自底向上先预测动作性分数再组装,锚点法预置多尺度锚点并配合边界回归。两者最后通常都需要 NMS 去除冗余提案,因此 C 错误。
Q10. 关于 BMN 与 Actionformer,下列说法正确的有?
- A.边界匹配概率图筛选提案← 正确答案
- B.注意力机制建模全局依赖← 正确答案
- C.仅需分类损失即完整训练
- D.可搭配视频特征提取器用← 正确答案
答案:ABD。BMN 以边界匹配概率图为核心,Actionformer 以自注意力建模长程依赖,两者都作为提案前端、可搭配 I3D 等特征提取器使用。BMN 训练需要起点/终点概率与匹配度多种损失,C 的说法错误。