news 2026/8/21 17:58:22

action-detection 深度揭秘:SSN 如何精准定位视频中的动作起点与终点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
action-detection 深度揭秘:SSN 如何精准定位视频中的动作起点与终点

action-detection 深度揭秘:SSN 如何精准定位视频中的动作起点与终点

【免费下载链接】action-detectiontemporal action detection with SSN项目地址: https://gitcode.com/gh_mirrors/ac/action-detection

action-detection 是一个基于 PyTorch 实现的时间动作检测(Temporal Action Detection)开源项目,其核心是 ICCV 2017 论文提出的 SSN(Structured Segment Networks,结构化段网络)。它的拿手好戏,是从未剪辑的长视频中精准定位每个动作的起点与终点,并同时给出动作类别。本文将从零讲透 SSN 的定位原理、两阶段检测流程、在 THUMOS14 与 ActivityNet 上的实测表现,并附上从克隆仓库到跑通推理的完整上手指南。


什么是时间动作检测?为什么动作起点与终点这么难定位

传统动作识别(Action Recognition)处理的是已经"剪辑好"的短视频,模型只需回答"这段视频在做什么"。而时间动作检测面对的是几十分钟甚至几小时的长视频:动作何时开始、何时结束、持续多久、是什么动作,全部未知。

难点主要有三个:

难点说明
🎯 边界模糊动作边界往往是渐变的,"起跳"从哪一帧开始算,人眼都难统一
🎭 背景干扰长视频 90% 以上时间是无关背景,动作只占极小片段
⏱️ 时长悬殊同一个动作短则 1 秒、长则几十秒,尺度差异巨大

action-detection 给出的答案,就是用SSN把"动作实例"建模为三段结构,从结构上解决边界与尺度问题。


SSN 核心思想:把动作拆成"开始、进行、结束"三个时段

SSN 的灵感来自一个直觉:一个完整的动作实例,可以划分为三个语义不同的时段

  • 开始段(Starting Segment):动作即将发生的过渡阶段,例如挥拍前的蓄力;
  • 进行段(Course Segment):动作的核心阶段,信息最丰富;
  • 结束段(Ending Segment):动作收尾阶段,例如击球后的随挥。

这三个时段在特征上各有侧重,SSN 网络结构也据此设计。在 ssn_models.py 中,模型构造时分别指定starting_segmentcourse_segmentending_segment三个参数,默认配置为(1, 5, 1)(1, 8, 1)等组合,三段合起来构成一次前向输入。

这种设计带来两个直接好处:

  1. 信息解耦:不同时段提取不同粒度的特征,开始/结束段关注"边界",进行段关注"内容";
  2. 结构约束:无论动作长短,都被统一映射到三段结构,天然具备尺度不变性。

STPP 结构化时间金字塔池化:动作边界的"定海神针"

SSN 最精妙的部分,是ops/ssn_ops.py中的StructuredTemporalPyramidPooling(STPP,结构化时间金字塔池化)

普通的时序池化把整段视频的特征一视同仁地平均,边界信息被稀释。STPP 则对三个时段分别做多粒度金字塔池化

  • 开始段与结束段:细分 1 个粒度(强调整体过渡状态);
  • 进行段:细分为 2 个粒度(1 等分 + 2 等分,既看整体也看局部);
  • 每个粒度的特征用norm_num归一化,并与动作边界位置(scaling)相乘,把"边界偏移量"显式编码进特征。

STPP 输出的特征同时送入两个分类头:

输出头作用
activity 分类头判断动作类别(含背景类),对应activity_fc
completeness 分类头判断该提案是否"完整覆盖"一个动作,对应completeness_fc
regression 回归头预测起点/终点偏移,对应regressor_fc

其中 completeness 头是 SSN 的独特创新:它能区分"完全包含动作"与"只包含动作一部分"的提案,从而过滤掉大量半截子提案。


动作边界回归:如何让起点终点再精确一步

分类只能回答"这个片段像不像完整动作",真正把起点与终点"钉"准的,是位置回归。

ssn_dataset.pySSNInstance.compute_regression_targets()中可以看到回归目标的设计:

  • 中心偏移(gt_center - prop_center) / prop_size,即真实动作中心相对提案中心的比例偏移;
  • 时长缩放log(gt_size / prop_size),即真实时长相对提案时长的对数比例。

有了这两个目标,回归头输出的就是"提案该往左挪多少、该伸长或缩短多少",再配合测试阶段 eval_detection_results.py 中的perform_regression()与时间维 NMS,就能把检测框收敛到高精度的 [start, end] 区间。


两阶段检测流程:提案生成 + 精排打分

SSN 遵循经典的两阶段检测范式,流程如下:

第一阶段:TAG 提案生成

  1. gen_sliding_window_proposals.py在视频上生成多尺度滑窗候选;
  2. binary_train.py训练一个二分类"动作性(actionness)"分类器,判断每个窗口"像不像动作";
  3. gen_bottom_up_proposals.py依据动作性得分做自底向上合并,输出高质量的时序提案列表(proposal list)。

第二阶段:SSN 精排

把提案送入 SSN 模型(ssn_test.py),为每个提案输出活动得分、完整性得分与回归偏移;最后在 eval_detection_results.py 中融合多模态得分(RGB + Flow)、做 NMS 与回归,按不同 IoU 阈值计算 mAP。

