基于Attention-RPN和Multi-Relation Detector的少样本目标检测

2022-09-02 13:32:04 浏览数 (1)

少样本目标检测任务目的:给定support images,在query image找到所有与support images中种类相同的物体,如下图。

左上角和右上角的叫做support image, 中间大图叫做query image。

本文主要贡献:

  1. 提出了一个新的适合于few-shot目标检测的数据集FSOD,这个数据集能够提高少样本目标检测效果,本文能够取得好效果也离不开这个数据集的功劳。
  2. 提出了一种新的few-shot目标检测算法,该算法不需要fine-tune,可以直接对未知类别进行少样本目标检测,例如假设训练数据集中没有头盔,该算法也能够对头盔进行目标检测,如上图。

首先介绍的是FSOD数据集。

FSOD: A Highly-Diverse Few-Shot Object Detection Dataset

主要是混合ImageNetOpen Image两个数据集,进行了标签的统一工作,并划分了训练集和测试集,数据集详情如图。

构造过程:

  1. 统一标签,比如在两个数据集中,分别有ice bear和polar bear,但这两个类别完全就是同一种类,因此在这里将类似的同语意标签进行合并。
  2. 移除面积小于图片尺寸0.05%的框。
  3. 划分训练集测试集,并且保证不会出现标签泄露的情况。具体做法如下:首先选取MS COCO数据集中的标签作为训练标签,因为很多情况下需要预训练网络,而这些预训练网络往往是在MS COCO中训练的;之后选取与COCO数据集差距最大的200个种类作为测试集;最后将剩下的所有种类加入到训练集中。

接下来重点介绍本文提出的算法,本文的总体框架以Faster R-CNN为基础,模型主要创新点在于提出一个新的RPN结构Attention-RPN和detector头网络Multi-Relation Detector,同时还提出了一种新的训练策略Two-way Contrastive Training Strategy。下图为整体网络结构图。

我会按顺序介绍介绍上述三点创新点,绝对通俗易懂。

Attention-Based Region Proposal Network

首先我们谈一谈原始的RPN(对这块知识不了解的同学请复习一下Faster R-CNN),原始的RPN主要用于对anchor的前景背景进行分类,并不区分anchor的具体种类,因此,如果不引入support image的信息,那么RPN会对所有的前景anchor给出高置信度,这样有两个坏处:

第一,众所周知,在训练阶段,RPN会随机选取一定数量的正负样本ROI(Region of Proposal)送入下一阶段进行分类,如果对所有前景都给出高置信度,那么送入下一阶段的roi会包含许多与support image无关的类别,极端一点的情况甚至可能没有support image种类的ROI,那么后续的网络害怎么训练???

第二,在测试阶段的RPN会选取高于一定阈值的ROI送入下一阶段进行分类和回归,同样这时候也会送入一堆无关support image种类的ROI,关键这玩意又没用又浪费算力,这不是为难我后续的网络嘛。你说原来RPN网络这么设计是为了提高召回率,因为你也不知道要检测啥类别物体,我干脆都给你整出来,但现在我都知道你要找啥,还给你一股脑扔过去,那就有点问题了。

举个例子:训练阶段,RPN会对anchor进行分类以及回归,之后以正样本:负样本=1:3的比例随机选取512个ROI(注意anchor位移之后并被选中进入下一阶段的情况下才叫做ROI)。 我们具体以图1的support image和query image为例,我们所要查询的物体只是头盔,但是在query image中,以原始RPN的德行,它会把头盔、人和车都当做前景,这时候我们极端一点,假设本次RPN选取的128个正样本ROI,全是跟人和车有关,那么后续的网络根本接触不到马的信息,那还学个锤子。

因此作者提出了这个模块,最主要的目的就是提纯,让后续网络接收到的ROI更加纯净,也就是说尽可能的与support image种类有关。

那么怎么做,如下图。

在了解这个模块之前,我推荐各位首先了解一下Siamese-fc,这是将siamese结构用于目标追踪的算法,并且目前在目标追踪领域也算是占据非常重要的地位。在了解之后再来看这个结构就能一目了然,网上有许多关于Siamese-fc的博客,我主要简单说一下核心思想,很简单,就是把support image想象成一个巨大的卷积核,在query image上进行卷积,那么很容易就能想到,在query image上与support image长得像的区域,激活值就会很高,这样就很容易找到query image上的高度疑似区域。同样,这里也是采取了这样一个思想,并且采用了SiamRPN 中的depth-wise思想以及将X这个大卷积核的大小变为1(这个1是作者做实验得出的),反正不要太纠结,你只需要把这一步当成用一个大卷积核X在Y上做depth-wise卷积就完事了。

