分享

YOWO-一款简单且实时的时空动作检测方案

 mynotebook 2022-10-18 发布于湖南

作者:Kissrabbit (知乎同名) 

方向:目标检测与人体动作行为分析

哈尔滨工业大学在读博士

本章,笔者介绍一个时空动作检测(spatio-temporal action detection,STAD)领域中的一个很有意思的工作:YOWO,全名为You Only Watch Once,似乎是在致敬目标检测领域中的YOLO(You Only Look Once)。YOWO这一工作最大的特点就在于“实时性”。目前,网上缺乏对YOWO的全面讲解,许多相关文章也只是停留在论文层面上的浅层分析,缺少对于YOWO的实现和诸多细节末梢的技术点的讲解。因此,笔者决定出一篇相关科普文章。

与以往一样,笔者将从YOWO原理以及代码的两个方面来做介绍。本篇(1)主要是从理论的角度介绍YOWO,随后的(2)将会从代码的角度来讲解YOWO。由于官方源码的代码风格不太对笔者的胃口,因此,读者一如既往地做了复现,实现一版代码风格更加良好、性能更加优越的YOWO。读罢两篇文章,读者不仅将会对YOWO有了一个全面且深刻的了解,还会收获一份干净整洁、性能更优越的YOWO项目。

论文链接:https:///pdf/1911.06644.pdf

官方代码:https://github.com/wei-tim/YOWO

复现代码:https://github.com/yjh0410/PyTorch_YOWO

代码讲解:https://zhuanlan.zhihu.com/p/572031559

一、引言

在介绍YOWO之前,我们先来简单了解一下时空动作检测任务的大致发展,以便我们更好地了解YOWO的研究动机和技术框架。

STAD是video understanding领域中的一个很重要的分支,旨在识别视频的每一帧中的动作实例,如图1所示。该任务表面上看起来和图像领域中的目标检测(object detection,OD)任务很相似,都是识别某种类别,并绘制矩形框来定位目标。因此,很多STAD方法也都受到了OD方法的启发和一定程度上的技术上的继承。

图片
图1. 时空动作检测实例。

但是,STAD又和OD任务有着很大的不同。对于动作识别本身来说,一个很重要的信息维度就是——时序,即STAD中的T(Temporal)。若是没有时序,仅看一帧图像,我们很容易陷入到动作识别的一个大坑里:动作歧义(Action Ambiguity)。如图2所示,对于当前帧(亦称关键帧)中的人,我们无法识别出此人是要坐下(sitting down)还是要站起来(standing up),因此必须借助此人过去的几帧当中所做出的动作来判断这一帧究竟是坐还是站。这就是时序的重要性。

图片
图2. 动作歧义示例。

因此,STAD任务的很大的挑战就是在时序上:如何高效构建人在连续帧当中的时序关联是至关重要的。对于视频理解任务来说,这一挑战已经有了很多较为成熟的研究,其中之一便是著名的3D CNN[1]。常见的3D CNN包括I3D[2],X3D[3]和SlowFast[4]等。于是,很多工作[5-10]都采用3D CNN这一技术框架来构建性能强大的动作检测网络。在这些工作当中,3D CNN的作用就是从输入的一段视频片段(通常包含8帧或16帧)当中抽取时空(spatio-temporal)特征,然后交给后续的检测头去处理。我们也可以参照object detection的分类方式,将这些工作划分为two-stage和one-stage,前者即使用Faster RCNN生成若干包含人的特征的RoI,后者就是端到端地检测,如图3所示。但不论是哪一种,大多数这一类基于3D CNN的工作都有一个致命的问题:参数量巨大且计算速度极慢

图片
图3. two-stage和one-stage的图示。摘自论文WOO[9]。