项目在data/目录下已内置归一化的提案列表,例如thumos14_tag_val_normalized_proposal_list.txtactivitynet1.2_tag_val_normalized_proposal_list.txt,可以直接用gen_proposal_list.py适配到本机帧数。


训练细节:三类样本与在线难例挖掘

SSN 的训练非常讲究数据配比。ssn_dataset.py把训练提案分成三类池子:

样本类型含义默认比例
前景(Foreground)与真实动作 IoU > 0.71
不完整(Incomplete)部分覆盖动作(0.1 < IoU < 0.3)6
背景(Background)几乎不含动作1

不完整样本占比最高,这正是为了让 completeness 头学会"识别残缺"。配合ops/ssn_ops.py中实现的OHEM(在线难例挖掘)损失,模型会优先优化那些最难分类的样本,收敛更稳、效果更好。


THUMOS14 与 ActivityNet v1.2 上的实测表现

参考模型在 README 中给出了公开基准数据(RGB+Flow 双流融合,THUMOS14 为 mAP@0.5IoU,ActivityNet 为平均 mAP):

模型(THUMOS14)RGBFlowRGB+Flow
BNInception16.1822.5027.36
BNInception(Kinetics 预训练)21.3127.9332.50
InceptionV3(Kinetics 预训练)22.1230.5133.15
模型(ActivityNet v1.2)RGBFlowRGB+Flow
BNInception24.8521.6926.75
BNInception(Kinetics 预训练)27.5328.028.57

可以看到:双流融合 + Kinetics 预训练能让 mAP 提升近 10 个点,这也是 README 反复强调的调参方向。


快速上手:从克隆仓库到跑通推理

1. 环境准备

  • Python3 + PyTorch,GPU(4~8 卡体验最佳);
  • DenseFlow 工具(用于抽帧与光流提取);
  • 安装依赖:pip install -r requirements.txt

2. 克隆仓库与数据

git clone --recursive https://gitcode.com/gh_mirrors/ac/action-detection

下载 THUMOS14 或 ActivityNet v1.2 数据集后,先用 TSN 项目的脚本抽帧并提取光流,再把归一化提案列表适配到本机:

python gen_proposal_list.py DATASET FRAMES_PATH

3. 训练与测试

训练 SSN(RGB 或 Flow 模态,45 个 epoch):

python ssn_train.py thumos14 RGB -b 16 --lr_steps 20 40 --epochs 45

测试并评估:

python ssn_test.py thumos14 RGB TRAINING_CHECKPOINT RESULT_PICKLE python eval_detection_results.py thumos14 RESULT_PICKLE

如果暂时不想训练,直接用官方参考模型评估:

python ssn_test.py thumos14 RGB none RESULT_PICKLE --use_reference

4. 关键文件速查

用途文件
SSN 模型与三头结构ssn_models.py
STPP 池化、OHEM 损失ops/ssn_ops.py
数据集与三类样本采样ssn_dataset.py
提案生成全流程gen_sliding_window_proposals.py、gen_bottom_up_proposals.py
检测结果评测eval_detection_results.py
数据集配置与 NMS 等工具ops/utils.py、ops/detection_metrics.py

总结

SSN 之所以能精准定位视频中动作的起点与终点,靠的是三件武器:三段式结构建模(开始/进行/结束)、STPP 结构化时间金字塔池化(多粒度特征聚合)、边界回归 + 完整性判别(精修边界并过滤残缺提案)。action-detection 仓库把整套流程完整开源,从提案生成到模型训练再到评测,一条命令即可串联。无论你是做视频理解研究,还是想在企业级视频分析场景落地,这份代码都是极佳的起点与参考。

【免费下载链接】action-detectiontemporal action detection with SSN项目地址: https://gitcode.com/gh_mirrors/ac/action-detection

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 17:56:57

PCR芯片的技术原理、核心优势与功能分类应用

简述 PCR芯片&#xff08;PCR Array&#xff09;将实时荧光定量PCR&#xff08;qPCR&#xff09;的高灵敏性与微阵列技术的高通量特性进行有机结合&#xff0c;可在单次实验中同时检测数十至数百个与特定信号通路或生物学功能相关的基因表达水平。作为靶向基因表达谱分析的工具…

作者头像 李华
网站建设 2026/8/21 17:55:24

【计算机毕业设计单片机案例】基于 STM32 的交互式按键可调环境智能监控终端设计 基于 STM32 的家居环境感知安防一体化控制系统设计(012804)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/8/21 17:55:20

开机画面自己说了算:Anemone3DS 3DS 主题管理完整上手

开机画面自己说了算&#xff1a;Anemone3DS 3DS 主题管理完整上手 【免费下载链接】Anemone3DS A theme and boot splash manager for the Nintendo 3DS console 项目地址: https://gitcode.com/gh_mirrors/an/Anemone3DS 每天按下电源键&#xff0c;开机动画、菜单配色…

作者头像 李华
网站建设 2026/8/21 17:55:15

Mac菜单栏管理终极指南:用 Ice 快速整理你的 macOS 状态栏

Mac菜单栏管理终极指南&#xff1a;用 Ice 快速整理你的 macOS 状态栏 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 你有没有见过这样的场景&#xff1a;打开电脑&#xff0c;右上角的菜单栏挤得像…

作者头像 李华