得到attention feature map G之后接一个正常的3X3卷积,有点类似于Separable Convolution(误??一般的separable convolution先depth-wise再channel-wise,只不过一般的channel wise卷积核大小为1x1),不用纠结于这个细节。

总而言之,这部分做的工作就是提纯,让X这个大卷积核在Y上卷积,找出高响应区域,这些高响应区域往往对应着support image种类的ROI,这样可以提高后续分类网络的效率。现在我们可以进入下一阶段

Multi-Relation Detector

在R-CNN网络中,我们知道RPN选取的ROI经过roi-pooling操作,会得到固定大小的特征图,这些特征图会被送入到头网络进行具体种类的精细分类以及回归。在本文中,我们前一步修改的rpn已经产生了进行提纯后roi,所以我们希望这一部分能够对那些roi进一步提纯,也就是再进一步从这些roi中选出与support image种类一致的预测,这不就是二阶段检测网络的一大好处嘛,用第二阶段来强化第一阶段的结果。因此记住这一模块设计的目的:进一步提纯,或者说细提纯,而前一步对应的也就是粗提纯

该模块结构如下图所示,想必大家看了肯定很困惑,这啥玩意?不用紧张,我第一眼看也不知道这是啥玩意,下面就来介绍一下该部分的具体实现以及意义。

我们看之前的整体网络结构图可以发现,最后的Multi-Relation Detector的输入是两部分的roi-pooling得到的特征图,分别来自support image和query image,为了更好的提纯,我们肯定需要计算support image中的特征与query image中的特征的相似性,然后留下相似性高的roi区域,剔除相似性低的roi区域,这不就轻松的完成了提纯的工作嘛,那么怎么计算呢?成了,这就是本模块的设计理念,计算相似性

本模块有三个结构,并行计算相似度,也就是三个结构分别会对query image中每一个ROI计算出一个相似度,这时候每一个ROI区域就有三个置信度,将三个置信度结合起来,作者没说怎么结合,我估计就是简单的相加取平均,就得到了这个ROI最终的置信度。这时候我们就可以通过阈值大法,留下置信度阈值之上的框从而得到最终的预测结果。

接下来我会一个个介绍这三部分的具体实现。

Global Relation:用于学习我们先假设送过来的ROI特征图大小固定为7x7xC,C是通道数。这时候我们有两个ROI特征图,一个叫S来自support,一个叫Q来自query(当然query中可能有多个roi特征图,我们这里只以一个为例)。我们首先将这两个特征图concatenate,这时候就变成了7x7x2C,在经过一次全局平均池化,变成1x1x2C,相当于获取了全局信息。这时候就可以通过一系列全连接操作输出得到一个数值(从2C降维到1),该数值就是两ROI特征图相似性。

Local Relation: 先对两个ROI特征图分别用weight-share的1x1卷积进行channel-wise操作,然后再进行类似于Attention RPN的操作,如Fig.5所示,区别在于support image的ROI特征图不需要全局池化到1x1,而是直接以7x7的大小作为一个卷积核在query image的ROI特征图上进行channel-wise卷积,变成1x1xC,最后同样使用fc层得到预测相似度。

Patch Relation:我们首先将两个ROI特征图进行concatenate,变成7x7x2C,然后经过一系列结构如下图所示。注意图中的卷积结构后面都会跟一个RELU用来获得非线性,并且pooling和卷积结构都是stride=1以及padding=0,这样在经过这些操作之后,ROI特征图的大小会变为1x1x2C,这时候后面接一个全连接层用来获得相似度,除了相似度之外,还并行接了一个全连接层,作者说是产生bounding box predictions,我估计就是回归值,因为毕竟头网络会对ROI进行第二次回归。

同时作者还对这三个Relation Detector做了消融实验,结果如下。可以看出不同的Relation Detector结果会有较大的差异,但是三者结合起来,效果是最好。

这时候,相信各位对整体的模型有了一个了解,下面介绍一下训练策略。

Two-way Contrastive Training Strategy

在说训练策略之前,首先要提一下K-way N-shot,意思是说support images有K个种类,每个种类有N个实例。下面结合具体的例子解释一下。

