开放词汇目标检测系列论文(1)--ViLD
1、论文简介
该论文题目是“Open-vocabulary object detection via vision and language knowledge distillation”,发表于ICLR 2022,发表单位是谷歌和英伟达。论文主要是基于知识蒸馏的方式,将CLIP大模型的视觉和文本特征,蒸馏至Mask R-CNN方法中。
这篇博客,我们将用大白话的方式,去讲明白作者的核心思想,对于一些实验细节和方法细节,还请大家去看原文。
2、论文动机
2.1 之前的深度学习目标检测
目标检测是视觉里面的一个非常重要的task,出现了RCNN,Fast RCNN,DETR等为代表的一系列方法。这些方法有个共同点,就是只能检测训练数据集中出现的类别。如果想检测的类别,没有出现在训练数据集中,则会失败。
随着视觉-文本大模型的出现,学者们就在想,能不能用这些大模型的通用知识,使得目标检测也能够具备很强的通用性,可以检测一些没有被训练的类别。这个就是我们这边论文想做的开放词汇目标检测。
2.2 常规Open-vocabulary object detection方法
最为简单的方法,则是我先用一个检测器获得很多的proposal。然后,对于每个proposal,采用CLIP视觉网络去编码特征。然后,在对于输入的text,也采用CLIP去编码特征。将视觉特征和文本特征进行匹配,如果匹配上了,则认为这个proposal是这个分类。
这种思路非常的简单,也很好理解。但是存在几大问题:
第一:计算量大,对于每个proposal,我都要用一个很大的CLIP去提取视觉特征,速度必然很慢;
第二:整个过程不是端到端的,CLIP和前面的proposal提取网络在梯度上是断开的;
第三:proposal由于是在闭集数据集上训练的,在检测的时候,容易漏掉没有见过的目标。
作者为了解决速度问题,提出将CLIP的通用特征编码能力蒸馏到目标检测网络中。这也是这篇论文的核心motivation。
3、论文做法
为了做蒸馏,论文提出了蒸馏方式,分别是ViLD-text和ViLD-image。
论文首先修改了Mask R-CNN,让该网络不在去预测类别,而是专注于提取proposal(不管类别)。作者的目的是为了提高proposal的覆盖率,能够检测出所有的目标。但个人觉得,仅仅这样做,很难完全实现目标。也就是说,解决不了论文动机中介绍的第三个问题,只能从一定程度上缓解。
3.1 ViLD-text
在得到所有的proposal之后,并得到proposal的embeddings。ViLD-text的蒸馏目的,让proposal embeddings 尽可能地接近该proposal类别的CLIP text 特征。大家可以想象,如果每个proposal的embedding 都和CLIP提取的对应类别的文本特征接近,相当于网络已经具备了一定的通用性,网络学习的是proposal embedding和text embedding之间的相似性,而不是一个具体的分类。
具体做法:
1)对于每个proposal,提取 proposal embedding;
2)对于闭集内所有的类别,提取CLIP 的text文本特征;计算proposal embedding和所有文本特征间的相似性。这里,值得注意的是,作者加了一个background的文本特征,其实就是指向不存在于闭集中的文本特征。
3)对于上述特征,求一个softmax,对应的最大的文本特征的概率,然后和真值做交叉熵损失。
上述步骤直接对应论文中的公式(2)
大家想想,为什么这样做之后,CLIP 的text编码能力就蒸馏到了proposal网络中呢?
原因是:为了让loss最小,那么proposal embedding必然要和真值的CLIP 的text embedding一致;一旦一致了,这个CLIP的能力不就蒸馏过去了嘛。
3.2 ViLD-image
在ViLD-text中,是希望proposal embedding 和 CLIP text embedding保持一致。在ViLD-image中,就更加直接,是希望 proposal embedding和CLIP image embedding保持一致。具体步骤如下:
1)提取proposal embeddings;
2)同样的区域,用CLIP 提取 CLIP image embeddings;
3)直接用L1 loss约束两个embeddings一致。
3.3 两者结合
从3.1 和3.2中,可以得知,ViLD-text和ViLD-image都是为了约束proposal embeddings,如果直接一起训练,可能会互相干扰。因此,作者直接分了两个head,分别提取两个proposal embeddings,然后对每个embedding分别采用ViLD text和ViLD imag进行训练蒸馏。
在推理的时候,分别用两个head的proposal embeddings去做分类,得到分数。然后用一个类似于加权的方式去得到最终的分数。
4、实验部分
请读者自行看论文,这里不做过多讲解。
5、总结(个人理解)
这篇论文的思想非常好,解决了传统思路速度慢的问题,但依旧解决不了proposal网络漏检测而引起的错误。个人觉得是可以改进提升的地方。
此外,该论文的方法只对最后的proposal embedding做约束,没有将大模型充分利用到proposal的生成过程中,也是一个可以改进提升的地方。
