物业经理老王接到报案:小区门口的一件包裹不见了。他面前的屏幕正回放一整天的监控录像——10 个小时的画面压成一条长长的进度条。老王的活儿是:找出行窃发生在哪一刻——小偷几点几分走进画面,几点几分离开。这就是“时序动作检测”。 以前的办法像是设陷阱:先在录像里划出一大堆“可疑时间段”,再逐个排查。而 ActionFormer 的做法更像资深侦探:先把录像用不同倍速各看一遍(多尺度特征金字塔),再把相隔很远的可疑线索在脑中串起来(时序自注意力),最后不依赖任何预设模板,直接下结论:“动作从第 4 分 02 秒开始,到第 7 分 35 秒结束”(无锚点预测)。
掌握 ActionFormer,等于掌握了视频理解领域的“破案心法”:它在 ActivityNet 等基准上稳居榜首,其纯净的 Transformer 设计思路,能直接迁移到各类时间序列推理任务中,是走向视频算法工程师的必经一站。
目录
可视化演示
展示ActionFormer无锚点时序动作定位、局部自注意力窗口机制与多尺度特征金字塔,切换模式交互探索TAD流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
无锚点时序动作定位 视频特征序列输入Transformer编码器 每个时刻预测动作起止边界与类别 无需预设锚框尺度超参 预测 = {start, end, class} = f(features) 无锚点设计简化后处理流程
任务定义:从录像里找“出没时刻”
老王把一天 10 小时监控从头到尾看一遍,心里只有一个问题:包裹到底是几点几分被拿走的?任何一帧都不能放过,但也不是每一帧都要仔细看。时序动作检测问的正是这个问题:在一段未裁剪的原始视频里,把每一个“动作”发生的时间段精确地圈出来。
具体来说,模型要输出三类信息:动作类别 c(在做什么)、开始时刻 s(从哪一秒开始)、结束时刻 e(到哪一秒结束)。这与“行为识别”只回答“这一刻在干嘛”完全不同。检测要求模型对时间边界负责——多报一秒、少报一秒,都算不准确。整个任务属于视频理解的分支,核心是“定位 + 分类”双输出。
如何衡量“准不准”?工程师们借用了目标检测里的交并比(IoU),把时间区间当成一维的“方框”,定义出时序交并比 tIoU:它直接度量“模型说的时段”和“标准答案的时段”重合了多少。
就像老王复盘时和监控录像“对表”,他说“小偷 4 点 02 分进门、7 点 35 分离开”,标准答案记录“4 点 05 分进门、7 点 32 分离开”,重叠度越高,说明他看监控的水平越高——tIoU 就是这张“对表成绩单”。
- 区间表示A 是模型预测的区间,B 是真实标注区间,各含开始与结束两个端点。
- 交集长度两个区间同时覆盖的那一段时长,取两端较晚的开始与较早的结束之差。
- 并集长度从最早起点到最晚终点的总跨度。
- 求比值交集除以并集,数值越大代表预测边界越精确。
技术演进:从设陷阱到直接破案
早期的视频检测算法像在楼道里布设“捕兽夹”:先假设小偷可能经过的每个位置,放上一堆夹子(候选区间),过一会儿再去检查哪些夹子被踩中了。这套流程有效,但夹子放得太多,检查起来费时费力;放得太少,又会漏掉目标。
两阶段方法正是如此——先用一个“提议网络”生成大量候选时间区间(相当于布置捕兽夹),然后对每个候选区间做分类与边界微调。后来出现的单阶段方法干脆扔掉候选提议,直接在时间轴上逐帧预测,像巡逻一样边走边判断。在单阶段方法内部,“锚点”曾是重要设计:一组预设好的时间宽度,模型预测时在锚点基础上做偏移修正。但锚点尺度需要手工设定,动作时长千差万别,很难覆盖所有情况。
ActionFormer 的突破在于完全去掉锚点。它的输出格式统一为动作实例集合,每个实例包含类别、开始时间、结束时间、置信度。因为不再依赖预设锚点,后处理只需一次阈值筛选和局部去重,流程大幅精简,也更容易训练。
如果说老前辈靠“广撒网”碰运气,那 ActionFormer 就是练出了火眼金睛——不需要先摆一堆夹子,看到可疑身影当场就能报出“从 4:02 到 7:35”。
- 结果集合模型最终输出的所有动作实例,数量 N 不固定,由视频内容决定。
- 类别标签c_i 表示动作类别,比如偷窃、奔跑、握手。
- 时间边界s_i 是开始时刻,e_i 是结束时刻,位于整条视频的时长范围内。
- 置信度p_i 是模型对这个实例的把握程度,用于排序去重。
多尺度特征:三副眼镜看录像
监控里的动作时长千奇百怪:小偷伸手够包裹只要 2 秒,站在门口观察却要 2 分钟。如果只看单一分辨率的画面,要么漏掉快动作,要么看不清慢动作。老王有三副眼镜:广角镜扫全局、中焦镜看场景、显微镜盯细节。
这就是多尺度特征金字塔的直觉来源。ActionFormer 从骨干网络拿到一条长度为 T 的特征序列后,并不直接做预测,而是逐层把时间长度减半,生成一组分辨率从高到低的特征层。浅层保留精细的时间结构,适合精确卡边界;深层的时间跨度大,适合感知动作的整体语境。
在具体实现中,每一层都使用一维卷积沿时间轴滑动,把两个相邻时刻的特征压缩成一个。所有层共享同一个 Transformer 编码器参数,每层独立编码后再融合预测。这套“多尺度看全、单尺度看细”的设计,正是无锚点方法能精确回归起止边界的关键支撑。
三副眼镜各司其职,老王才能在报告里既写得出“4 点 02 分进门”这种精确时刻,又描述得出“这是一次有预谋的入室盗窃”这种全局判断。
- 层特征F_l 是第 l 层的特征序列,长度为 T_l,通道数为 C。
- 一维卷积卷积核只在时间轴上滑动,参数 k=3 表示一次看相邻 3 个时刻。
- 步长下采样步长 s=2 让输出长度减半,相当于每两步合成一步。
- 层层堆叠层数越深,时间分辨率越低、感受野越大。
自注意力机制:跨时刻的线索串联
老王看监控有个绝活:他脑中有张透明的“线索网”。第 3 分钟那个低头走路的背影,和第 5 分钟门被推开的声音,会在他脑中瞬间连通。别人看监控是顺着时间轴一帧帧看,而他是跳着看、连着想。
自注意力机制干的就是这件事。对特征序列中的任意一个时刻,它都能直接访问整条时间线上所有其他时刻的信息,并按照“相关性”加权汇总。CNN 只能看局部卷积窗口,RNN 只能一步步传递记忆,而自注意力一步到位,天然适合捕捉远距离的时间依赖。
具体计算时,每个时刻生成三个角色:查询 Q(我在找什么)、键 K(我有什么线索)、值 V(线索的具体内容)。Q 与所有 K 做点积得到注意力分数,除以维度开方后经过 softmax 变成权重,再对 V 加权求和。除以 √d_k 是为了让分数尺度稳定,避免 softmax 输出过于尖锐。多个注意力头并行,还能同时捕捉“谁在先谁在后”“哪个片段最相似”等不同关系。
正因有这张线索网,老王才能得出“4 点到 7 点半之间发生了一整件事”的结论——不是孤立的可疑帧,而是前后呼应的完整动作。
- 三个投影Q、K、V 由特征变换而来,维度都是 d_k,T 是序列长度。
- 得分矩阵Q 与 K 的转置相乘,S_{i,j} 表示第 i 帧与第 j 帧的匹配程度。
- 温度缩放除以 √d_k,把得分压回温和区间,防止 softmax 饱和。
- 概率归一化softmax 把每行分数变成和为 1 的注意力权重。
- 加权聚合用权重对 V 加权求和,得到携带全局信息的输出。
无锚点预测:不看模板,直接报时
传统锚点法像裁缝店里只挂 S、M、L 三款样衣:顾客来了,只能挑最接近的款式,再修修改改。而无锚点预测是高级定制——裁缝看一眼身形,直接量出肩宽、袖长,裁出合身的衣服。
ActionFormer 就是那个“高级裁缝”。对每一个时间位置 t,分类分支先判断“这里是不是动作、是什么动作”;回归分支则直接预测两个跨度:动作起点离当前帧有多远(Δs),终点离当前帧有多远(Δe)。
因为是逐点直接预测,不需要预设任何锚点集合,每个位置都可以“量身定制”任意长度的动作区间。预测时,起点等于当前时刻减去左跨度,终点等于当前时刻加上右跨度。推理阶段,只需按置信度排序、设定阈值、用简单的局部极大值抑制去掉互相重叠的重复预测,即可得到最终结果,后处理非常干净。
老张不再依赖“常见小偷身形”的模板,面对两秒的伸手和两分钟的观察,都能直接报出准确时间——这正是无锚点带来的自由度。
- 逐点扫描t 是当前时刻的索引,模型沿时间轴逐点做预测。
- 左右跨度Δs_t 与 Δe_t 是模型预测的正数偏移,分别表示起点离当前帧多远、终点离当前帧多远。
- 起点推导当前时刻减去左跨度,得到动作开始时间。
- 终点推导当前时刻加上右跨度,得到动作结束时间。
- 区间合成两者组合成一个完整的预测区间。
训练与推理:师父带徒弟
老王不是天生有火眼金睛。他跟着师父练了三个月:师父拿着历史档案(视频加标注),让老王说出案发时间,说错了就纠正。训练就是不断“说错—纠正”的过程,直到判断越来越准。
模型训练同样需要“师父”——标注好的视频数据。每段真实动作区间内的帧被标记为正样本,之外的帧是负样本。由于监控视频里 99% 的时间都是平静的,负样本远多于正样本,分类损失必须特别处理。Focal Loss 通过调制因子压低“已经分对的简单样本”的权重,把学习重点压到“还分不对的困难样本”上。回归部分则用 Smooth L1 损失,只对正样本计算起止时间误差。
推理时,各金字塔层的预测先融合,再统计置信度并排序,用非极大抑制去掉重叠的区间。整个过程分为分类判类别、回归卡时间两条线,最后合成完整的动作列表。
师父的每一次纠正,最终都变成了老王脑中那张线索网的“走线习惯”;对模型来说,就是那几千万个参数的不断微调。
- 分类损失用 Focal Loss 计算,缓解正负样本严重不平衡。
- 预测概率p 是模型对正样本预测的概率,越接近 1 表示越自信。
- 调制因子(1-p)^γ 让难样本贡献更大,γ 通常取 2。
- 回归损失用 Smooth L1 度量预测边界与真实边界的差距。
- 权重系数λ 控制两项损失的相对重要性,默认设为 1。
评估与应用:考核与上岗
老张学成出师,参加年度考核:考官给他十段从未看过的监控,让他标出所有案发时段,然后与标准答案比对——时间重合度越高,得分越高。这就是 mAP 的考法。
评估时序动作检测的标准指标是 mAP(均值平均精度)。先在某个 tIoU 阈值(如 0.5)下,把所有预测按置信度排序,画出精确率-召回率曲线并计算曲线下面积 AP;然后把多个阈值下的 AP 取平均,得到综合得分。ActivityNet-1.3 上通常对 0.5 到 0.95、间隔 0.05 共 10 个阈值取平均;THUMOS14 则常用 0.3 到 0.7、间隔 0.1。ActionFormer 在这两个基准上都达到了当时领先的精度。
考核之外,老王被派到三个岗位:小区安防——自动盯梢异常行为;体育直播——自动剪辑进球集锦;网络内容审核——自动定位违规片段。ActionFormer 的纯 Transformer 加无锚点设计,让这些应用从“事后翻录像”走向“实时读秒”。
- 阈值门槛每个 τ 是一个 tIoU 匹配阈值,越高要求越严苛。
- 单阈值精度AP_τ 是在该阈值下的精确率-召回率曲线面积。
- 阈值数量共取 10 个均匀间隔的阈值,K = 10。
- 求平均把这 10 个 AP 求平均,得到模型的综合定位评分。
AI 应用场景
智能安防:从“翻录像”到“读秒报案”
阶段:模型推理与后处理
解决的问题:传统安防依赖保安手动回放数十小时录像,费时且易漏。ActionFormer 对长视频特征流直接预测异常动作的起止时间,十几分钟可处理数小时录像,并精确到秒。
具体案例:某园区在出入口部署摄像头,模型实时检测“人员闯入”“倒地求助”等动作。当检测到有人摔倒,系统自动截取 [14:02:11, 14:02:38] 片段推送给值班室,附带类别与置信度,值班员只看关键片段即可决策。
体育赛事自动剪辑
阶段:特征提取 + 时序检测
解决的问题:剪辑师需要在数小时比赛中找到所有进球、犯规时刻,人工拉片成本极高。ActionFormer 对整场比赛做时序检测,直接输出每个关键动作的起止时间,自动生成集锦初稿。
具体案例:篮球直播系统中,模型输入每帧的球员位置特征与语义特征,检测“三分出手”“扣篮”“犯规”等动作区间,自动拼接成 2 分钟高光集锦,剪辑师只需复核微调。
网络视频内容审核
阶段:长视频分析
解决的问题:审核人员需要逐帧检查长视频是否包含违规片段,人力成本极高。ActionFormer 能定位违规动作的精确时间段,审核员只需快速查看模型高亮区间。
具体案例:UGC 平台每天上传数百万小时视频,模型先做视频分类粗筛,再对可疑视频做动作定位,返回[违规开始秒, 违规结束秒],供人工复核与下架处理,审核效率提升数倍。
Python 演示
import numpy as np T, C = 64, 8GT_S, GT_E = 24, 48 def build_features(): # 合成一段带噪声的特征序列,动作区间内信号更强 rng = np.random.default_rng(0) X = rng.normal(0, 0.3, (T, C)) X[GT_S:GT_E] += 1.0 return X def scaled_attention(X): # 简化版缩放点积自注意力:Q=K=V=X d = X.shape[1] S = X @ X.T / np.sqrt(d) E = np.exp(S - S.max(axis=1, keepdims=True)) A = E / E.sum(axis=1, keepdims=True) return A @ X def pyramid(X): # 两层特征金字塔:第 2 层时间长度减半 X1 = scaled_attention(X) X2 = scaled_attention(X[::2] + X[1::2]) return X1, np.repeat(X2, 2, axis=0)[:T] def t_iou(s1, e1, s2, e2): # 时序交并比:交集长度 / 并集长度 inter = max(0, min(e1, e2) - max(s1, s2)) union = max(e1, e2) - min(s1, s2) return inter / union def main(): X = build_features() X1, X2 = pyramid(X) # 融合两层特征得到逐帧置信度 score = (X1.mean(axis=1) + X2.mean(axis=1)) / 2 t = int(score.argmax()) # 阈值法提取连续动作区间(真实模型用回归分支直接输出偏移) mask = score > score.max() * 0.5 idx = np.where(mask)[0] s_pr, e_pr = int(idx[0]), int(idx[-1]) + 1 iou = t_iou(s_pr, e_pr, GT_S, GT_E) print("峰值时刻: %d" % t) print("预测区间: [%d, %d) 真实区间: [%d, %d)" % (s_pr, e_pr, GT_S, GT_E)) print("tIoU: %.2f" % iou) if __name__ == "__main__": main()
X[GT_S:GT_E] += 1.0在真实动作区间内增强特征幅度,模拟“动作帧特征更强”的观测。S = X @ X.T / np.sqrt(d)计算缩放后的注意力得分矩阵。A = E / E.sum(axis=1, keepdims=True)用 softmax 将得分归一化为注意力权重。X2 = scaled_attention(X[::2] + X[1::2])相邻帧相加完成时间下采样,构成第 2 层金字塔。score = (X1.mean(axis=1) + X2.mean(axis=1)) / 2融合两尺度特征得到逐帧置信度。mask = score > score.max() * 0.5阈值化提取连续动作候选区间。iou = t_iou(s_pr, e_pr, GT_S, GT_E)用 tIoU 量化预测区间与真实区间的重合度。
常见误区
误区ActionFormer 是纯 Transformer 架构,视频又长,肯定比以前的候选区域方法慢很多,不可能用于工业落地。
正解特征金字塔把深层序列长度压缩到原来的 1/4 甚至 1/8,自注意力计算量大幅下降;同时无锚点设计免去了候选区域生成和大量冗余后处理。实际推理速度与主流单阶段方法相当,完全可部署在服务器端做离线视频分析。
为何常见:Transformer 在 NLP 里以“大模型、长文本、高算力”闻名,人们容易把这种印象迁移到视频场景,忽略了时序下采样带来的计算量红利。
误区既然叫无锚点,模型就是对每个帧凭空预测,不需要任何关于动作长度的先验知识。
正解无锚点的意思是不要手工预设的锚点集合,但先验仍然存在——多尺度金字塔本身就是一个“尺度先验”:每一层只看某一档时间粒度,相当于把常见动作时长分档隐式建模。它和锚点法的区别是:先验不再以离散框的形式存在,而是融入了网络结构。
为何常见:从“锚点”字面意思误解为“完全没有先验”,忽略了网络结构本身携带的归纳偏置。
误区自注意力能同时看到所有帧,全局信息都齐了,加位置编码只是锦上添花,可有可无。
正解自注意力的计算公式对输入顺序完全对称(置换不变性):把第 3 帧和第 50 帧交换位置,输出几乎不变。但动作检测极度依赖时间顺序——“先走近再伸手”和“先伸手再走近”完全不同。位置编码把“第几帧”的序号信息注入特征,模型才知道先后关系,才能分辨动作的方向性和因果逻辑。
为何常见:误以为“看得全 = 分得清顺序”,没有注意到注意力公式本身不含任何顺序信息。
误区模型预测的区间和真实标注的 tIoU 越高,就代表模型越强,其他指标都不用看。
正解tIoU 只是单个匹配的门槛。一个只预测“整段视频”的模型,在 tIoU=0.1 时可能拿高分,在 tIoU=0.7 时却几乎全错。因此业界用 mAP:在多个 tIoU 阈值下分别计算 AP 再平均,综合衡量宽松匹配和严格匹配下的表现。只看单阈值容易以偏概全。
为何常见:目标检测领域长期用 0.5 IoU 的 mAP,很多人把习惯带过来,忽略了时序检测对边界精度的更高要求。
面试题
Q1. 时序动作检测的核心输出是什么?
- A.输出每帧类别
- B.输出起止和类别← 正确答案
- C.输出段落主题
- D.输出物体位置
答案:B。时序动作检测要回答“什么动作、从哪一秒到哪一秒”,核心输出是动作类别加起止时间。按帧分类属于行为识别,段落主题属于视频摘要,物体位置属于目标检测,都不是时序检测的输出。
Q2. 哪个指标专门衡量预测区间与真实区间的重叠程度?
- A.目标检测mAP
- B.文本生成BLEU
- C.时序交并比tIoU← 正确答案
- D.图像相似SSIM
答案:C。tIoU 把动作区间看作一维框,交集除以并集,是时序动作检测最基础的定位指标。mAP 是整体评估指标而非原始重叠度量,BLEU 用于文本,SSIM 用于图像质量。
Q3. ActionFormer 的核心技术特征包括哪些?
- A.纯注意力编码器← 正确答案
- B.多尺度特征金字塔← 正确答案
- C.基于候选区域设计
- D.无锚点直接回归← 正确答案
答案:ABD。ActionFormer 用纯 Transformer(注意力)做编码,用金字塔覆盖多尺度,并做无锚点直接回归。基于候选区域是两阶段老路,恰恰是 ActionFormer 要革新的对象,因此不选 C。
Q4. 自注意力公式中除以 √d_k 的主要作用是什么?
- A.增大模型参数
- B.防止数值饱和← 正确答案
- C.加快训练速度
- D.生成多尺度
答案:B。QK^T 的数值随维度 d_k 增大而变大,softmax 在输入很大时梯度趋近 0(饱和),除以 √d_k 让分数保持温和,训练更稳定。它不增加参数,也不直接决定训练速度或尺度生成。
Q5. 特征金字塔主要解决什么问题?
- A.解决视频偏色
- B.应对时长差异← 正确答案
- C.处理音频噪声
- D.降低显存占用
答案:B。视频里动作时长差异巨大,单一时间分辨率的特征难以同时把握长动作的全局与短动作的细节。金字塔通过逐层下采样,让不同层各管一档时间粒度,从而应对时长差异。
Q6. ActionFormer 的边界回归分支直接预测什么?
- A.动作类别概率
- B.锚点的位置偏移
- C.到起止点的跨度← 正确答案
- D.输出像素的颜色
答案:C。回归分支对每个时刻预测两个跨度:动作起点离当前帧多远、终点离当前帧多远,再推出预测区间。锚点偏移是传统锚点法的思路,ActionFormer 并不使用;类别概率由分类分支负责。
Q7. 训练时分类损失用 Focal Loss 的主要原因是什么?
- A.减少计算开销
- B.缓解样本不平衡← 正确答案
- C.替代回归损失
- D.提升推理速度
答案:B。长视频中背景帧远多于动作帧,正负样本严重失衡。Focal Loss 通过调制因子压低易分负样本的损失贡献,让模型聚焦少数的困难动作样本。它不改变计算开销,也不替代回归损失,与推理速度无关。
Q8. 关于位置编码,下列说法正确的是?
- A.注意力对顺序不敏感← 正确答案
- B.编码提供时序信息← 正确答案
- C.位置编码完全可省
- D.编码只用于分类
答案:AB。自注意力是置换不变的,交换两帧位置输出不变,因此必须靠位置编码注入“第几帧”的顺序信息。位置编码在回归、分类中都会使用,完全可省的说法是错误的。
Q9. ActionFormer 在 ActivityNet 上的 mAP 是如何计算的?
- A.仅取单个阈值
- B.多阈值取平均← 正确答案
- C.逐像素求平均
- D.取最大召回率
答案:B。ActivityNet 采用 0.5 到 0.95、间隔 0.05 共 10 个 tIoU 阈值,分别计算各阈值下的 AP 再取平均得到 mAP。单阈值只能反映某一苛刻程度下的精度,不能全面衡量定位能力。
Q10. 相比锚点法,无锚点设计的优势有哪些?
- A.后处理流程精简← 正确答案
- B.免手工设计锚点← 正确答案
- C.精度必然会更高
- D.超参数数量更少← 正确答案
答案:ABD。无锚点直接预测起止跨度,不需要预设锚点集合,也不需要基于锚点的匹配后处理,超参数更少。精度更高不是必然结论,只能说在主流基准上达到了更强效果,因此不选 C。