小区保安老陈值夜班,面前是整整 12 小时的监控录像。物业经理给他下了一个任务:把录像里所有“有人偷快递”的片段找出来,写明“从第几秒到第几秒,在哪个位置,发生了什么”。老陈当然不会一秒一秒盯,他熟练地拖动进度条快进扫视,看到可疑画面就停住细看,确认之后在值班记录表上写下一行:“23:14–23:18,电梯口,偷快递”。这份值班记录表,就是视频理解领域一个经典任务——时序动作定位(Temporal Action Localization)的输出:给一段未裁剪的长视频,自动产出若干条“动作类别 + 起止时间”的记录。本文会沿着老陈工作方式的升级路线——从人肉拖进度条,到先圈可疑段再细看,再到全自动智能报警——把主流方法、关键技术、评估标准一次讲透。

岗位关联

一句话理解它对 AI 从业者的价值:时序动作定位是视频理解“从看懂到会找”的关键一跃,掌握它,你就能为安防、体育、审核等场景交付真正在用的视频智能,它也是视频算法岗位面试的高频考点。

目录
  1. 可视化演示
  2. 任务定义:给监控录像贴便签
  3. 方法演进:从人肉拖进度条到自动巡逻
  4. 两阶段范式:先圈重点再细看
  5. 单阶段范式:一步到位的自动报警
  6. 特征建模:练就火眼金睛
  7. 评价体系:物业给老陈打分
  8. 应用场景:到处都是老陈
  9. 挑战前沿:老陈的三大烦恼
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

动态演示视频时序动作定位技术的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

视频时序动作定位技术:时序动作 时序动作定位任务定义与挑战 滑动窗口与候选提案生成方法 核心机制可视化 视频时序动作定位技术整体架构与关键组件

任务定义:给监控录像贴便签

老陈交作业的形式,是一张标准格式的值班记录表:每一行有三栏——动作类别、时间起点、时间终点。比如“23:14–23:18,偷快递”和“01:02–01:06,搬箱子”。别看这张表简单,它恰恰定义了时序动作定位要解决的完整问题:面对一段没有剪辑、没有标记的长视频,自动找出所有动作发生的片段,写清楚“谁(什么动作)、从哪一秒开始、到哪一秒结束”。

在技术术语里,这条录像叫“未裁剪视频”(untrimmed video)——它不像短视频平台上的剪辑作品,而是连着录一整晚的原始素材,90% 以上的时间都是空荡荡的背景。时序动作定位(Temporal Action Localization)要做的,就是从这些“无聊画面”里,把动作实例精确地“抠”出来,输出一组记录:\(\{(c_i, s_i, e_i)\}\),其中 \(c_i\) 是动作类别,\(s_i\) 和 \(e_i\) 分别是起始和结束时刻。它和常见的视频分类有本质区别:分类只回答“这段视频里有什么”,定位还要回答“这件事发生在哪一段时间”,后者显然难得多——因为动作的边界往往是模糊的,一个人“偷快递”从伸手那一刻算起,还是从眼睛盯上箱子算起?没有一刀切的答案。

那么,怎么评判老陈找得准不准?物业经理用一把尺子——时间交并比(tIoU),衡量预测片段与真实片段的重叠程度:

老陈心里清楚,经理拿着这把尺子,他报的片段必须和真实偷窃过程“重叠够多”才算有效命中。整个时序定位研究,本质上就是研究如何把这张值班记录表填得更准、更全、更稳。

\displaystyle\text{IoU}(A,B)=\frac{I}{U},\qquadI=\max\!\left(0,\ \min(e_A,e_B)-\max(s_A,s_B)\right),\qquadU=(e_A-s_A)+(e_B-s_B)-I
通俗地说,这就是“两段录音重叠的部分占它们合起来的多大比例”,比例越高,说明找到的时间段越接近真相。
  1. 交集长度 \(I\)两个时间区间真正重合的长度。算法是用两段的结束时刻中较小的那个,减去开始时刻中较大的那个;如果结果是负数(表示根本没有重叠),就取 0,因为重叠长度不可能为负。
    I=max⁡ ⁣(0, min⁡(eA,eB)−max⁡(sA,sB))I=\max\!\left(0,\ \min(e_A,e_B)-\max(s_A,s_B)\right)
  2. 并集长度 \(U\)两段各自长度的总和,减去重复计算的重叠部分。就好比两个人各自报告了自己值班的时间,合并考勤时要减掉两个人同时都在岗的那段。
    U=(eA−sA)+(eB−sB)−IU=(e_A-s_A)+(e_B-s_B)-I
  3. 交并比 \(\text{IoU}\)交集除以并集,取值永远在 0 到 1 之间。IoU 为 1 表示预测和真实完全重合,为 0 表示完全没对上;业界通常以 IoU ≥ 0.5(或 0.3、0.7)作为“这次算命中”的及格线。
    IoU(A,B)=IU\text{IoU}(A,B)=\frac{I}{U}

