人是利用图像中的context来识别图像中的内容。在图像的目标检测任务中,一种很理所当然的改进方法就是利用图像中的context来推测图像中的对象。该论文提出了两种context类型,分别是image-level context和instance-level context。该论文显式地利用instance-level context,使用Spatial Memory Network (SMN)对图像中不同对象之间的关系进行建模,类似于RNN中的memory cell记录已经检测到对象的bounding box,以便更好地检测图像中其他对象。
Image-level context 图像的整体环境/内容可以提示图像应该有那些对象,而不该有那些对象。比如在海面上可能会有轮船,而不应该有汽车。在天空中可能有鸟在飞行,而不应该出现牛羊。这种全图内容推理过程应该已经隐式地融入到深度卷积网络中,在深网络层中,每个神经元的感受野非常大,可以包含image-level context,深度卷积网络根据这些内容预测对象的位置和类别。
Instance-level context 对象和对象之间的关系是目标检测推理过程的重要线索。看下图,一只羊的附近很可能还有另外一只羊,在蛋糕上的“马”不是真的马。利用Instance-level context来推理,把true positive的置信度拉高,把false positive的置信度减低。目标检测的instance-level推理必须处理不同类、位置、比例、宽高比等的边框之间的关系,这使得instance-level推理具有更大的挑战和难度。
传统的RCNN几乎没有使用context的信息,作者认为特别是在NMS的时候,暴力去除一些候选框不是一个好主意。作者提出了SMN来获取instance-level context,当网络检测到某个对象时,记住它,然后在下次迭代的时候作为先验知识帮助下一次检测得到之前漏测的目标。SMN没有NMS的post处理过程,作者说SMN在训练过程会学到NMS去掉重复候选框的功能。
作者首先用数学公式说明一下网络结构的合理性。给定一幅图像 I \mathcal{I} I,检测出所有的对象 O = [ O 1 , O 2 , ⋯   , O N ] O=[O_1, O_2, \cdots, O_N] O=[O1,O2,⋯,ON],其中 N N N表示图像中有N个对象。网络模型的训练目标是最大化似然函数
(1) arg max M L = log P ( O 1 : N ∣ M , I ) = ∑ n = 1 : N P ( O n ∣ O 0 : n − 1 , M , I ) \begin{aligned} \underset{\mathcal{M}}{\arg \max} \mathcal{L} & = \log \mathbb{P} (O_{1:N}|\mathcal{M}, \mathcal{I}) \\ & = \sum_{n=1:N}\mathbb{P} (O_{n}|\mathcal{O}_{0:n-1},\mathcal{M}, \mathcal{I}) \end{aligned} \tag{1} MargmaxL=logP(O1:N∣M,I)=n=1:N∑P(On∣O0:n−1,M,I)(1)
对于region-based目标检测器,公式(1)近似为
arg max M L ≈ ∑ n = 1 : N log P ( O n ∣ M , I ) \underset{\mathcal{M}}{\arg \max} \mathcal{L} \approx \sum_{n=1:N} \log \mathbb{P}(O_n | \mathcal{M}, \mathcal{I}) MargmaxL≈n=1:N∑logP(On∣M,I)
在SMN中,作者引入了记忆变量 S n − 1 \mathcal{S}_{n-1} Sn−1,当一个对象被检测到时,更新记忆变量,公式(1)的近似为
arg max M , S L ≈ ∑ n = 1 : N log P ( O n ∣ S n − 1 , M , I ) \underset{\mathcal{M}, \mathcal{S}}{\arg \max} \mathcal{L} \approx \sum_{n=1:N} \log \mathbb{P}(O_n | \mathcal{S}_{n-1}, \mathcal{M}, \mathcal{I}) M,SargmaxL≈n=1:N∑logP(On∣Sn−1,M,I)
这样,目标检测的概率不仅受到模型 M \mathcal{M} M和图像 I \mathcal{I} I的约束,还受到记忆变量中Instance-level context的影响。
先看SMN的整体结构,如下图所示
灰色部分是Faster RCNN的目标检测过程。当检测到新的对象时,Memory中相应位置的cell使用从对象region提取的特征来更新。一个Context model使用memory的空间和其他信息,其输出改进RPN和region分类的表现。下文将详细介绍SMN的各个部分。
不同与RNN的Memory cell,SMN使用2维的Memory cell,从而可以使用卷积操作,保留空间信息。参照RCNN的conv5_3层是原图大小的 1 / 16 1/16 1/16,Memory的大小也是图像大小的 1 / 16 1/16 1/16。Memory的channels数是256。
Memory需要包含对象的空间信息。SMN从conv5_3中提取出新检测出来的对象的region proposal的feature map,并且crop_and_resize成 14 × 14 14\times14 14×14。Memory也需要其他信息,SMN使用新对象的检测分数。因为新对象的检测分数对于区分同一个位置的两个对象(比如骑着马的人)很有帮助。SMN把fc8的SoftMax分数拼在提取出来的featue map的每个位置之后,然后,对象每个位置的特征向量进行两次 1 × 1 1\times1 1×1卷积,channel数为512。这样,得到最终的Input Features。整个过程如下图所示
从原来的Memory S n − 1 S_{n-1} Sn−1的对应proposal位置上crop_and_resize成 14 × 14 14\times14 14×14的feature maps。把这个feature map和Input Features传入GRU网络中,得到新的Memory cell。新的Memory cell经过crop_and_resize的逆操作,放回 S n S_{n} Sn中。
Memory需要经Context model变成m-conv5。Context model有5个全卷积层,channel数是256,padding使得m-conv5和conv5_3同样大小。
m-conv5和conv5_3一样经过RPN和ROI pooling,还有后面的heads,两条分支在最后相交,如下图所示
右侧是Memeory分支的head,把原来的fc7和memory的m-fc7合起来,经两次FC,最后用于分类和box回归。在检测这个循环过程,第一次循环是不使用Memory augmented scores,因为一开始memory是空的,可以会损害原来RCNN的检测精度。
作者在Fuse阶段遇到训练问题。首先,作者尝试下图的a结构,结果训练失败。然后,作者加了个跳跃链接,如下图的b,发现没什么作用。通过跟踪训练过程,作者发现问题所在。原来的分支提供的是perception信号,S分支提供的是推理信号,会阻止perception信号,这两种矛盾信号影响网络的训练。(个人理解就是两种不同的信号的梯度信息相互抵消,梯度消失)作者的解决方法就是停止左侧的梯度传播,如下图的c。(有时候不是idea不行,而是有些问题不会解决)