Few-shot Object Detection via Feature Reweighting
提出了一种检测新颖类别的小样本模型,该新颖类别仅包含少数数据。充分利用基类(base classes)中有标签数据,使用一个特征提取模块和一个 reweighting 模块在一个一阶段检测网络中,来快速适应以达到实现新颖类别检测的目的。
元特征提取模块利用大量有标签数据提取那些具有通用性的,可以用来辅助检测新类别的元特征。从具有足够样本的基类中提取元特征来检测新的对象类。
reweighting 模块将新颖类别中的少量 support set 转换成一个全局向量,这个全局向量是元特征中对检测这些新颖类别物体非常重要或者十分相关的特征,实现将元特征的知识迁移到新类别。利用这个模块,可以激发一些用于检测新颖目标的元特征,从而辅助检测。
具体来说,给定一张 query image 和一些同类别的 support image,用训练好的特征提取模块提取 query 的元特征。reweighting 模块学习 support 中每个物体类别的全局特征,得到每个类别的 reweighting vector。再用这些 vector 通过调整对应的系数来调整 query 的元特征的分布,这样 query 的元特征融合了 support 里的信息,更加适合用来实现新颖类别的检测,这么多的 reweighting vector 使得 query image 里的那些对识别新物体重要并且贡献大的元特征被更好地利用起来。也可以理解为 reweighting vector 对不同的类别产生不同的激活系数,来调整 query 通过特征提取模块得到的元特征。
本文提出的模型是端到端的训练模型,该模型分为两个阶段进行训练。第一个阶段先学习特征提取模块提取元特征的能力和 reweighting 模块,第二阶段再用新颖类别的数据对检测模型(?)进行微调。精心设计了一个损失函数来解决无关类别的问题。
具体实现
问题定义
训练时有两类数据,基类和新颖类(novel classes),基类中包含大量有标签数据,而新颖类则很少。希望实现的效果是在测试阶段给定基类和新颖类数据通过迁移基类知识的方法,实现对新颖类的小样本检测。这个定义十分贴近实际,因为我们总希望在 ImageNet、MS COCO 上预训练的模型能在新的数据集上能有很强的泛化能力,这个新的数据集往往数据量很少。
模型结构
如上图,包含一个元特征提取模块(D,采用 YOLOv2 的 backbone:DarkNet-19)和一个 reweighting 模块(M)以及一个一阶段检测网络,这里采用 YOLOv2(即图中的 Prediction Layer,P)。为了让 M 获取到 support image 中的每一个目标对象以及对应的类别,将 image 增加一个 Mask 通道,该通道是标注的二值图(图中所示),这样通道就变为(R,G,B,Mask),每一张 support image 只选取一个目标对象。
对于每一张 query image(I),输入到 D 中得到其元特征 F = D( i )。这里输出的是模型的倒数第二层(21层),实验也证明了将该层的特征最为元特征模型的精度最高:
对于 support image 和其标注(Ii,Mi),输入到 M 中得到不同类别新颖物体的全局表征,wi = M(Ii,Mi)。它将负责重新加权元特征,并突出显示更重要的特征以检测第 i 类的目标对象。
采用通道域相乘,用1*1的 depth-wise 卷积实现。之后将 Fi 输入到 P 中,得到输出(YOLO的输出)。
训练策略
分为两阶段训练,第一阶段用基类同时训练三个模块,动机是该模型需要学习通过参考一个好的 reweighting vector 来目标对象。对于每一个新颖类别检测任务 Tj,其数据集中的 Support(Sj)和 Query(Qj)均来自基类,分别对应:
Sj 中的 N 张图片及对应标注是从基类中的 N 个类中随机抽取出来,Qj 是基类中另一类的标注数据,用来计算损失。其损失函数:
对应各个模块的参数,Ldet 是一个检测损失函数,第一阶段的训练一共迭代了80000次。
第二阶段是用基类和新颖数据微调模型,如果新颖类含有 k 个有标签的 bounding box,那么从基类中选的每一类也应包含 k 个有标签的 bounding box。训练策略与一阶段一样,只是迭代次数更少。
在经过两阶段的训练过后,本文提出的检测模型在推理阶段可以将 reweighting 模块去掉,不再需要 support 输入。而是将输入的 k 个样本经过模型处理后取平均,得到的表征作为输入样本的 reweighting vector。
Ldet 检测损失函数
模型中包含对类别预测的输出,看起来似乎应该使用交叉熵损失函数。但是实验发现这个损失函数使得模型容易输出冗余的检测结果(例如,检测火车作为公共汽车和汽车)。这是因为训练时的正样本太少,然而交叉熵损失函数努力产生平衡的 positive 和 negative 预测。本文的解决方法是再加一个 softmax 层,这样第 i 类的分类得分就变为
对应的交叉熵损失函数变为
1(·, i) 表示 anchor 是否输入类别 i。bounding box 和 objectiveness regression 的损失依然采用 YOLOv2 的损失函数,同时为了均衡正负样本,训练时随机丢弃一些负样本的 objectiveness 损失。实验证明了使用损失函数模型的精度最高:
至此,总的损失函数 Ldet 即为 Lc 以及 YOLOv2 内的 Lbbx 和 Lobj。
对照实验
数据集采用 PASCAL VOC 和 MS COCO,三个 baseline 均采用 YOLOv2,其训练策略分别为:
- YOLO-joint。基类和新颖类里的数据都拿来进行训练。
- YOLO-ft。与本文模型的第一阶段训练方法一样,第二阶段与本文模型的第二阶段微调的迭代次数相同。
- YOLO-ft-full。与本文模型的第一阶段训练方法一样,第二阶段与本文模型的第二阶段微调的迭代次数不同,而是训练到完全收敛。实验得出的迭代次数为25000次,而本文模型仅迭代了1200次。
还有两个 baseline 采用 Low-Shot Transfer Detector(LSTD,《Lstd: A low-shot transfer detector for object detection》),为了公平将其特征提取网络也换为 YOLOv2,其训练策略分别为:
- LSTD(YOLO)。与本文模型的迭代次数相同。
- LSTD(YOLO)-full。与本文模型的迭代次数不同,而是训练到完全收敛。
PASCAL VOC 的结果
MS COCO 的结果
10-shot 和 30-shot 的结果。
迭代次数
可以看到本文提出的模型只用很少的迭代次数就完成了收敛。
附加
文章贴出了一张1024维的 reweighting vector 的图,每一行是一个物体类别,每一列是一个特征。
可以看到这些物体近乎一半的特征都是一样的(即其中一列的颜色几乎是不变的),这部分特征是跨类别共享的。Table.4 中后两列的数据也印证了这个观点,仅使用网络提取出的一半的特征并不会使模型性能受到很大影响。
同样下图绘制了由每个 support imput 产生的 reweighting vector,以及它们对每个类的均值。我们观察到,不仅相同类的向量倾向于形成簇,而且视觉上相似类的向量也倾向于接近。