论文阅读《Relation Networks for Object Detection》

物体间的关系建模对识别物体有很大帮助,但是目前来看还没有应用到深度学习领域,之前的方法都将这一步作为后处理来处理网络的输出。本文的方法与现有的目标检测方法不同之处在于:在现有方法的基础上加入了一个关系维度,即一组对象被同时处理、推理和相互影响,而不是单独识别。

受 NLP 中 Attention 模块的启发,扩展到 CV 中的目标检测任务。本文提出了一个目标关系模块(relation module),同时处理物体的 appearance(backbone 提取出的特征)和形状特征(bounding box 的四个值)来对他们的关系进行建模。该模块十分轻便,可以即插即用到现有的 CNN 网络中,提高了物体识别准确率并且提出了一种新的算法来实现 NMS。        

形状特征表征的是物体间的相对形状,因此具有了平移不变性,这也是物体识别任务中一个很重要的性质。

将二阶段目标检测模型的检测范式总结为如下四步:

  • 提取整张图像的特征。
  • 产生 region proposal。
  • 识别 proposal 内物体并回归出 bounding box(instance recognition)。
  • 消除冗余 proposal(duplicate removal)。

对于 duplicate removal,目前最好的方法就是 NMS 以及 SoftNMS,其实际上也是对 bounding box 和 scores 关系的一个简单建模。17年的 GossipNet 提出的 duplicate removal 方法是将检测出的物体作为一个整体来处理,与本文的方法有些类似(?),但其网络复杂、计算代价过大。

该模块因为具有可微和不改变输入输出数据维度的性质,所以可以作为一个基本的 block 插入到 CNN 网络中,如图1即是插入到检测范式的第三和第四步。

图1

这样做使范式第三步可实现所有目标的联合识别并提高识别精度,取代第四步中的 NMS 算法来消除冗余的 proposal。

Object Relation Module

由补充我们知道,NLP 中 Attention module 中的点积得到 Z 的是该单词在句子中的注意力得分。

Eq.(1)