方法演进:从人肉拖进度条到自动巡逻

老陈刚上岗时的办法很朴素:固定按 3 秒一档快进,每停一次就看一眼画面,判断“这一小段像不像偷快递”。这就是最早的“滑窗 + 分类”思路——把视频切成密密麻麻的候选小段,对每一段用人工设计的特征(如 HOG、光流 iDT)配合 SVM 分类器打分,分数高的就报出来。这个办法的缺点是显而易见的:窗口大小全靠猜,快进了怕漏,慢看了费眼,整晚下来老陈累得眼冒金星。

后来物业升级了工作流程,给老陈配了“两部曲”作业法:第一步,先快速扫一遍,把所有“可疑人影”的时间段都圈出来,哪怕圈得宽一点也没关系,这叫候选提案生成;第二步,对圈出来的每一段慢放细看,确认是不是偷快递、再把起止时间修精确,这叫分类与边界精修。这套“先粗筛、再复核”的思路,对应深度学习时代的“两阶段范式”(two-stage),它把“找到位置”和“判断类别”拆成两个环节,各司其职,精度一下子拉开了。

再后来,物业干脆装了一套全自动智能系统:摄像头捕捉的画面直接进网络,网络一口气输出“类别 + 起止时间”,中间不再有显式的候选圈选步骤。这就是“单阶段范式”(one-stage)和端到端方法——它们把整个定位过程变成一个可微分的整体,从原始特征一路优化到最终记录表。回看这条演进路径:从手工特征到深度特征,从两步走合并成一步走,从依赖人工设计的窗口、锚点到让模型自己学出动作的起止——老陈的三代工作方式,恰好就是时序动作定位领域十多年的技术缩影。

两阶段范式:先圈重点再细看

两阶段的老陈是这样工作的:晚上九点先以 4 倍速“速览”一遍录像,凡是捕捉到“有人鬼鬼祟祟地出现在货架附近”,就随手记下一个时间段——一晚上可能记下 25 段,其中很多是误报。接下来才是重头戏:从 25 段里逐段慢放,确认动作类别,修正起止点,最后只把确认无误的写进值班表。这套流程里的“速览圈段”就是提案生成(proposal generation),“逐段确认”就是动作分类与边界精修。

提案生成环节有一个铁律:宁可多圈,不可漏圈。因为一旦速览时漏掉某段,第二阶段再怎么仔细也找不回来——也就是说,第一阶段的召回率决定了整个系统的上限。为了让“圈段”这一步足够敏感,研究者设计了边界敏感网络(BSN,Boundary Sensitive Network):它用时间卷积网络对每个时刻预测三个信号,分别是“动作从这里开始的概率”\(P_{\text{start}}\)、“动作在这里结束的概率”\(P_{\text{end}}\),以及“这一段内容是动作而非背景的动作性分数”\(P_{\text{action}}\)。有了这三个信号,就可以组合出任意候选片段的置信度:

两阶段方法如同老陈“先速览后细看”的分工哲学,把召回和精度两个目标拆开优化,至今仍是时序定位领域影响力最大、精度最高的一类范式,代表作有 BSN、BMN,以及后续用图网络建模提案关系的 P-GCN 等。