于是,一些研究者便另辟蹊径,尝试构建一个全2D卷积的时空动作检测器,比如ActionTubelet(ACT)[11],MovingCenterNet(MOC)[12]。不同于3D CNN based的技术路线,这些方法的核心思想是:仅使用2D CNN如VGG-16、ResNet等作为主干网络去抽取每一帧的空间特征,然后将这些空间特征图沿通道拼接,等到一个“厚”的特征图,再把这“厚”的特征图作为一个整体,交给后续的检测头去完成预测。由于检测头处理的是一个在通道上拼接后的特征图,我们可以认为这样经过这样的拼接后,便已经把时序给考虑了进来,检测头在做卷积时,是同时卷积所有帧的空间特征,这一操作隐含了时序的概念。

图片
图4. 基于2D CNN的动作检测框架的技术路线。

但相较于3D CNN的方法,这种仅靠拼接特征图所得到的时序关联还是不够的,于是,这一类工作往往还会设置额外的一条并行分支来处理与输入的视频片段所对应的光流信息(optical flow)。光流可以认为是一种显式的short-term时序关联,以此来弥补这些2D CNN方法的构建时序能力不足的缺陷。通常,RGB和光流两个分支的网络结构是相同的,仅在输入层有所差别,因为RGB和光流的通道数量可能不一样。我们将这一结构称之为two-stream。

与3D CNN框架相比,这些基于2D CNN的检测器往往能够运行速度更快,满足实时性的要求,比如MOC[12],MOC可以在RTX 2080ti GPU上达到40 FPS以上的运行速度。但是,这些工作的实时性只能在仅有RGB视频输入的情况下才能保证,一旦加入光流分支,速度就会显著下降。但不使用光流分支,性能又不足。比如,在该领域常用的UCF101-24数据集上,仅使用RGB视频,MOC的性能为73% frame mAP,但加入光流后,性能可以接近80% frame mAP,光流所带来的性能提升是显著的,但不再满足实时性的要求,且加入光流后所占用的GPU先存也是极大的。另外,光流通常只能离线获取,在线获取难度大,且难以实时运行,这在一定程度上也限制了这类方法的实用性。

于是,有人就开始思考了,一个通用性好的检测器应该包括以下几个特点:

  1. 仅使用易获取的RGB视频流;
  2. 有较强的时序建模的能力;
  3. 有较强的空间建模的能力;
  4. 有较强的时空建模的能力;

显而易见,以上4点可归结为“废话文学”,任何一个现有的工作又可以满足以上4点,但是,能满足以上4点而又具有实时检测能力的工作就属实是凤毛麟角了。

YOWO就是在这样的思考下诞生的。1不用说了。我们来看2,YOWO认为既然我们的输入只有视频流,那么使用3D CNN是一个很自然的选择,来实现强大的时序建模能力,但是,前面也说了3D CNN计算量大的毛病,于是YOWO选择使用一些高效的3D CNN[12]来提取输入的视频片段的时序特征,同时把输入的尺寸弄得小一些,比如224×224。接着看3,YOWO认为2D CNN有着强大的空间建模的能力,这一点已经在很多任务里被证明了,所以,YOWO选择了结构简单的YOLOv2去处理关键帧,得到关键帧的空间特征。最后,YOWO设计了一个基于自注意力机制的模块CFAM(Channel Fusion & Attention Module)来融合这两种特征,是实现4的目的。

综上,一个结构简洁,检测速度最快的实时动作检测网络诞生了,如图5所示:

图片
图5. YOWO的网络结构。

也许正是因为YOWO的研究动机和网络结构如此的简单,所以至今没有见到YOWO被哪个会议或期刊收录,当然也有可能是作者没有去投。该项目的开源代码目前已经在GitHub上获得了700+的star,这足以证明该工作的价值。

