本文最后更新于:2020年11月27日 下午

最近一周主要集中精力在CVPR2020上发表的MEGA视频目标检测方法上,

  • 认真研读了MEGA论文,做了详细的阅读笔记。
  • 运行了MEGA的demo代码和test代码,整理了相关笔记。

参考文献:Chen Y, Cao Y, Hu H, et al. Memory Enhanced Global-Local Aggregation for Video Object Detection[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2020: 10337-10346.

1.MEGA论文阅读笔记

  • 论文地址:

https://openaccess.thecvf.com/content_CVPR_2020/papers/Chen_Memory_Enhanced_Global-Local_Aggregation_for_Video_Object_Detection_CVPR_2020_paper.pdf

作者提出的Memory Enhanced Global-Local Aggregation(MEGA)首次同时考虑全局语义信息和局部定位信息。此外通过使用Long Range Memory(LRM)模块,MEGA使得关键帧能访问更多的内容。

全局语义信息:

当单帧遇到诸如运动模糊、遮挡、失焦等问题时,人们自然会想到从整个视频中查找线索。当人们不确定目标的身份时,他们将寻求从其他帧中找到与当前目标具有高度语义相似性的独特目标,并将它们分配在一起。作者将这个线索作为视频中每一帧可以参考的全局语义信息。但是当不确定目标是否存在时,语义信息将会失效。例如一只黑猫在黑夜里走,因为无法确定关键帧中实例的存在性,所以不能依赖语义信息来判断目标在哪。

局部定位信息:

如果给出临近帧,该问题将被减轻。借助由临近帧之间的差异计算出的运动信息,就可以在关键帧中定位目标。作者将这种信息来源称为局部定位信息。通常,人们主要通过这两种信息源来识别对象。

ineffective problem

先前的视频目标检测方法可以被看成是不同的近似方法,可被分为两类:局部聚合方法和全局聚合方法。但这些方法都没有同时使用局部和全局信息,作者将该问题称为ineffective problem。

insufficient problem

先前方法的另一个问题是用于聚合的帧的数量问题。指的是关键帧可以收集的信息量。此前方法仅选择20-30帧,仅持续1-2秒用于特征聚合。这种小的聚合规模,不足以近似地反映出局部影响力或全局影响力,更不用说图1(a)了。作者将用于关键帧聚合的帧的数量太少的问题称为insufficient problem。

MEGA

MEGA通过有效地聚合全局和局部信息来增强关键帧的候选框特征。MEGA是一个多阶段的结构,第一阶段MEGA解决ineffective问题,通过聚合全局和局部信息。如图1(b)上所示,可用的内容仍然十分有限。因此在第二阶段,作者引入了一个新颖的Long Range Memory(LRM)模块,使关键帧能够访问比以前任何方法更多的内容。特别是,不使用从头开始计算当前关键帧的特征,而是重用在先前帧的检测过程中获得的预先计算的特征。这些预先计算的特征存储在LRM中,并在当前帧和先前帧之间建立循环连接。注意,这些存储的特征首次用全局信息增强,这意味着当前关键帧可以获得更多局部和全局的信息。

MEGA首先将选定的全局特征聚合到局部特征,然后这些经过global增强的局部特征与LRM模块将较长的全局内容和局部信息合并到关键帧中,以更好的进行检测。

image-20201127145138884

符号定义

视频目标检测的目的是对视频中的每一帧{It}Tt=1给出检测结果。假设当前帧为Ik, Bt={bit}表示RPN在每一帧It上生成的候选框。临近帧{It}k+τt=k-τ中所有的候选框构成了 local pool:L={Bt}k+τt=k-τ。对于全局特征,随机打乱顺序排列的序列{1,…,T},得到一个打乱的索引序列S,然后依次选取Tg帧,将其所有的候选框构成global pool:image-20201127144219511。最后,引入了一种新颖的long range存储模块M,用于存储在前一帧的检测过程中产生的中间特征,以使关键帧能够利用缓存的信息,从而具有对long-term全局和局部依赖性进行建模的能力。作者的终极目标是在L,GM的帮助下,为关键帧中所有的候选框给出分类和回归的结果。

用fi表示每个框bi的语义特征,用gi表示定位特征。gi同时表示空间信息(宽度、高度、中心位置)和时间信息(帧的编号)。

关系模块:

用于挖掘框之间的关系。给出一个框的集合B={bi},目标关系模块为每个框bi,计算其与其他M个框的关系特征,作为语义特征的加权和。框bi的第m个关系特征计算公式为:

image-20201127144238991

其中WmV是一个线性变化矩阵。wij表示bi和bj之间的影响力,通过语义特征f和可能的定位特征g度量。*∈{L,N}表示定位特征是否被合并到w中,L表示合并,N表示不合并。因为定位特征在两个遥远的框之间在时间维度上是冗余的,可能会伤害整体的性能,所以作者设计了一个location-free的版本,去除关系模块,仅关注语义模块。作者的定位特征包含了时间信息,来区别不同帧对box的影响。

最终将M个关系特征与其原始特征连接,获得增强后的输出特征:

image-20201127144316936

生成增强特征后,还附加了一个非线性变换函数h(·),该函数被实现为一个全连接层,并在其后附加了ReLU。此外,可以将关系模块扩展到两个box集合之间的关系。为了方便,使用 image-20201127144345945来表示聚集所有增强的proposal特征,例如image-20201127144407231表示B中所有通过P中的边界框特征增强过的边界框。

Global-local聚合来解决ineffective问题

首先详细说明了我们如何设计网络来聚合全局和局部特征,来解决ineffective问题,这意味着分开考虑全局和局部信息。使用图2(a)中的base model来表示该结构。

首先将G中的全局特征合并至L,更新函数表示为:

image-20201127144420262

其中,Ng(·)是一个堆叠的location-free关系模块的函数,Lg表示L通过该函数进行全局增强后的版本。我们的目的是完全利用潜在的特征来增强局部特征,我们使用Ng关系模块,用堆叠的方式迭代进行关系推理,以更好的表征GL之间的关系。特别的,第k个关系模块的计算过程表示为。

image-20201127144434021

image-20201127144452536 表示等式(2)定义的location-free关系模块,image-20201127144513142表示第一个关系模块的输入。后面的关系模块用前面关系模块的输出作为输入。第Ng个关系模块输出为Lg。

在将全局特征合并到局部特征之后,我们寻求使用在局部特征之下的语义信息和位置信息来进一步增强局部特征。为实现这一目的,采用一堆Nl location-based的关系模块。

image-20201127144548968

其中Ll表示最终增强版本的local pool。将Nl的整个过程进行如下分解:第k个关系模块的计算过程与Ng类似。

image-20201127144747425

image-20201127144805931表示基于位置的关系模块。采用Lg(经过全局增强的L)作为第一个基于位置的关系模块的输入。 是输出增强过的池Ll。在最终更新完成后,Ll中属于关键帧的所有box特征将被提取出来,并通过传统的RCNN头部进行传播,得出分类和回归结果。提取后的特征表示为C

Long Range Memory用于解决insufficient 问题

如图2(a)所示,在base model中,单帧可以聚合整个Tg帧的全局特征和Tl帧的局部特,这朝着解决ineffective problem迈出了一大步,但仍未解决。该问题可以通过增加Tg和Tl至整个视频的长度来被幼稚的解决,前提是内存和算力无限大。

那么,如何能在有限的算力下解决insufficient问题呢?受[5]中循环机制的启发,作者设计了一个Long Range Memory(LRM)模块来实现这一目标。总的来说,LRM通过充分使用预计算的特征,使得base model能捕捉更长的全局和局部内容。作者将这个记忆增强过的版本称为MEGA。

2.MEGA代码运行结果及相关笔记

demo运行结果:

image-20201127144849745

image-20201127144906084

image-20201127144932144

相关函数记录:

  • 颜色更改:predictor.py line:562 compute_colors_for_labels()
  • 画边界框的函数:predictor.py line:570 overlay_boxes()
  • 给边界框打标签(类名、分数):predictor.py line:592 overlay_class_names()
  • predictor.py line:610 cv2.putText()可以更改字体、文字颜色

base 与 MEGA对比

image-20201127145002247

左边为base,在某些帧会出现丢失目标现象,MEGA的效果好很多。

image-20201127145443365

但某些情况下MEGA会将目标误检为cat,并且持续好几帧(可能是由于LRM存储了前几帧检测结果的原因)。base对每一帧都重新检测,没有先前帧的干扰。

test_net.py的程序逻辑

首先加载了checkpoints,初始化了用于验证的dataloader,之后在第116行调用Inference进行推理。inference.py中先初始化了计时器,然后调用compute_on_dataset()进行计算。

计算完成后,调用_accumulate_predictions_from_multiple_gpus()对预测结果进行累积。

test_net.py运行结果:

image-20201127145058408