前言
这篇发表在CVPR2021上的自监督学习论文,提出了一种针对特殊的自监督学习下游任务(即面向像素级的任务,比如语义分割、目标检测、实例分割)而设计的自监督学习算法——稠密对比学习,主要思想就是将空间域上稠密分类的方式和对比自监督学习融合到一起。论文的一作来自澳大利亚的阿德莱德大学,二作来自同济大学。
本博文将简要介绍论文的基本思想和算法流程。
一、研究背景
当前自监督学习十分流行,我们可以使用大量无标签数据训练网络,得到一个优秀的特征提取器,进而可以将该特征提取器用于多种下游任务,比如图像分类、目标检测、目标跟踪、语义分割等。在下游任务中可以根据情况选择要不要对特征提取器进行微调。
经过近两年自监督学习算法的发展,自监督学习获得的特征提取器性能已经可以和监督学习相媲美,尤其是对比自监督学习,比如SimCLR、MoCo等算法在下游任务中的表现良好。(这里不再详细讲解对比自监督学习的原理)
但是作者发现在一些针对像素级特征的下游任务上,常用的对比自监督学习甚至是监督学习表现的并不如意。像素级的任务包括目标检测、语义分割、实例分割,这些任务不是对一幅图像进行整体分类,而是要对像素级或图像块上进行语义区分。比如语义分割是对图像的每个像素进行分类:
然而现有的对比自监督算法都是将提取到的图像特征进行全局池化磨灭空间信息,之后再用这个全局特征进行对比学习。比如在SimCLR算法中,会将卷积层提取到的有空间分辨率的特征进行全局池化,再通过一个映射头(几个全连接层)得到用于计算对比损失的映射特征。如下图, z i , h i z_i, h_i zi,hi 都反映的是全局特征,损失了空间信息。
这样的特征无疑是损失了图像的空间信息,作者认为这种做法更适合于对全局图像进行分类的下游任务,而不适用于对空间信息要求较高、针对像素级操作的下游任务,比如语义分割。
基于此背景,作者提出了保留空间信息的对比自监督学习算法——Dense CL,即将稠密特征引入对比学习。
二、算法描述
论文中设计的自监督学习算法被称为:Dense CL(稠密对比学习),是一种将稠密特征和基本对比自监督学习融合的算法。作者使用一种常用的对比自监督算法——MoCo-v2 作为基准网络,在其上进行改进。
1. 全局特征对比学习
对于一般的对比自监督学习来说,会先对一张图像进行不同数据增强获得两个变体,再将变体送入卷积网络提取特征。并会将提取到的图像特征进行全局最大/平均池化,得到一维全局特征向量,将此特征向量通过全局映射头global projection head(几层全连接)或者直接用于计算对比损失。最常见的对比损失函数是NCEloss,本论文中仍沿用该损失函数。在全局对比中,对于一张图像计算损失,NCEloss的表示如下,称为全局对比损失:
- q q q表示当前图像特征;
- k + k_+ k+表示当前图像的正样本对图像特征;
- k − k_- k−表示当前图像的负样本对图像特征。
通常由一张原图经过不同变换得到的两张图像互为正样本对,不同原图经过变换得到的图像互为负样本对。
注意:在MoCo中,每一个图像都有一个字典来保存它的正样本对及负样本对图像特征,我们把这个字典中的每个特征称为key,将当前计算对比损失的图像特征称为query。此时,每个特征即代表了一整张图像。
2. 稠密特征对比学习
稠密特征对比学习就是将上一节中用于计算对比损失的全局特征,替换为保留空间分辨率的稠密特征。简单来说,就是不对卷积得到的特征进行全局池化!
当然,虽然不对特征全局池化,但还是要经过一个映射头的,这个映射头是一个1*1的卷积层,称为稠密映射头dense projection head。我们把图像特征记为 F ∈ R H × W × K F\isin R^{H×W×K} F∈RH×W×K,把稠密映射头的输出特征记为 Θ ∈ R S × S × E \Theta\isin R^{S×S×E} Θ∈RS×S×E。
引入稠密映射头的目的在于进一步调整特征(和全局映射头作用类似),还可以在需要的时候改变图像特征的空间分辨率和通道数。
接下来,我们对这个稠密特征计算对比损失,对于一张图像计算损失,可将其损失函数定义为:
称为稠密对比损失。式中,
- r s r^s rs表示当前图像特征 Θ \Theta Θ中第 s s s个空间位置处的特征向量(也就是query);
- t + s t^s_+ t+s表示与 r s r^s rs稠密匹配的特征向量(Dense Correspondence),即正对特征;
- t − s t^s_- t−s表示与 r s r^s rs不匹配的特征向量。
注意 t + s t^s_+ t+s和 t − s t^s_- t−s都是其他图像特征中某空间位置处的一维特征向量。
仿照MoCo的思路,我们可以认为 r r r是当前正在计算损失的query, t t t则来自于存放query正负特征对的字典,即是上一节中的key。但是在稠密对比中,query和每个key不再代表一整张图像,而是代表一个图像块,因为它们是稠密特征中某个空间位置处的特征向量。
在这个字典中,只有一个key是query的稠密匹配向量即正对,其他的均为负对特征。
打眼一看,这个损失函数和全局对比损失长得基本一样,就是其中的稠密匹配概念比较模糊。到底什么是当前特征向量的稠密匹配向量呢?
3. 稠密对比中的正负样本配对方案
在稠密对比损失中比较难断定的是,字典中的哪一个特征向量是当前query的稠密匹配向量。作者在论文中给出了一个寻找方案,把寻找过程称为Dense Correspondence。
从上一节中可以了解到,在稠密对比学习中,仍然需要对一张原图进行两种不同的数据增广,获得两个变体,并将两个变体送入特征提取器。那么对于一张变体上的一个query向量,它的稠密匹配向量一定是在与其来自于同一张原图的另一个变体特征上的。有了这个前提,我们就可以缩小寻找范围,只需要在同一张原图的两个变体特征上匹配稠密特征就可以了~
为了表示方便,把卷积网络提取的两个变体特征记作 F 1 , F 2 F_1, F_2 F1,F2,把稠密映射头输出的对应特征记作 Θ 1 , Θ 2 \Theta_1,\Theta_2 Θ1,Θ2。
寻找稠密匹配向量的过程如下:
- 通过自适应池化,将 F F F特征的空间分辨率调整为和 Θ \Theta Θ一致,即 S × S S×S S×S;
- 对 F 1 , F 2 F_1, F_2 F1,F2计算相似度矩阵 Δ ∈ R S 2 × S 2 \Delta \isin R^{S^2×S^2} Δ∈RS2×S2,矩阵中第 i i i行、第 j j j列的值即代表了, F 1 F_1 F1中第 i i i个空间位置处的特征向量和 F 2 F_2 F2中第 j j j个空间位置处的特征向量的余弦相似值;
- 找到相似度矩阵中第 i i i行中最大值对应的列标 c i c_i ci,那么 Θ 1 \Theta_1 Θ1中第 i i i个query特征的稠密匹配向量,就是 Θ 2 \Theta_2 Θ2中第 c i c_i ci个空间位置处的特征向量。
实际上,query的稠密匹配向量就是在对应的另一个变体特征中余弦相似度最高的空间位置特征。
找到了稠密匹配向量,就是确定了对比损失中的 t + s t^s_+ t+s,那么 t − s t^s_- t−s就是字典中剩下的其他所有向量。
这样就可以愉快地计算稠密对比损失函数啦 (づ ̄ 3 ̄)づ
在论文中,作者为了提升效果,将稠密对比损失和全局对比损失进行凸组合,得到总损失再进行反向传播。
三、实验结果
作者做了大量对比实验以及参数选择实验,这里展示部分实验结果。
下表是在语义分割任务上的对比实验结果,可以看出Dense CL的效果优于基准网络MoCo-v2,并且高于有监督学习。
作者为了说明提出的算法不会影响预训练的效率,对预训练的耗时进行了对比实验,发现DenseCL只比MoCo-v2慢了不超过1%,但性能却有较大提升。
总结
这篇论文主要针对像素级下游任务设计了对应的对比自监督算法,我认为这是非常正的思想。针对不同下游任务的特点,设计出有针对性的上游任务,这样可能会取得更好的迁移效果。基于自监督对比学习的少样本学习算法研究或许也可以沿着这种思路,去寻找一种适合少样本学习的上游任务!