当然,肯定归肯定,优秀归优秀,YOWO也还是存在一些问题,比如:

  1. YOWO的结构里使用了3D CNN,导致它的模型参数还是很大,YOWO的计算瓶颈很大程度上都卡在了3D CNN上。
  2. YOWO虽然能实时运行,很大程度上也是得益于224×224这么小的输入图像尺寸,但如此之小的图像很容易丢失一些细粒度较小的动作细节。
  3. 尽管没用光流,但本质上还是一个two-stream框架,原本的光流分支被换成了3D CNN,这不禁让人思考:one-stream真的不可行吗?尽管有一些3D CNN based方法就是one-stream的,比如WOO[9],但笔者还想追问:仅使用2D CNN且不加光流分支去能否构建一个超越YOWO的实时检测器?因为2D CNN具有着天然的参数少、计算量小的优势。

不过,这些问题都不在本文范畴内,仅仅是笔者的一些不成熟的思考。还请读者不要在意。接下来,我们就来详细介绍YOWO的技术细节。

二、方法

2.1 3D backbone & 2D backbone

2D backbone。给定一张关键帧,也就是当前帧——这里的关键帧的概念与其他视觉问题如视觉SLAM中的关键帧定义不同,仅指当前帧,YOWO首先使用2D backbone来处理关键帧,提取它的空间特征,如图6所示。

图片
图6. 2D backbone处理输入视频片段

这里的2D backbone可以有很多选择,既然我们是想要做检测,那么将目标检测领域中的模型迁移过来或许是个很合适的想法,于是,YOWO采用了结构简单,性能也不错的YOLOv2。从YOWO论文中,我们可以了解到它使用了darknet19,事实上,YOWO不止用了darknet19,而是整个YOLOv2的网络结构,如图7所示,包括最后的预测层。

图片
图7. YOLOv2的网络结构

YOWO使用的YOLOv2的权重来源于COCO数据集,共有80个类别,且YOLOv2的anchor box数量为5,那么可以很容易算出来最终输出的特征图的通道数。通常情况下,这种迁移都会移除掉最后的预测层,毕竟任务类型不相同,但YOWO却选择保留预测层,这种做法是否合理笔者也拿不准,我们暂且认同YOWO的这一做法便好。

当然,现在one-level检测器又添加了一个YOLOF,同样是在C5特征图上去做检测,与YOLOv2一致,那么2D backbone换成YOLOF应该也合适,感兴趣的读者可以自行尝试。

至此,YOWO已经处理好了关键帧,但是,在引言章节我们已经说到过,如果只看关键帧,会存在动作歧义的问题。为了消除这一问题,考虑时序是必要的。因此,除了关键帧,我们还要考虑过去帧。于是,我们的输入除了关键帧,还需要一个包含关键帧在内的一段视频片段。为了处理这段视频,从中提取时序特征(同时也会提取空间特征),YOWO部署3D backbone来完成这件事。

3D backbone。给定一段视频片段,其中K为视频片段的长度,为单帧图像,且为当前帧。YOWO首先部署一个3D CNN,这里,我们默认使用PyTorch框架,则我们先将视频片段处理为格式为 3×D×H×W 的Tensor类型变量,为了更加一般化的讨论,我们加上batch size维度,则最终的输入为,其中,B是batch size,3是RGB颜色通道,D是视频片段的长度,即K,H和W即为图像的尺寸。经过3D CNN的处理,会得到包含了丰富的时空特征输出,记作,如图8所示。

图片
图8. 3D backbone处理输入视频片段

在YOWO工作之前,该作者还发表过一片有关高效3D CNN的研究,将一些知名的2D CNN如ShuffleNet、MobileNet和ResNet等系列推广到了3D CNN范式中去,具体可参考文献[13]。那么很自然的,在这次YOWO工作当中,3D CNN被设置为了他们的3D版的ResNet。

对于给定的输入,3D-ResNet会在空间维度 H×W 上总共进行32倍降采样,这和2D-ResNet是一样的,而在时序维度 D 上总共进行16倍降采样,因此,输出的,其中,以及。通常,3D-ResNet会有以下三种输出情况:

  1. 如果输入的视频片段长度为16,即 D=16 ,那么 Do=1 ,可以认为整个视频片段的时空信息都被压缩进中;
  2. 如果 D>16,那么就在输出的 Do 维度上求均值,仍保证输出是中;
  3. 如果D<16,那么输出的 Do 还是1。