Conf(s,e)=Pstart(s)×Pend(e)×Paction(s,e)\displaystyle\text{Conf}(s,e)=P_{\text{start}}(s)\times P_{\text{end}}(e)\times P_{\text{action}}(s,e)
这个公式的意义是:一个候选片段要让人信服,必须“起点像起点、终点像终点、中间确实在干动作”三件事同时成立,缺一不可。
  1. 起点概率 \(P_{\text{start}}(s)\)模型对“动作恰好在第 \(s\) 秒开始”的把握。BSN 用 BiLSTM 加时间卷积扫过整个特征序列,为每一秒输出一个 0 到 1 之间的起始概率,形成一条“起始概率曲线”。
    Pstart(s)∈[0,1]P_{\text{start}}(s)\in[0,1]
  2. 终点概率 \(P_{\text{end}}(e)\)与起点对称,模型对“动作在第 \(e\) 秒结束”的把握,同样来自时间卷积网络输出的概率曲线。
    Pend(e)∈[0,1]P_{\text{end}}(e)\in[0,1]
  3. 动作性 \(P_{\text{action}}(s,e)\)对整个候选区间“平均动作浓度”的打分,用来过滤掉“起点终点都对但中间其实是背景”的假提案。
    Paction(s,e)∈[0,1]P_{\text{action}}(s,e)\in[0,1]
  4. 三者连乘得置信度三个概率相乘,任意一个很低都会把最终分数拉下来,天然实现了“既要边界准、又要内容实”的筛选。按分数排序后取 Top-K 或阈值,就得到送入第二阶段的候选名单。
    Conf(s,e)=Pstart(s)×Pend(e)×Paction(s,e)\text{Conf}(s,e)=P_{\text{start}}(s)\times P_{\text{end}}(e)\times P_{\text{action}}(s,e)

单阶段范式:一步到位的自动报警

物业后来换了一套“傻瓜式 AI 摄像头”:它不像老陈那样先圈 25 段再逐一核实,而是盯着画面直接吐出一张值班记录表——类别、起点、终点一次到位。这就是单阶段范式:把未裁剪视频的特征序列送进网络,网络直接回归出所有动作实例,全程只有一个可端到端训练的模型,简洁而高效。

单阶段方法内部又分两派。一派叫“锚点机制”:就像老陈心里对“偷快递大概持续 5 到 10 秒”有个先验,网络预先铺设一批固定长度的时序锚点(如 4 秒、8 秒、16 秒),然后预测每个锚点区间内是否存在动作、动作类别是什么、以及真实边界相对锚点需要偏移多少——代表工作是 SSAD。另一派叫“无锚点方法”:干脆不预设长度,让模型直接预测每个时刻的动作概率以及到动作起止点的距离,代表作有 AFSD、GTAD,以及近年用 Transformer 直接输出实例的 ActionFormer。

为了让一步到位的同时不丢精度,单阶段方法通常要同时优化好几个目标:既要分对动作类别,又要卡准起点和终点,于是损失函数写成多任务加权和:

单阶段方法胜在结构简单、推理快,但就像老陈的自动摄像头偶尔会把“弯腰系鞋带”误报成偷快递一样,它在边界精细度上常常略逊于两阶段,因此许多工作会额外加上边界细化模块。速度与精度,永远是这对欢喜冤家之间的拔河。

L=Lcls+λ1 Lstart+λ2 Lend\displaystyle\mathcal{L}=\mathcal{L}_{\text{cls}}+\lambda_1\,\mathcal{L}_{\text{start}}+\lambda_2\,\mathcal{L}_{\text{end}}
意思是“分类要认真学、起点要认真学、终点也要认真学”,三份作业的得分按权重加在一起,才是最终的考核总分。
  1. 分类损失 \(\mathcal{L}_{\text{cls}}\)衡量模型把每个时间位置判成“背景/某类动作”的对错,通常用交叉熵损失,它的作用是保证报出来的片段类别靠谱。
    Lcls=−∑tytlog⁡y^t\mathcal{L}_{\text{cls}}=-\sum_t y_t\log\hat{y}_t
  2. 起始回归损失 \(\mathcal{L}_{\text{start}}\)衡量模型对动作起始位置的预测偏差,通常用平滑 L1 损失,作用是让起点预测贴近真实值。
    Lstart=smoothL1(s−s^)\mathcal{L}_{\text{start}}=\text{smooth}_{L1}(s-\hat{s})
  3. 终点回归损失 \(\mathcal{L}_{\text{end}}\)与起始损失对称,约束结束位置的预测精度,是边界质量的另一半保障。
    Lend=smoothL1(e−e^)\mathcal{L}_{\text{end}}=\text{smooth}_{L1}(e-\hat{e})
  4. 权重 \(\lambda_1,\lambda_2\)调节三项目标的重要程度,避免某一项过于强势把模型带偏,是训练时常用的超参数。
    λ1,λ2∈R+\lambda_1,\lambda_2\in\mathbb{R}^+

特征建模:练就火眼金睛