本文的提出的方法中,每个物体包含一个 geometry feature(fG,bbox 的四个位置信息和一个 appearance feature(fA,即特征图 or 特征向量,范式第三步中即为256*7*7的特征图,前者是一个4维的 bbox,后者的形式根据插入到检测范式的位置而定。对于第 n 个物体,他的 relation feature 计算公式为:

这个式子与 Eq.(1) 十分相似,其中 ωmn 的公式如下:

只看 ωmn 分子分母中的 exp 函数,发现就是 Eq.(1) 中的 Softmax 计算,Eq.(1) 中是矩阵的形式,这里也是矩阵的形式(插入到范式第三步是矩阵的形式,插入到第四步是特征向量的形式,这里着重分析插入到范式第三步)。WK、WQ 和 WV 都是矩阵,相当于线性变换,还有一个作用是调整通道数。

计算 ωmn 的公式中加入了位置特征 ωGmn,除去这个位置特征不看的话,就是完成了一次 Eq.(1) 的计算,计算了各个物体的相似度。而这个位置特征的作用应该与 Transformer 中 position encoding 的作用相同,保留物体的位置信息。文中也说正是这里,计算 ωmn 的公式中加入位置特征 ωGmn 使其与 Transformer 中的做法不同。其计算公式如下:

εG 为:

与传统 Faster Rcnn 的回归任务不同,这里将前两项也加上了 log 函数,文章中给出了解释:

The first two elements are transformed using log(·) to count more on close-by objects. The intuition behind this modification is that we need to model distant objects while original bounding box regression only considers close-by objects.

Faster Rcnn Regression Task

之后将这4维的位置特征按 Transformer 中的做法操作,编码为 position encoding。

一文教你彻底理解Transformer中Positional Encoding - 知乎

如何理解Transformer论文中的positional encoding,和三角函数有什么关系? - 知乎

将编码之后的 εG 乘以一个 WG,代码中看是将其 reshape 后经过一个全连接层,再经过一个 Relu 激活,得到位置特征 ωGmn。文中有这样一段描述:

The zero trimming operation restricts relations only between objects of certain geometric relationships.

后面对位置特征 ωGmn 有一个消融实验:

none 表示没有使用位置特征 ωGmn,将计算 ωmn 公式中的 ωGmn 设为常量1。

unary 表示不将位置特征 ωGmn 加入到计算 ωmn 公式中,直接使用 Transformer 中的 position encoding 来编码位置信息得到 fG,之后再将 position encoding 与 fA 直接相加。

总的模块架构如下:

总共有 Nr 个 relation module,每个 module 对每一个物体上述计算,之后直接将其 concat 起来,按位置加到这个物体的 fA 上。


手动分割,之前写的太不清楚了。22.01.05


Relation Networks For Object Detection

将上一节讨论的模块加入到现有的目标检测网络中,backbone 都采用 ResNet-50,用 RPN 来产生 proposal,对比了 Faster Rcnn、FPN 和 DCN,这些网络都是将 RoI pooled feature 通过两个全连接层来产生最终的特征,以用来分类和回归 bounding box。上面我们提到,将本文提出的 relation module 应用到二阶段目标检测模型范式的第三和第四部分,如图1。但在这两部分中 relation module 使用方法有所不同。为了对比效果,提出了两个变体:

  • none。没有用到形状特征,其权重 \omega _{G}^{mn} 固定为常数1。
  • unary。f_{G} 采用和 f_{A} 相同的方法嵌入到高维空间中,然后加到 f_{A} 上得到新的 appearance 特征。

验证了在 COCO 数据集上的精度,80k 的训练集和 35k 验证集用来训练,5k 没有用来训练的验证集做测试(记作 minival),同时也测试了在 test-dev 上的精度。

Relation for Instance Recognition

对于从网络中输出的 n 个 proposal 的 RoI pooled feature,加入 relation module 前的流程如下图

Eq.(7)

加入 relation module 后,流程图变为

Eq.(8)

其中 r1 和 r2 表示的是 relation module 重复的次数,relation module 也需要 bounding box 输入,流程图中没有体现。其示意图如下

进行了对比实验,以原始的两个全连接层 2fc 作为 baseline,NMS 的 IoU 都设定为0.6。

但是精度的提升是来自参数的改变还是深度的增加?文中也进行了对比实验。

其中(d)是将相同的 residual block 放置到 relation module 放置的位置,(e)是将全局平均池化特征 concatenate 到分类和回归的线性层之前的特征上。

We also consider another baseline which concatenates the original pooled features with the ones from a 2× larger RoI (g), the performance is improved from 29.6 to 30.4 mAP, indicating a better way of utilizing context cues.

Relation for Duplicate Removal

范式第四部分的任务需要对物体间关系进行建模,NMS 算法需要人工选择参数使之称为次优解。

NMS 同样也是对关系进行建模:The heuristic NMS method is a simple example: the object with the highest score will erase its nearby objects (geometric relation) with inferior scores (score relation).

我们可以将 Duplicate removal 看作一个二分类问题,只有一个匹配的 proposal 看作是 correct,其余的都看作是 duplicate。该分类问题的可由下图所示网络来解决,其输入是 Eq.(7) 或 Eq.(8) 的输出,也是包含1024维的向量,分类分数 s0 和 bounding box,我们将其视作一组输入。对于每一组输入,该网络的输出也是一个二分类概率 s1,其中 1 为 correct,0 为 duplicate。最后将 s1 和 s2 相乘得到最终的分类得分。

   

对于每一组输入该网络可以分为三步来实现,第一步是将1024维的向量和 s0 结合来产生 f_{A},这里采用了 Rank feature,s0 和1024维的向量分别被 W_{f_{R}} 和 W_{f} 嵌入到128维的向量中;第二步得到的两个128维向量相加输入到 relation module(上右图)得到特征向量;最后一步将特征向量依次通过一个线性分类器 W_{s} 和 sigmoid 激活函数,来产生概率 s1。s1 与 s0 相乘,得到最终的分类概率。

Rank feature。将分类得分变为排序名次,并且用 Transformer 中的 Position Encoding 的方法将该名次嵌入到128维的向量中。

NMS 算法的一个缺点,当训练在 \eta=0.5 时,其在对比实验中产生的最高精度在mAP_{50},而不在mAP_{75} ,更大的精度需要更大的 \eta。而本文提出的方法可以根据需要自适应地学习,而不是预设参数。最好的方法是同时使用多个参数,如 0.5,0.6,0.7,0.8,0.9。相应地,线性分类器 W_{s} 就需要输出多个参数下的概率以及对应的 correct。

The training is well balanced between different cases. During inference, the multiple probabilities are simply averaged as a single output.

训练时使用交叉熵损失在最后的分类得分上,正负样本比例严重不均衡,但是交叉熵损失并没有受到影响。这是因为很多 duplicate 的 s0 很小,因此最后分类得分 s0*s1 也很小。在反向传播时对损失的贡献也小,因此使用最后分类得分相当于将少数几个 s0 值较大的 duplicate 突出出来,也即权重增大,这与 focal loss 的思想相同。对于 instance recognition loss 和 duplicate classification loss 均可以与 backbone 的 region proposal loss 和 head 的损失进行端到端的同时训练,实验证明精度会进一步增加。推理与训练过程大同小异。

将上一节 Relation for Instance Recognition 实验中 Table 2. 的(a)作为 baseline,结果如下:

When the class score s0 replaces the rank in a similar way (the score is embedded to 128-d), mAP drops to 28.3. 

同时也对比了与 NMS 与 SoftNMS 的精度:

最后一行是端到端训练的结果

文章最后进行了总结,目前还不清楚 relation module 到底学到了什么,尤其是当有多个堆叠在一起时。

补充:

Transformer 取得巨大成功的原因就是使用了 Attention 机制,NLP 中的 Attention 使用 self-attention 模块来处理输入句子中的每个词与其他词的关系。Attention 的具体作用可用下面一句话概括:

While processing a word, Attention enables the model to focus on other words in the input that are closely related to that word.

举个例子:

  1. The cat drank the milk because it was hungry.
  2. The cat drank the milk because it was sweet.

两个句子的 it 指代不同的名词,self-attention 给模型更多的信息来帮助模型识别其指代的意义:

self-attention​​​

模型为每一个单词计算出一个 attention score,如下图:

attention score

在处理单词 it 时,第一个 score 突出显示了 cat,而第二个 score 突出显示了 hungry。所以当它解码 it 这个词时,会把与 cat 和 hungry 有关联的词的“距离”设为更近。

Transformer​​​​​

如上图,Transformer 一共在三处使用了注意力模块,Encoder 和 Decoder 中的 Self-Attention(也叫做 Multi-head Self-Attention)模块以及 Decoder 中的 Encoder-Decoder Attention(也叫做 Multi-head Attention)模块。这些模块的输入都包含三个参数:Query,Key 和 Value。

所谓 Multi-head,就是用 Query,Key 和 Value 通过参数不同的 Linear 层来产生不同的特征向量。

Encoder 和 Decoder 中的 Self-Attention 都含有类似的结构:

Encoder 和 Decoder 中的 Self-Attention

而 Decoder 中的 Encoder-Decoder Attention 结构如下:

Decoder 中的 Encoder-Decoder Attention

每一个注意力模块都会计算出一个 attention score:

具体来说:

  • 这些注意力模块的输入都包含三个参数:Query,Key 和 Value。

这三个参数都包含相同的结构,即句子中的每个单词都用一个表征向量来表示,这三个参数的计算方法是将嵌入序列分别输入三个 Linear 层,来得到这三个参数。

这里的嵌入序列也包含了位置信息,源序列通过 Embedding 层和位置编码层(Position Encoding layer),为序列中的每个词生成嵌入向量。

对于 Encoder 和 Decoder 中的 Self-Attention 模块,这些表征向量每通过一个注意力模块都将该注意力模块计算出的 attention score 加到这个表征向量里。Encoder 中的 Self-Attention 模块的输出作为 Encoder-Decoder Attention 模块的 Value 和 Key,而 Decoder 中的 Self-Attention 模块的输出作为 Encoder-Decoder Attention 模块的 Query。

而 Decoder 中的 Encoder-Decoder Attention 模块接收了输入句子的表征和输出句子的表征,来计算出输出句子中单词的 attention score,并加到输出句子每个单词的表征中。

  • 以一个翻译问题为例,观察 Q,K 和 V 的作用过程(搬)

假设我们正在解决英语到西班牙语的翻译问题,其中一个样本源序列“The ball is blue”。目标序列是“La bola es azul”。

源序列首先生成嵌入序列,嵌入序列将通过三个线性层,产生 Q,K 和 V。

图片

我们试图从源序列中的单个单词开始,关注注意力模块内部发生的事情。这将帮助我们清楚地看到源和目标序列中的每个单词如何与源和目标序列中的其他单词交互。

因此我们专注于对每个单词执行哪些操作,以及每个向量如何映射到原始的输入单词。如果一些细节与每个单词的去向没有直接关系,我们则不需要关注他们,例如矩阵形状、算术计算的细节、多头注意力等。同时为了简化解释和可视化过程,忽略嵌入维度并只跟踪对应于每个单词的行。

图片

由公式可知,Attention 模块中的第一步是在 Query (Q) 矩阵和 Key (K) 矩阵的转置之间进行矩阵乘法(即点积)。

图片

生成一个中间矩阵(我们称之为“因子(Factor)”矩阵),其中每个单元格是两个词之间的矩阵乘法。

图片
Q 和 K 的点积

下一步,是在这个中间矩阵和 Value(V)矩阵之间进行矩阵乘法,来计算注意力模块输出的注意力分数。这里我们可以看到第四行对应的是第四个 Query 词矩阵乘以所有其他 Key 和 Value 词,这样就生成了注意力模块输出的注意力得分向量(Z)。

图片
Factor 和 V 的点积

可以这样思考这个输出分数:对于每个单词,它是来自 V 矩阵的每个单词的编码值,由“factor”矩阵加权。因子(factor)矩阵是该特定单词的 Query 值与所有单词的 Key 值的点积。

图片

查询(Query)词可以解释为我们正在计算注意力的词。关键(Key)和价值(Value)词是我们关注的词,即该词与查询(Query)词的相关程度如何。

图片

例如,对于句子“The ball is blue”,单词“blue”所在的行将包含“blue”与其他单词的注意力得分。这里,“blue”是查询(Query)词,其他词是“Key/Value”。

我们已经看到,注意力得分通过计算点积然后将它们相加来捕捉特定单词和句子中每个其他单词之间的交互行为。但是矩阵乘法是如何帮助 Transformer 确定两个词之间的相关性呢?查询(Query)、键(Key) 和 价值(Value)实际上是具有 Embedding 维度的向量,让我们重点看看这些向量之间的矩阵乘法是如何计算的。

图片

当我们在两个向量之间进行点积,我们将成对的数字相乘,然后将它们相加。

  1. 如果两个成对的数字(例如上面的“a”和“d”)都是正数或都是负数,那么乘积将为正数。乘积会使得最终总和增加。

  2. 如果其中一个数为正数,另一个数为负数,则乘积将为负数。乘积会使得最终总和减少。

  3. 如果乘积为正,则两个数字越大,它们使得最终总和的增长就越大。

这意味着如果两个向量中相应数字的正负号一致,则最终和会更大。由此我们可以知道点积这个概念也适用于注意力得分,如果两个词的向量越一致,则注意力得分会越高。

我们希望句子中两个相互关联的单词的注意力得分较高,两个互不相关的词的得分较低。

例如,对于句子“The black cat drink the milk”,“milk”这个词与“drank”的相关性很强,但可能与“cat”的相关性略低,甚至与“black”无关。我们希望“milk”和“drank”产生较高的注意力分数,“milk”和“cat”产生的分数略低,而“milk”和“black”产生的分数可以忽略不计。这是我们希望模型通过学习而产生的输出。

为此,“milk”和“drank”的词向量必须一致。“milk”和“cat”的向量会有些不同。对于“milk”和“black”向量,它们则非常不同。

那么Transformer如何确定哪组权重会给它带来最好的结果?

词向量是基于词嵌入和线性层的权重生成的。因此,Transformer 可以学习这些嵌入、线性权重等信息生成上述要求的词向量。

换句话说,它将以以下一种方式学习这些嵌入和权重:如果句子中的两个词彼此相关,那么它们的词向量将对齐或一致,从而产生更高的注意力得分。对于彼此不相关的词,词向量不会对齐,并且会产生较低的注意力得分。

因此,“milk”和“drank”的嵌入向量将非常一致并产生高注意力得分。对于“milk”和“cat”,它们的向量会略有不同,所以注意力得分略有下降,而“milk”和“black”的注意力得分最低。

以上就是注意力模块本质原理。

  • 平移不变性

在欧几里得几何中,平移是一种几何变换,表示把一幅图像或一个空间中的每一个点在相同方向移动相同距离。比如对图像分类任务来说,图像中的目标不管被移动到图片的哪个位置,得到的结果(标签)应该是相同的,这就是卷积神经网络中的平移不变性。

卷积+最大池化约等于平移不变性。即使图像被平移,卷积保证仍然能检测到它的特征,池化则尽可能地保持一致的表达。

  • 尺度不变性

人类在识别一个物体时,不管这个物体或远或近,都能对它进行正确的辨认,这就是所谓的尺度不变性。

关系网络(Relation Network)是一种深度学习模型,用于处理结构化数据,如图像、点云、序列等。它的核心思想是使用神经网络来自动学习输入数据之间的关系,从而更好地理解和处理这些数据。 以下是一个关系网络的代码示例,用于图像分类任务: ```python import torch import torch.nn as nn import torch.nn.functional as F class RelationNetwork(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(RelationNetwork, self).__init__() self.layer1 = nn.Sequential( nn.Conv2d(input_size, hidden_size, kernel_size=3, padding=1), nn.BatchNorm2d(hidden_size), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) ) self.layer2 = nn.Sequential( nn.Conv2d(hidden_size, hidden_size, kernel_size=3, padding=1), nn.BatchNorm2d(hidden_size), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) ) self.fc1 = nn.Linear(hidden_size * 4 * 4, hidden_size) self.fc2 = nn.Linear(hidden_size, output_size) def forward(self, x): x = self.layer1(x) x = self.layer2(x) x = x.view(x.size(0), -1) x = F.relu(self.fc1(x)) x = self.fc2(x) return x ``` 这个关系网络使用了两个卷积层和两个全连接层,其中每个卷积层和全连接层之间都有一个BN和ReLU层。在前向传播过程中,输入图像首先通过两个卷积层和池化层进行特征提取,然后通过两个全连接层进行分类。这个网络可以用于图像分类任务,其中输入是一个大小为(batch_size,input_size,H,W)的图像,输出是一个大小为(batch_size,output_size)的标签。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值