总而言之,YOWO的3D backbone会输出一个包含了大量的时空特征的特征图。它的主要作用可以理解为光流,只不过其中所包含的信息是更高维度的。在YOWO中,3D backbone被设置为3D-ResNext-101。当然,也可以选择3D-ShuffleNet-v2。后面笔者会讲到使用3D-ShuffleNet-v2复现的YOWO,并将这一轻量版的YOWO命名为“YOWO-Nano”。

YOWO的主要目的是检测关键帧中的动作,现在,既有了2D backbone输出的空间特征,又有了3D backbone输出的时空特征,接下来,就需要设计一种方式将时序特征融合进关键帧的空间特征当中,以便完成最终的检测。

2.2 CFAM模块

YOWO采取了“通道融合+注意力机制”的方案。所谓的通道融合,即把和沿通道拼接,然后使用一层1x1卷积和3x3卷积进行以此处理,输出融合后的特征,如图8所示,其中1x1卷积和3x3卷积后面都会跟一个Batch Normalization(BN)和LeakyReLU,融合后的通道数。

图片
图8. 通道融合。

但是,YOWO认为如此简单的融合是不充分的,无法使得关键帧的空间特征和时序特征相互很好地融到在一起。于是,在此之后,YOWO又设计了一个注意力模块,如图9所示,其本质是在通道维度上做自注意力。

图片
图9. 注意力模块。

和Transformer应用在CV任务中的情况中并没有太大差别(少了multi-head和FFN),无非是Transformer在CV任务中,通道是在拉平后的空间维度上去做self-attention,而YOWO设计的注意力模块则是在通道维度上去做self-attention,其数学过程如下:

  1. 首先,对输入的特征拉平(flatten)操作,得到向量,其中。
  2. 接着,计算attention需要的Q、K和V,注意,这里没有线性映射:
  3. 我们再把 F″ reshape回来,得到。最终的输出还有一个带权重的残差连接操作:

权重因子 会决定将有多少的注意力信息被保留下来,它初始化的值为0,是一个可学习的参数。

经过这一番注意力操作后,最终输出的已经不同于之前的,而是经过了一次在通道上的注意力机制的处理后的,更好地融合了3D backbone和2D backbone输出的两种不同的特征。

最后会再接一层3×3卷积(+BN+LeakyReLU)和一层1x1卷积。最后的1x1卷积后面不接BN和LeakyReLU,仅仅是做一个线性映射。这两部分合在一起就是YOWO的CFAM(channel fusion & attention module)模块。

也许,读者会问为什么要在通道维度上做注意力操作,而不是空间维度呢?笔者认为,这是因为YOWO之所以设计这一模块,其目的是想让两种特征能够有效地融合在一起,因此选择在通道维度上去做注意力操作。当然,我们也可以再加一个空间上的注意力操作,感兴趣的读者可以尝试一下。

2.3 检测头

YOWO的检测头就非常的简单了,仅仅是一层普通的1×1卷积,用于最终的预测,其中,是anchor box的数量,是动作类别的数量,1是边界框的置信度,4是边界框的坐标偏移量。YOWO的输出的物理含义和YOLO是一致的。可以认为,YOWO就是在YOLOv2的框架基础上,额外添加了一个3D backbone分支,以便去处理视频片段,将时序特征补充到关键帧的空间特征里,以便更准确地检测关键帧中的动作。因此,YOWO的制作正样本(label assignment)策略、损失函数也都和YOLOv2是一样。它解耦出边界框坐标的公式和YOLOv2也是一致的:

其中, 和是边界框的中心点坐标,和是grid cell的左上角坐标,和是anchor box的宽高,和是边界框的宽高。