老陈能一眼看出“那个人伸手的弧度跟平时取快递不一样”,靠的是多年夜班攒下的经验。换成算法,这份“火眼金睛”来自预训练的视频特征提取器。原始视频画面不能直接塞进定位网络——帧率太高、信息太冗余,所以业界先用在大规模视频数据集(如 Kinetics)上预训练好的 I3D 或 SlowFast 网络,把每几秒的画面压缩成一个特征向量,整段录像就变成了一条“特征序列”,形状为 \(T\times D\)。这一步相当于把 12 小时录像缩写成一张“剧情概要时间表”。

有了特征序列,接下来要在时间维度上“读懂”它。动作不是孤立的一帧画面,一个人伸手之前往往有张望,偷完东西之后往往有快速离开——这些上下文线索,需要专门的时序编码模块去捕捉。最经典的编码器之一就是双向 LSTM(BiLSTM),它从两个方向读序列,让每个时刻的隐藏状态同时包含“过去的来龙”和“未来的去脉”,更新公式如下:

除了 BiLSTM,现代方法也常用一维时间卷积和 Transformer 做时序编码;为了让模型同时适应“偷快递”这样几秒的短动作和“长时间盯梢”这样的长动作,还会构建多尺度特征金字塔(如 TPN)。特征工程做到位,定位模型就成功了一半——老陈的经验积累,正相当于 I3D 的预训练;哪怕换一个新小区,他适应两天就能上岗,因为“看人的底子”还在。

h→t=tanh⁡ ⁣(Wx xt+Wh h→t−1+b)\displaystyle\overrightarrow{h}_t=\tanh\!\left(W_x\,x_t+W_h\,\overrightarrow{h}_{t-1}+b\right)
可以把它想象成老陈一边回放之前的画面、一边预判接下来的画面,综合前后信息才判断“眼下这个人到底在不在偷东西”。
  1. 当前输入 \(x_t\)第 \(t\) 秒的视频特征向量,是这段录像在某一时刻的“浓缩画面”。
    xt∈RDx_t\in\mathbb{R}^D
  2. 上一时刻状态 \(\overrightarrow{h}_{t-1}\)模型对“到上一秒为止发生了什么”的总结,带着历史信息的“记忆体”。
    h→t−1∈Rd\overrightarrow{h}_{t-1}\in\mathbb{R}^d
  3. 权重矩阵 \(W_x, W_h\)分别决定“当前画面”和“历史记忆”各自贡献多少分量,是训练中学出来的参数。
    Wx∈Rd×D,Wh∈Rd×dW_x\in\mathbb{R}^{d\times D},\quad W_h\in\mathbb{R}^{d\times d}
  4. 激活函数 \(\tanh\)把加权求和的结果压缩到 -1 到 1 之间,保证状态值稳定并引入非线性表达能力,最终产出当前时刻的隐藏状态。
    h→t=tanh⁡(zt)\overrightarrow{h}_t=\tanh(z_t)

评价体系:物业给老陈打分

月底考核到了,物业经理拿着老陈交的值班记录表,逐一和监控回放核对:你报的 23:14–23:18,真实偷窃发生在 23:12–23:20,重叠比例 0.6,超过 0.5 的及格线,记一次有效命中;你报的 23:40–23:44,回放里根本没人,算误报一次。这个“够了才算对、多报要扣分”的考核逻辑,对应评估时序定位模型的两个经典指标:精确率(precision,报出来的里面有多少是对的)和召回率(recall,真实动作里有多少被报出来了)。

考核必须放在统一的考场上才有意义,这就是标准数据集。时序定位领域最常用的两个 benchmark 是 THUMOS14 和 ActivityNet-1.3:前者动作实例密集、难度大,后者视频时长长、类别约 200 类,都是“未裁剪长视频 + 精确秒级标注”的配置。所有论文都在这两个考场上按同一套规则答题,才能公平对比。

考场的计分规则是这样的:在不同的严格程度(tIoU 阈值)下各算一次平均精度(AP),再求平均,得到 mAP:

考核标准会反过来塑造工作方式:老陈知道经理只看 tIoU≥0.5 的命中,就会优先把模糊边界修准,而不是多报几个可疑段。研究也一样——指标在哪里,优化方向就在哪里。

