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_segment、course_segment、ending_segment三个参数,默认配置为(1, 5, 1)或(1, 8, 1)等组合,三段合起来构成一次前向输入。
这种设计带来两个直接好处:
- 信息解耦:不同时段提取不同粒度的特征,开始/结束段关注"边界",进行段关注"内容";
- 结构约束:无论动作长短,都被统一映射到三段结构,天然具备尺度不变性。
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.py的SSNInstance.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 提案生成
- 用
gen_sliding_window_proposals.py在视频上生成多尺度滑窗候选; - 用
binary_train.py训练一个二分类"动作性(actionness)"分类器,判断每个窗口"像不像动作"; - 用
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.txt、activitynet1.2_tag_val_normalized_proposal_list.txt,可以直接用gen_proposal_list.py适配到本机帧数。
训练细节:三类样本与在线难例挖掘
SSN 的训练非常讲究数据配比。ssn_dataset.py把训练提案分成三类池子:
| 样本类型 | 含义 | 默认比例 |
|---|---|---|
| 前景(Foreground) | 与真实动作 IoU > 0.7 | 1 |
| 不完整(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) | RGB | Flow | RGB+Flow |
|---|---|---|---|
| BNInception | 16.18 | 22.50 | 27.36 |
| BNInception(Kinetics 预训练) | 21.31 | 27.93 | 32.50 |
| InceptionV3(Kinetics 预训练) | 22.12 | 30.51 | 33.15 |
| 模型(ActivityNet v1.2) | RGB | Flow | RGB+Flow |
|---|---|---|---|
| BNInception | 24.85 | 21.69 | 26.75 |
| BNInception(Kinetics 预训练) | 27.53 | 28.0 | 28.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_PATH3. 训练与测试
训练 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_reference4. 关键文件速查
| 用途 | 文件 |
|---|---|
| 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),仅供参考