需要额外多说一点,对于类别输出,YOWO对不同的数据集采用了不同的输出。对UCF101-24数据集,YOWO采用的是softmax,因为UCF101-24中的动作仅有一个标签。而对于AVA数据集,YOWO则采用了softmax和sigmoid的混合输出,因为AVA数据集中共有80个类别,而每个动作都有可能是多标签,仅有softmax显然是不合理的。不过,AVA这80个动作类别有个特点,那就是前14中动作类别是属于姿态类别,即站、坐、爬、摔倒等,这14个姿态通常情况下不会同时出现,或者是互斥的,所以YOWO用softmax处理这14个姿态的预测,而对于剩余的66种动类别,则不是互斥的,可能会一起出现,YOWO则使用sigmoid来处理他们。

2.4 损失函数

YOLOv2的损失函数一共包含置信度损失、类别损失,以及边界框回归损失,YOWO的损失函数与此相同,仅仅是把YOLOv2中的类别损失函数换成了focal loss,将边界框回归损失换成了SmoothL1损失,替代YOLOv2中的MSE损失。

中心点坐标回归损失:

边界框宽高回归损失:

类别损失:

置信度损失:

其中,

当YOWO在AVA数据上训练时,类别损失会做一个小改动

2.5 正样本匹配

YOWO的正样本匹配策略和YOLOv2是一样的,对于每一个groundtruth(gt),YOWO计算该gt所在的grid cell中的个预测的边界框与该gt之间的IoU,然后将IoU最大的预测框匹配给该gt,作为正样本,其余的边界框为负样本。

2.6 训练策略

优化器选用Adam优化器,其中weight decay设置为5e-4,初始学习率为1e-4;训练时的batch size为128,但采用梯度累加的策略,每次累加8个batch的梯度,然后再一起回传;在UCF101-24数据集上训练5个epoch,并分别在1、2、3和4epoch时,将学习率衰减0.5倍。使用的数据增强包括随机剪裁、随机翻转,和颜色扰动。

三、实验

3.1 消融实验

首先,YOWO验证CFAM模块的性能影响,如图10所示,其中,输入的视频片段长度为8。可以看出来,3D特征的性能是要大于2D的,这是因为3D backbone可以同时提取输入视频片段的空间特征和时间特征,但将2D和3D两种特征融合起来,效果是要大于他们各自单独的性能,仅靠3D backbone是不够充分的。这表明对于STAD任务,空间特征和时序特征都很重要。而使用CFAM,则可以显著地提升YOWO的性能。

图片
图10. CFAM的消融实验

接着,YOWO验证输入视频片段的长度的性能影响,如图11所示,将视频片段设置为16性能更好。其中,d表示采样步长,且d=1的时候更好,也就是逐帧采样。这个可能和数据集自身的帧率也有关,像AVA这种大型数据集,通常都是用d=4去采样的,而UCF101-24数据集可能本身的帧率就低,若是采样过大,反而会丢掉一些时序信息。

图片
图11. 视频片段长度的消融实验

最后,YOWO还验证了不同3D backbone对性能的影响,如图12所示,表中的GFLOPs是3D CNN本身的理论计算量,而不是整个YOWO的。可以看出来,使用轻量型的3D backbone可以显著降低计算量,但性能也会随之有所下降,这是不可避免的。

图片
图12. 不同3D backbone的消融实验

3.2 UCF101-24 & AVA 对比实验

首先是UCF101-24数据集上的对比试验,如图13所示。输入的视频片段长度为16,每帧图像的尺寸为224×224,3D backbone为3D-ResNext-101,2D backbone为YOLOv2,在UCF101-24数据集上的Frame mAP为80.4,而在加入了long-term feature bank后,性能涨到了87.3。不过,再加入long-term feature bank后,YOWO就不是因果推理模型了,因为对于每个关键帧,long-term feature bank会提供整个视频的时空特征,将未来帧的信息融入到了当前帧中。这种非因果模型也就是用于刷榜,但对于实际场景没有太大的意义。