mAP=1∣T∣∑τ∈TAP(τ),T={0.3,0.4,0.5,0.6,0.7}\displaystyle\text{mAP}=\frac{1}{|\mathcal{T}|}\sum_{\tau\in\mathcal{T}}\text{AP}(\tau),\qquad\mathcal{T}=\{0.3,0.4,0.5,0.6,0.7\}
通俗地讲,就是同一个模型,分别在“宽松 0.3”“标准 0.5”“苛刻 0.7”等五档要求下各考一次试,再把五次成绩平均,避免模型只在某一档上投机取巧。
  1. 单档平均精度 \(\text{AP}(\tau)\)固定 tIoU 阈值为 \(\tau\) 时,把模型所有预测按置信度从高到低排序,逐条累积计算精确率-召回率曲线,曲线下的面积就是这一档的 AP。
    AP(τ)=∫01p(r) dr\text{AP}(\tau)=\int_0^1 p(r)\,dr
  2. 阈值集合 \(\mathcal{T}\)一组从宽松到严格的五档要求,模拟从“大概找到就行”到“必须卡到秒级”的不同应用需求。
    T={0.3,0.4,0.5,0.6,0.7}\mathcal{T}=\{0.3,0.4,0.5,0.6,0.7\}
  3. 取平均 \(\frac{1}{|\mathcal{T}|}\sum\)把五档成绩等权平均,得到综合评价分 mAP。mAP 越高,说明模型在松紧各种要求下都能稳定找到动作,泛化能力越强。
    mAP=15∑τAP(τ)\text{mAP}=\frac{1}{5}\sum_{\tau}\text{AP}(\tau)

应用场景:到处都是老陈

老陈这门“从长录像里找动作片段”的手艺,其实各行各业都在抢着要。第一个大场景是安防监控:商场、小区、工地的摄像头 24 小时不间断,过去出事后安保人员要翻几小时录像,现在部署时序动作定位模型,自动把“偷窃、跌倒、打架”等片段的起止时间推送到值班手机,人力复核成本降到原来的十分之一。第二个场景是体育赛事分析:一场 90 分钟的足球赛,转播团队要人工回看找“进球、犯规、越位”做集锦,而定位模型能以秒级精度自动切出高光片段,配合回放缓冲直接拼接,赛后 5 分钟就能上线集锦。第三个场景是内容审核:短视频平台每天上传海量长视频,逐帧审查成本极高,整条下架又容易误伤;先用定位模型锁定违规瞬间(危险动作、不当内容),再只剪切违规区间,既保内容安全又保创作者利益。

第四类场景是视频检索:用户想找“电影里所有跳水的画面”,系统先在片库的每部电影上离线跑一遍时序动作定位,建好“动作索引”,查询时直接返回起止秒和对应片段。这些场景的共性非常明显:素材是“长且杂”的未裁剪视频,目标是稀疏的秒级动作,代价敏感度高,而这一切正是时序动作定位的用武之地。老陈们的万千需求,催生了从算法研究到工程化部署的完整产业链——从模型训练、特征抽取加速,到流式推理、边缘部署,每个环节都有技术人忙碌的身影。

挑战前沿:老陈的三大烦恼

老陈也有头疼的时候。烦恼一是“看不动”:12 小时的录像,如果每一帧都要细细分析,哪怕是 AI 也扛不住算力开销。业内对策包括稀疏采样(每秒只抽 1-2 帧)、把长视频切成重叠分块处理,以及近年兴起的流式/在线定位——不等整段视频看完,边看边输出结果。烦恼二是“看不清”:深夜灯光昏暗,小偷的动作边界糊成一团,模型很难判断“伸手”到底从哪一帧开始。对策是前面讲过的多尺度金字塔、边界细化和上下文建模,让模型既看局部细节又看前后文。烦恼三是“没标签”:物业舍不得花钱雇人逐帧标注,只给一句“这盘录像里有偷窃”的粗标签——这就是弱监督时序动作定位,模型只能凭借视频级类别标签,利用类别激活序列等线索,自己摸索出动作可能出现的区域,难度陡增。

站在更前沿的位置,时序动作定位正在与多模态大模型合流:视频与文本的联合建模,让模型不仅能定位“偷快递”,还能理解“把快递从货架移到购物车”这种语义更细腻的描述;自监督预训练则让模型在无标注数据上先学“看片”,再在下游任务上微调。这些方向都指向同一个未来——像老陈一样,不仅能找到动作,还能真正“看懂”动作。老陈的烦恼,正是算法工程师的机会;谁能把这些烦恼一个个解决,谁就能把时序动作定位打磨成真正落地的生产力工具。

AI 应用场景

仓储监控:失窃案件自动回溯

阶段:模型应用与部署

