发现了一个看起来很有趣的任务:时空动作定位(spatio-temporal action localization),简要记录几篇论文👨💻
任务定义
检测视频中所有动作的同时,在时序和空间位置上给出定位。
常用数据集
UCF101-24:由3207段未裁剪的视频组成,涵盖24类运动动作,常使用第一split的视频来衡量动作检测的性能;
JHMDB:由928段裁剪好的视频组成,涵盖21类运动动作,常使用前三个split的均值来衡量动作检测的性能。数据集包含单帧层面的人体光流、人体mask、骨骼关节点、动作类别、图像性质(相机运动/可见人体部分/相机视角/人数/视频质量)等。
AVA:每3秒片段仅有一个动作类别标签,主要致力于基于单关键帧的动作检测,且该数据集不适合验证动作管道的性能。
实践中,常采用前两个数据集来衡量时空动作检测的指标。
应用场景
视频监控、事件检测、人机交互、智能安防、异常检测、自动驾驶等
实现思路
- 使用动作检测器在每一帧进行独立检测,再组合各帧检测结果以得到动作管路;或对单一目标检测结果进行进行时序跟踪。这种方法既低效又难以利用时序上下文信息。
- 使用3D anchor和3D卷积,在视频片段层级执行动作分类和边界回归。此anchor-based方法是目前主流做法,eg人体检测(ResNet50-based Faster RCNN pretrained on ImageNet) +动作分类(I3D/S3D-G pretained on Kinetics + ROI pooling),但会面临超参多、计算开销极大、动作时序/空间边界不够灵活、缺乏时空上下文连结信息等问题。
- 基于目标跟踪轨迹线的anchor free动作检测方法,例如MOC。
- 基于融合时序特征的类目标检测算法,例如YOWO。
指标比对
以UCF101-24和JHMDB数据集IoU=0.5作为基准指标,比较各方法的mAP如下:
ID |
paper |
JHMDB Frame mAP |
JHMDB Video mAP |
UCF Frame mAP |
UCF Video mAP |
附注 |
1 |
MOC |
70.8 |
77.2 |
78.0 |
53.8 |
JHMDB averaged three split |
2 |
YOWO(LFB) |
75.7 |
85.9 |
87.3 |
53.1 |
JHMDB first split |
3 |
TACNet |
65.5 |
73.4 |
72.1 |
52.9 |
|
n |
暴力3D sota |
77.9 |
80.1 |
76.3 |
59.9 |
|
论文阅读
- 基于tubelet的检测器很依赖启发式anchor设计,计算开销大,定位不够精准。
- 通过将动作实例转换成对一个运动点的轨迹的分析与扩展,实现了高效而精准的检测框架MOC detector。
- 实现流程:
MOC实现流程图如下所示:
(左侧feature提取部分,一次输入K张图片,R表示空间尺度下采样,默认为4,B为卷积后通道数,默认为64;右侧feature下的数字代表N、H、W、C,卷积层下的数字代表输入通道、输出通道、卷积核高度、卷积核宽度)。
模型先将图片输入2D特征提取backbone DLA-34(来自CenterNet,在ImageNet/COCO上预训练),然后将任务分成三个步骤:
- Center分支:仅在关键帧处尝试找到动作实例中心点的可能位置,并进行动作分类;
- Movement分支:通过估计当前帧运动实例中心所在位置与管路中心的offset,实现连续帧内动作中心点的运动估计(将连续帧动作实例中心的移动转化为单点的运行轨迹);
- Box分支:在每帧图像的回归中心处预测当前帧动作bbox的尺寸。
以上三分支可以从短视频片段从提取动作管道,在连结方法的基础上可以实现从长的未裁剪视频进行动作检测。
MOC三阶段示意图如下所示:
- Center分支:构建大小为W'*H'*C,数值为0至1的热力图,表征关键帧处第C类动作中心在各个空间位置发生的几率。具体地,使用高斯核函数扩张动作中心点GT所在范围;使用focal loss来解决正负样本分布不均衡的问题;筛选策略为:在每一动作类别内,若一点处取值大于等于其八近邻,则将其作为候选;对于一段短视频,仅选取得分最高的N=100个视频进行后续操作。
- Movement分支:对K帧连续图像,将其作为整体输入3D卷积层,再输出W'*H'*(k*2)的特征图,等同于为每帧输出W'*H'*2的offset数值,表征每一个中心点处的移动方向;通过Center分支和Movement分支即可得到特定动作中心点的运动轨迹;仅GT所涵盖的中心点处的移动参与反向传播,具体损失函数使用L1。
- Box分支:实验表明class-agnostic bbox的产生与时序信息无关,故仅采用当前帧的信息输入Box分支,每一帧输出W'*H'*2的数值,表征每一个中心点处的候选框大小;具体损失函数使用L1。
- 连结策略:对于任连续的K帧图片,选取动作通道(tubelets)并保留top10作为候选(candidate);
初始化:对于首帧,每个候选通道开启一个link,对于其他帧,每个与现有link无交集的候选开启一个新link。
连结:一个候选需至少满足三个条件中的一个方可添加到现有link中:1候选并未被其他link选取,2link和候选的交集大于阈值,3候选具有最高的得分。在非首帧时,我们基于link得分的降序将当前帧的候选与现有link相连结(link的得分即使管道所有得分的均值)。
结束:当一个link在连续K帧没被扩展时,将link结束。
- 补充:以上几分支的损失函数进行均衡;采用尺度变换、位置表换、图像转换等视频数据增强方法;可实现实时动作检测,通过用内存保存前K-1帧的特征来实现;连结策略中的一点是会舍弃过低置信度和过短的动作管道。
- Center分支:仅在核心帧进行动作实例的中心点检测及动作分类,是不是不够好?应该在每一帧都看才对呀
- 是不是不够anchor free,一次只能输入一部分frame
- Movement分支为什么不是针对类别的?
- Box分支为啥没类别?
- two-stage时空检测方法(tubelet+classification):依赖人为设计的tubelet,计算开销大,边界难调整;双阶段网络难以全局优化;先检测人框再对3D anchor进行动作分类的方法过分关注人所在处的信息,忽略了背景等语义交互信息;计算开销更大,时间更久,更耗空间。
- 建立one-stage的实时时空动作检测框架YOWO,一分支通过2D卷积提取当前帧的空间信息,一分支通过3D卷积提取前些帧的时空信息,使用注意力机制和通道融合方法,在融合特征的基础上进行检测任务输出动作种类和人体bbox,在达到sota精度的同时有着较快的检测速度。
-
特征提取
YOWO用于特征提取的2D/3D分支可使用任何形式的CNN替代,可在考量实时性和性能指标的基础上对其进行替换。
具体地,3D卷积分支使用在Kinetics上预训练的3D-ResNext-101作为backbone,输入视频段N∗C∗H∗W,(C=3),选取网络最后一层卷积层输出的特征N′∗C′∗H′∗W′,(N′=1,H′=32H,W′=32W);
2D卷积分支使用在PASCAL VOC上预训练的DarkNet-19作为backbone,输入图片C∗H∗W,(C=3),输入特征C′′∗H′∗W′,(H′=32H,W′=32W)。
两分支联合训练;使用StepLR策略;采用图像增强算法例如水平翻转、随机放缩、随机裁剪;使用阈值筛选bbox得分并通过NMS;鉴于数据集过小,在训练J-HMDB-21数据集时冻结了3D卷积的网络参数以加速收敛、避免过拟合。
从实验结果分析,2D网络更擅长定位任务(localization),3D网络更擅长分类任务。从activation map角度分析,2D网络关注图像内所有的人,3D网络关注正在进行动作的发生位置。
-
特征融合CFAM(channel fusion and attension mechansim)
补充知识:n维欧式空间中任意k个向量之间两两的内积所组成的矩阵,称为这k个向量的格拉姆矩阵(Gram matrix),Gram矩阵可反映出一组向量中各个向量之间的关系。
Δ(α1,α2,…,αk)=⎝⎜⎜⎛(α1,α1)(α2,α1)…(αk,α1)(α1,α2)(α2,α2)…(αk,α2)…………(α1,αk)(α2,αk)…(αk,αk)⎠⎟⎟⎞
例如输入图像的特征维度为(C, H, W),通过flatten可得到(C, H*W)形式的矩阵,对该矩阵做内积,即将其与转置得到的(H*W, C)型矩阵做矩阵乘法,即得到(C, C)形式的Gram矩阵(显然Gram矩阵是一个对称矩阵)。
Gram矩阵可以看作特征之间的偏心协方差矩阵(未减去均值故偏心)。Gram矩阵第(i, j)个元素表示通道i特征和通道j特征的内积,故其可以代表i和j通道特征的相关程度,例如特征同时出现/此消彼长的程度等。
Gram可应用于风格迁移中,例如以原图和风格图像feature map对应的Gram矩阵差异化最小为目标进行优化,最近也有了在分割任务中的应用。
将2D分支和3D分支输出的特征沿通道叠加,流程如下图所示:
特征C是由特征B的原始特征加上计算的通道权重得到的。将B至C的四条线分别认为是1~4步,则3、4步即为Gram矩阵计算过程,其中3输出(C, H*W)的矩阵,4输出(H*W, C)的矩阵,但随后进行softmax归一化操作以得到矩阵M(C, C);M矩阵与2输出的(C, H*W)矩阵点乘,再reshape得到(C, H, W)的矩阵F,最终C矩阵为C=αF+B,α为从0开始学习的参数。
注意,前后的两层卷积层可以对2D分支、3D分支这样来自不同backbone,可能有分布差异的特征进行融合。CFAM的性能提升是显著的,但如果没有这四层卷积层,性能只有小幅提升。
- bbox连结策略(linking strategy)
采用通用连结策略:
sc(Rt,Rt+1)=ψ(ov)⋅[sc(Rt)+sc(Rt+1)+α⋅sc(Rt)⋅sc(Rt+1)+β⋅ov(Rt,Rt+1)]
其中Rt代表t时刻检测区域;Rt+1代表t+1时刻检测区域;ov代表两个区域的IoU值;ψ(ov)为单值函数,ov为0时为0,其余相交时刻为1;sc代表c类别动作的得分。
在得到所有两两图像的连结得分后,使用Viterbi算法寻找最优路径以得到动作管道tubelet。
-
长时特征存储(Long-Term Feature Bank)
YOWO仅输入当前时刻之前的短时频段(8/16帧)以保证实时性,但也可利用较长的前后视频特征以提高性能。在3D分支处,LFB方法使用以当前帧为中心的8个特征平均后的结果作为CFAM模块的输入(每个特征是由8帧图像得到的,相当于共利用了前后共64帧的信息)。该方法在损伤实时性的同时却显著提高了效果。
-
3D网络输入视频帧数及降采样频率
如图,作者做了详细的实验,eg frame-8 & d-3代表从24帧中采样8帧。16帧效果较好因为其包括了更多的时序信息,降采样频率较大效果不好是因为可能没有很好地捕获动作模式,且过长的序列可能破坏时序结构(eg对于较短的动作而言,较长的序列可能包含许多不相干的信息)。
-
bbox回归
沿袭YOLO的结构,在H′∗W′的每个grid处,设计5个先验框,输出(5+numclass)∗H′∗W′,其中5代表xywh的offset和confidence score。
具体地,使用多尺度训练,测试时将图片压缩至224*224;使用SGD+momentum+weight decay济宁训练;使用smooth L1损失函数以定位(对于坏点较L2更不敏感);使用focal loss以分类。
- 光流去哪里了
- 时序因果卷积可以加载哪里
- 作者认为,YOWO获取了过多的前置信息以至于有时会在动作开始前便给出高置信度,flase positive,这个是不是可以和我的时序方法综合一下,例如我输出score结果来辅助一下。
同时作者认为,YOWO需要很多前置信息,以至于动作刚开始时容易判断错类别。
我觉得这部分的工作可以很好地和proposal的score思路进行结合。·