在本文中,作者首先说,如果按照常规的思路,训练的时候网络需要输入两张图片,分别是query image和support image,而且需要保证query image中出现support image中的物体种类。

补充一点:如何构造support image呢?首先根据要查询的物体找到其对应的gt框,这时候并不是直接crop gt框内的内容,而是在gt框外面额外扩充16个像素(上下左右四个方向),并且还要进行0值padding,为什么要进行padding呢,原因很简单,因为我们最终需要保证输入的support image是一个正方形图片,在本文中是320X320,如果你需要查询的物体外形是一个长方形,那么直接crop之后resize到正方形,会造成形状形变,为了保证物体形状不变,所以需要使用0值填充,将刚才选定的gt 16个像素的区域根据长边填充到正方形,再进行resize,这样物体形状就不会变啦。

回到刚才的话题,这时候我们有了一张support 图片,因为只有一个查询物体,同样也只有一个种类,那么我们称之为1-way 1-shot。但是作者觉得,你训练的时候只提供一个support image,确实,网络经过这样的训练能够很好的在query image中找到要support image中的物体,但是,你也就召回率高点,你准确率呢?比如我需要查询的物体是马,你确实把马都给找到了,但你还给我找了一些羊是几个意思。所以作者想,不行,不能只给一个种类的support image给网络训练,我们还需要引入额外的support image,并且这个额外的support image中的物体种类还不能和之前的一样,比如再提供一张羊的图片作为训练数据,这个羊样本需要作为负样本,而马对应的则是正样本,这样可以提高网络的辨别能力。

这时候我们把马对应的support image叫做positive support,把羊对应的叫做negative support,如下图所示。现在我们的问题就变成了2-way, 1-shot。也就是本段的标题,Two-way Contrastive Training Strategy。那么这种情况我们怎么训练呢。这个问题很好。对于K-way 的training过程,作者的做法是对于每一个种类,都有专属于自己的支路,也就是专属的Attention RPN和Multi-Relation Detector,当然权重肯定是共享的,不然你支路学了也每没意义啊。这种策略也很好理解,对于positive support支路,网络就玩命的让他高召回,而对与negative support支路,网络就玩命的提高自己的辨别能力。

这里有一个细节,由于RPN的目的是选取ROI送入下一阶段,那么怎么选,选哪些ROI到下一阶段就非常有考究。如果不加以限定,那么很有可能产生大量的背景ROI(注意这里的前景背景roi不是传统意义上的前景,而是说将与positive support image中种类对应的ROI叫做前景,其他的全部叫做背景,比如上图中的人就是背景,而马是前景),尤其在这种2-way训练方法中,这种情况肯定会更加明显,这样肯定是不利于网络的训练的。因此作者这里人为限定了采样策略(就像在Faster R-CNN中一样,也是按照一定比例选取正负ROI送到下一阶段学习,否则负样本框会占据主导地位),在这里,我们首先定义以下几种配对的情况:

(1)前景ROI和positive support image(如上图中第一行)

(2)背景ROI和positive support image(如上图中第二行)

(3)ROI和negative support image(如上图中第三行第四行)

本文以1:2:1的固定比例对上述三种配对情况进行ROI采样,具体做法: 首先选取所有的(1)类型的ROI,假设有N个,这时候再选取top 2N的(2)类型ROI,同理,最后选取top N的(3)类型ROI,这里的排序规则是根据他们matching score,也就是这个框在RPN阶段对应的置信度。

这样很明显带来两个好处:

  1. 下一阶段网络训练的时候样本平衡,不会让背景ROI占据绝对主导地位
  2. 网络同时引入positive和negative support image,即能准确找到positive support image中的物体,也能与其他类别物体区别开。

作者通过实验发现这种做法能明显提高网络效果,那么既然多way能够提高效果,那么多shot呢。

我们首先了解一下多shot的实现,对于每个种类,如果同时输入N张support image,那么就是N-shot,作者的处理方法很简单,就是每张图片经过weight-share network之后都有一个特征图,简单的将这N张特征图相加取平均,之后就按照之前的1-shot套路走就完事了。下图是作者的k-way n-shot实验结果图,可以看过影响还是蛮大的。

总结:

  1. 提出了一个包含1000类别的少样本目标检测数据集FSOD
  2. 提出了一个新的少样本目标检测算法,并且该算法不需要fine-tune,可以直接用于未知类别。

0 人点赞