解决的问题:传统安防靠人工翻查 24 小时监控找失窃片段,一个案件平均耗费两人小时,还容易漏看。部署时序动作定位后,系统自动输出“偷窃/夹带”动作的起止时间表,安保人员只需复核可疑片段,10 分钟即可锁定证据链。

具体案例:某电商仓库将 16 路摄像头画面接入 TAL 服务,对货架区与通道区域配置偷窃动作模型,命中片段实时推送到值班手机;上线半年协助追回货物损失约 40 万元,误报率通过区域规则过滤控制在可接受范围。

体育赛事:高光集锦自动剪辑

阶段:特征工程与推理优化

解决的问题:转播团队人工回看整场比赛找“进球/犯规/越位”做集锦,效率低且容易漏剪。时序定位模型把事件定位到秒级,配合直播流的预录缓冲,能自动切片合成集锦。

具体案例:某体育平台对足球直播流运行实时时序动作定位,事件触发后自动预录前后 30 秒缓冲画面,赛后 5 分钟内生成高光短视频并推送到 App 首页,编辑人力需求下降约 70%。

内容审核:长视频精准处置

阶段:模型训练与数据标注

解决的问题:UGC 平台面对海量长视频,整条下架误伤严重,逐帧审核成本过高。先用时序定位锁定违规瞬间,再仅对违规区间做剪切或警告,兼顾安全与创作者权益。

具体案例:某内容社区对用户上传的长视频运行“危险动作/暴力行为”定位模型,命中片段经人工质检后只裁剪违规区间而保留其余内容,创作者申诉率下降 37%,审核人力成本下降约一半。

Python 演示

python64 行
# -*- coding: utf-8 -*-"""滑窗 + 线性分类器 + NMS 实现最简单的时序动作定位演示"""import numpy as np np.random.seed(42)T, D = 60, 64           # 60 秒视频, 每秒 64 维特征feats = np.random.randn(T, D) * 0.1action_vec = np.random.randn(D) # 构造两段真实动作, 特征与 action_vec 方向一致gt = [("偷快递", 12, 20), ("搬货", 35, 41)]for _, s, e in gt:    feats[s:e] = np.random.randn(e - s, D) + action_vec def classify(seg):    avg = feats[seg[0]:seg[1]].mean(axis=0)    return float(avg.dot(action_vec)) def iou(s1, e1, s2, e2):    inter = max(0, min(e1, e2) - max(s1, s2))    union = (e1 - s1) + (e2 - s2) - inter    return inter / union if union > 0 else 0.0 def proposal(win, stride, thresh):    out = []    for s in range(0, T - win + 1, stride):        e = s + win        score = classify((s, e))        if score > thresh:            out.append((s, e, score))    return out def nms(props, thresh=0.5):    props = sorted(props, key=lambda p: -p[2])    keep = []    while props:        best = props.pop(0)        keep.append(best)        props = [p for p in props                 if iou(p[0], p[1], best[0], best[1]) < thresh]    return keep def evaluate(props, iou_thresh=0.5):    hits = 0    for s, e, _ in props:        for _, gs, ge in gt:            if iou(s, e, gs, ge) >= iou_thresh:                hits += 1                break    precision = hits / max(len(props), 1)    recall = hits / len(gt)    return precision, recall def main():    props = []    for win in (5, 8, 12):        props.extend(proposal(win, 2, 0.5))    props = nms(props)    precision, recall = evaluate(props)    print("滑窗得到候选: %d 个" % len(props))    print("精确率: %.2f, 召回率: %.2f" % (precision, recall)) if __name__ == "__main__":    main()
目的:用滑窗枚举 + 线性分类器打分 + NMS 去重,完整跑通“提案生成 → 筛选 → 评估”的最小时序定位链路,与正文中的两阶段思想一一对应。
  1. feats[s:e] = np.random.randn(e - s, D) + action_vec让真实动作时间段内的特征与“动作向量”方向一致,模拟画面里确实在发生该动作。
  2. def iou(s1, e1, s2, e2):实现正文中的时序交并比公式,是判断“命中与否”的核心函数。
  3. for s in range(0, T - win + 1, stride):滑窗枚举所有候选时间段,相当于老陈拖动进度条快进扫视。
  4. if score > thresh:分类器得分超过阈值才保留,过滤掉大量背景片段。
  5. props = sorted(props, key=lambda p: -p[2])按置信度从高到低排序,保证 NMS 优先保留最有把握的候选。
  6. props = [p for p in props if iou(p[0], p[1], best[0], best[1]) < thresh]NMS 去重:与已保留片段重叠过多的候选直接丢弃。
  7. precision = hits / max(len(props), 1)精确率:报出来的片段里有多少是真动作。
  8. recall = hits / len(gt)召回率:真实动作里有多少没被漏掉。