图片
图13. YOWO在UCF101-24数据集上的对比实验

然后是AVA数据集。AVA是谷歌在2018年CVPR会议上发表的一个新benchmark,包含435个15分钟长的视频,而这15分钟时长还是在原视频基础上做过剪辑和抽帧的。视频中的每个人的动作又会有多个标签,包括14个基本姿态(站立、坐下、摔倒等)和66个动作(打电话、看着某人、听某人讲话等)。AVA是一个极具挑战的数据集,所以很多sota工作都采用的是大型3D CNN+two-stage的框架来处理该数据集,以获得高性能,但也因此这些sota工作几乎没有实时性可言,当然,也有一些工作采用3D CNN来构建one-stage工作,比如19年的WOO[9]和22年的Tuber[10],但仍没法实时运行。所以,尽管我们从图14中可以看出YOWO的性能比不上其他sota工作,但是YOWO的优势在于30+FPS的检测速度,而且只需要一个1080ti就可以完成所有的训练,这是其他工作所不具备的。整体来看,YOWO还是一个设计得比较成功的时空动作检测器。

图片 
图14. YOWO在AVA数据集上的对比实验

至此,我们讲解完了YOWO,了解了它是如何结合3D backbone和2D backbone来构建结构简单且能实时运行的时空动作检测器。下一章,我们将从代码的角度来进一步剖析YOWO框架,请读者注意,我们将使用的是由笔者复现的更好的YOWO的代码,而不是官方代码,不过,在讲解过程中,笔者会详细说明笔者复现的代码与官方代码的区别,以及哪些是从官方代码移植过来的。感兴趣的读者可以先尝试笔者在本文开头提供的源码。

敬请期待~

科普不易,还请多多支持~

四、参考文献

[1] Ji S, Xu W, Yang M, et al. 3D convolutional neural networks for human action recognition[J]. IEEE transactions on pattern analysis and machine intelligence, 2012, 35(1): 221-231.

[2] Carreira J, Zisserman A. Quo vadis, action recognition? a new model and the kinetics dataset[C]//proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2017: 6299-6308.

[3] Feichtenhofer C. X3d: Expanding architectures for efficient video recognition[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2020: 203-213.

[4] Feichtenhofer C, Fan H, Malik J, et al. Slowfast networks for video recognition[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2019: 6202-6211.

[5] Hou R, Chen C, Shah M. Tube convolutional neural network (T-CNN) for action detection in videos[C]//Proceedings of the IEEE international conference on computer vision. 2017: 5822-5831.

[6] Duarte K, Rawat Y, Shah M. Videocapsulenet: A simplified network for action detection[J]. Advances in neural information processing systems, 2018, 31.

[7] Girdhar R, Carreira J, Doersch C, et al. Video action transformer network[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2019: 244-253.

[8] Wu J, Kuang Z, Wang L, et al. Context-aware rcnn: A baseline for action detection in videos[C]//European Conference on Computer Vision. Springer, Cham, 2020: 440-456.

[9] Chen S, Sun P, Xie E, et al. Watch only once: An end-to-end video action detection framework[C]//Proceedings of the IEEE/CVF International Conference on Computer Vision. 2021: 8178-8187.

[10] Zhao J, Zhang Y, Li X, et al. TubeR: Tubelet transformer for video action detection[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2022: 13598-13607.

[11] Kalogeiton V, Weinzaepfel P, Ferrari V, et al. Action tubelet detector for spatio-temporal action localization[C]//Proceedings of the IEEE International Conference on Computer Vision. 2017: 4405-4413.

[12] Li Y, Wang Z, Wang L, et al. Actions as moving points[C]//European Conference on Computer Vision. Springer, Cham, 2020: 68-84.

[13] Kopuklu O, Kose N, Gunduz A, et al. Resource efficient 3d convolutional neural networks[C]//Proceedings of the IEEE/CVF International Conference on Computer Vision Workshops. 2019: 0-0.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多