常见误区

误区“给视频里每一帧判断是不是在偷快递,把连续标签帧连起来就是定位了吧?很多入门教程都是这么讲帧分类的。”

正解逐帧分类得到的是每帧的动作分数,它只是中间产物。时序动作定位输出的是“实例级”结果——动作类别加上一个连续的起止区间,而不是逐帧标签。直接用帧分类结果拼区间,会忽略时序一致性,把中间过渡帧误判成背景或别的动作,边界也会碎成一片。真正的方法是在帧级分数之上做提案生成或直接回归区间,最后用实例级 tIoU 来评估,而不是看帧准确率。

为何常见:因为图像分类、视频分类先入为主,很容易把一切视频任务都简化成“是不是分类问题”。

误区“两阶段的第一步就是找候选,那我索性把视频切得越碎、候选报得越多,总能把所有动作都覆盖到,效果自然最好。”

正解候选的数量和质量是两个维度。候选多确实能提高召回上限,但大量假阳性候选会让第二阶段不堪重负,最终精度反而下降,计算开销也是平方级爆炸。现代方法追求“少而精”的提案:用边界概率、动作性分数筛选出高质量候选,再交给第二级分类器精修。NMS 和阈值筛选之后,真正起作用的永远是那批“边界准、内容实”的提案。

为何常见:直觉上“宁可错杀一千、不可放过一个”,却忽略了 precision 和计算开销也是评估指标的一部分。

误区“我预测的起点和真实起点差 1 秒,终点差 1 秒,误差很小,tIoU 应该很高吧?”

正解tIoU 衡量的不是端点距离,而是两个区间“重叠部分占并集的比例”。举例:预测区间 [10, 30](长度 20),真实区间 [15, 20](长度 5),端点看似都挨着,但交集只有 [15, 20] 共 5 秒,并集是 20 秒,tIoU 只有 0.25,远远不及格。端点误差小只说明“边界摸到了边”,覆盖率不够依然判负。这也是为什么许多论文强调“边界点得准,长度也得压得对”。

为何常见:受目标检测中“中心点距离”等习惯影响,想当然地用端点误差替代区间重叠率。

误区“我已经有一个在短视频上训练好的动作分类模型,把长视频切成小段挨个分类,再拼起来不就能做定位了吗?”

正解剪辑好的短视频是“稀疏动作片段”,而长未裁剪视频里 90% 以上是背景段,动作边界、上下文、类别的分布都完全不同,领域差距很大。直接迁移会出现两类典型问题:模型把背景片段误报成动作,且对动作的起止帧毫无敏感性。要落地定位任务,需要引入负样本(背景片段)、用未裁剪数据训练,并加入边界/提案建模模块,让模型学会“区分动作与背景”和“卡准边界”。

为何常见:短视频数据容易获取、标注成本低,开发者容易忽略训练分布与推理场景分布的巨大差异。

面试题

Q1. 时序动作定位任务直接输出的结果是什么?

单选题 · easy

  • A.预测每个视频帧的动作类别
  • B.动作类别加上起止时间段← 正确答案
  • C.给整段视频打一个整体标签
  • D.输出人体的骨骼关键点标注

答案:B。时序动作定位的输出是若干条动作实例记录,每条包含动作类别与起止时间(秒或帧)。逐帧类别是帧级分类任务,整体标签是视频分类,骨骼关键点是姿态估计,都不是定位任务的直接输出。

Q2. 评估时序定位结果时,时间交并比(tIoU)的作用是什么?

单选题 · easy

  • A.衡量预测与真实片段的重叠度← 正确答案
  • B.衡量分类置信度的高低
  • C.衡量模型训练的收敛速度
  • D.衡量视频画面的清晰度

答案:A。tIoU 计算预测时间区间与真实区间的交集占并集的比例,用于判断“这次定位算不算命中”。它与分类器置信度、训练速度、画质无关,是定位任务特有的空间(时间)相似度标尺。

Q3. BSN(Boundary Sensitive Network)中的三个分支分别预测什么?

单选题 · mid

  • A.起点、终点、动作性三路分支← 正确答案
  • B.颜色、纹理、形状三路特征
  • C.分类、回归、分割三个任务
  • D.快进、暂停、回放三个模式

答案:A。BSN 用时间卷积网络预测“动作开始概率、动作结束概率、动作性分数”三个信号,三者相乘得到候选提案的置信度。“颜色纹理形状”是图像底层特征,“分类回归分割”是通用任务,“快进暂停回放”是播放器操作,均与 BSN 无关。

Q4. 以下哪些属于单阶段时序定位方法的优势?

多选题 · mid

  • A.端到端联合训练更简洁← 正确答案
  • B.无需单独的提案生成阶段← 正确答案
  • C.支持任意长度视频输入
  • D.推理阶段的速度更快← 正确答案

答案:ABD。单阶段方法直接从特征序列回归出动作实例,端到端可训练、无需显式提案模块、推理更快。但“支持任意长度视频”并不成立——受显存和上下文窗口限制,单阶段方法同样需要滑窗或分块处理长视频。

Q5. THUMOS14 数据集上评估时序定位模型惯用的指标是?

单选题 · mid

  • A.多个 tIoU 阈值下的平均 mAP← 正确答案
  • B.单帧分类精度的准确率
  • C.文本生成的 BLEU 评分
  • D.图像生成的 FID 指标

答案:A。时序定位的标准做法是在多个 tIoU 阈值(如 0.3 到 0.7)下分别计算 AP,再取平均得到 mAP。单帧准确率属于帧级分类,BLEU 属于文本生成,FID 属于图像生成,均不适用。

Q6. 关于两阶段时序定位方法,正确的说法有哪些?

多选题 · hard

  • A.先提案后分类再边界精修← 正确答案
  • B.提案质量决定召回率上限← 正确答案
  • C.第二阶段使用人工设计特征
  • D.边界精度通常优于单阶段方法← 正确答案

答案:ABD。两阶段方法先由提案生成模块圈出候选区间,再由分类网络精修类别与边界;第一阶段的召回能力决定了整体召回上限;第二阶段使用深度特征而非手工特征;由于有专门的边界精修环节,边界精度通常优于单阶段方法。

Q7. 弱监督时序动作定位中,训练数据只提供什么标签?

单选题 · hard

  • A.视频级的动作类别标注← 正确答案
  • B.每帧密集的像素级标注
  • C.精确到秒的起止时间标注
  • D.完全不需要任何训练标注

答案:A。弱监督设定下只给“这盘录像里有偷窃”这种视频级类别标签,没有起止时间;模型需要借助类别激活等线索自行定位。帧级密集标注和秒级起止标注属于全监督配置,完全无标签则属于无监督/自监督方向。

Q8. 提取视频时序特征时,通常使用哪类预训练网络?

单选题 · easy

  • A.I3D 或 SlowFast 等视频网络← 正确答案
  • B.BERT 或 GPT 等文本模型
  • C.仅对单帧处理的图像网络
  • D.变分自编码器类生成模型

答案:A。I3D、SlowFast 在大型视频数据集(如 Kinetics)上预训练,能捕捉短时运动信息,输出适合时序建模的特征序列。BERT/GPT 处理文本,单帧图像网络缺少时序信息,VAE 是生成模型,均不适合作为视频时序特征提取器。

Q9. 关于时间区间 IoU 的计算,正确的说法有哪些?

多选题 · mid

  • A.交集取两段结束期的较小值← 正确答案
  • B.并集是两段长度和减交集← 正确答案
  • C.完全重叠时 IoU 大于一
  • D.完全无重叠时 IoU 为零← 正确答案

答案:ABD。交集长度 = min(两段结束时刻) − max(两段开始时刻),再与 0 取最大值;并集 = 两段长度之和 − 交集。完全重叠时 IoU = 1,完全不重叠时 IoU = 0,取值范围恒在 [0, 1],不可能大于 1。

Q10. 某模型在五个 tIoU 阈值下的 AP 分别为 80、70、60、45、30,则该模型的 mAP 为多少?

单选题 · extreme

  • A.取最大数值即 80 个百分点
  • B.五个精度取均值得到 57.0← 正确答案
  • C.取中间数值即 60 个百分点
  • D.取最小数值即 30 个百分点

答案:B。mAP 是各个 tIoU 阈值下 AP 的算术平均:(80 + 70 + 60 + 45 + 30) / 5 = 57。它综合反映了模型在宽松到严苛不同定位要求下的稳定精度;只取最大、中间或最小值都只代表单一档位的表现。