Learning to Adapt Invariance in Memory for Person Re-identification文章阅读解析及代码理解

Abstract

本文研究了行人重识别(ReID)中的无监督域适应问题,目的是将知识从源域转移到目标域。现有的方法主要是减少域间位移,但往往忽略了目标样本之间的关系。本文研究了目标域的域内变化,提出了一种新的自适应框架。三种基本不变性,即范例不变性,相机不变性和邻居不变性。在样本特征存储中引入了范例记忆,可以有效地对全局数据集执行不变性约束。并进一步提出了基于图的正预测(GPP)方法来探索目标域的可靠邻域,该方法建立在记忆基础上,并在源样本上进行训练。

INTRODUCTION

行人重识别(ReID)是一种图像检索任务,其目的是从一个分离相机数据库中寻找查询匹配的人。在相同的数据分布上,经过训练和测试,主要的方法已经证明了惊人的性能。然而当在不同的领域评估时,它们可能会遭受性能的显著下降,因为数据集会从场景、季节、照明、相机部署等的变化中转移。在本文中,研究了ReID中的无监督域自适应问题,目标是使用一个标记的源域和一个未标记的目标域来提高模型在目标域上的泛化能力。

传统的UDA方法主要针对一个封闭集的设置,源域和目标域共享一个共同的标签空间,即两个域的类完全相同。由于reid中的域适应是一个特殊的开集问题,其中源和目标域具有完全不相交的类/身份。对于这样的标签约束,直接对齐两个域的特征分布将会使来自不同类别的样本对齐,可能不利于适应精度。

为了解决领域自适应ReID的挑战,最近的工作集中于在公共空间中对齐源-目标分布,如像素级空间和属性标签空间。**尽管取得了成功,但这些研究只考虑了源域和目标域之间的整体域间转移,而很大程度上忽略了目标域的域内变化。**在ReID系统中,域内的变化是影响性能的重要因素。如果不考虑目标域内的变化,当目标测试集的域内变化与源域差异较大时,自适应模型的性能较差。

在这项工作中明确地考虑了目标领域内的变化,即样本不变性(EI),相机不变性(CI),邻域不变性(NI),如下所述。
范例不变性(EI):第一个属性是由ReID的检索结果引起的。给定一个ReID模型训练训练集标记来源,评估在源/目标测试集。一方面,观察到顶级检索结果(包括正和负)样品测试时总是视觉相似查询源。类似的现象所示图像分类。这表明该模型已经学会了根据源域的表观相似性来区分人员。另一方面,当测试目标设置后,排名最高的结果通常包括许多在视觉上与查询不相似的示例。这表明,该模型通过表观相似度来区分人的能力在目标域上有所下降。在现实中,每个人的范例可能与他人有很大的不同,甚至共享相同的身份。因此,通过学习区分个体范例,使模型能够捕获表观表示是可能的。为了实现这一目标,引入了样本不变性(EI)来提高模型在目标域上的识别能力,通过鼓励每个样本靠近自己而远离其他样本。

相机不变性(CI):相机风格差异是ReID能够被清晰识别的关键因素,因为人的外表在不同的相机下可能会有很大的变化。由于源域和目标域的摄像机部署通常不同,在源域上训练的模型可能会受到目标摄像机的变化的影响。为了解决这个问题引入了相机不变性(CI),使目标示例与其对应的CamStyle传输图像相互接近。在他们的启发下,我们通过将一个目标示例和它的CamStyle对应对象分类到同一个类,从而将相机不变性学习集成到我们的模型中。

邻域不变性(NI):除了容易识别的相机方差外,其他一些潜在的域内变化,如姿态、视图和背景的变化,如果没有精细的标签,很难清晰地识别出来。为了克服这一困难,我们尝试将模型推广到目标样本的邻域。假设我们在源域和目标域上训练了一个合适的模型,目标样本和它在目标集中的最近邻可能具有相同的身份和更高的潜力。考虑到这一特点,我们引入邻域不变性(NI)来学习一个更鲁棒的模型,以克服潜在的区域内变化的目标域。我们通过鼓励范例与其可靠近邻彼此靠近来实现这个约束。

直观地说,实现这三个不变性属性的一个直接方法是在一个小批训练中使用对比/三重损失来约束它们。但是,与整个训练集相比,一个迷你批处理中的样本数量相对较少,这样很难形成一个具有理想示例的迷你批处理,在网络自适应过程中也不能充分考虑训练样本之间的整体关系。为了解决这个问题,我们开发了一个新的框架来有效地适应领域自适应re-ID的三个不变性特性。具体地说在网络中引入了一个范例记忆模块来存储所有训练样本的最新表示。内存使网络能够对整个/全局目标训练数据执行不变约束,而不是当前的小批处理。利用该记忆体,可以在非参数分类损失的情况下,有效地实现目标域的不变性学习,将每个目标样本视为一个单独的类。

在之前的工作中,我们直接从内存中选择top-k个最近邻来学习NI。这个简单的策略忽略了内存中样本之间的基本关系。因此,当模型的识别能力较差时,难样本的相似度估计可能不准确。作为对我们之前工作的显著扩展,我们提出了一种基于图的正向预测(GPP)方法来解决这个问题,从而促进了不变性学习。GPP建立在记忆模块的基础上,采用图卷积网络(GCNs)进行设计,目的是从记忆中预测训练目标样本的正邻居。除了目标内存之外,我们还构造一个内存来保存源域的特性。这使得我们能够模拟目标不变性学习的邻接探索过程,从而在标记的源域上学习GPP。然后将已学习的GPP直接应用到未标记的目标域,以促进NI的学习。

综上,贡献如下:
这项工作全面地研究了目标域内的变化,并研究了目标不变性的三个基本性质。实验表明,这三种特性对于提高模型在reid环境下的可转移能力是必不可少的。这项工作提出了一种新的框架,配备了一个内存模块,可以有效地将这三种约束执行到网络中。内存使我们能够充分利用整个训练集上的样本关系,而不是小批处理。有了内存,性能可以显著提高,只需要非常有限的额外计算成本和GPU内存。这项工作引入了一种基于图的正向预测(GPP)方法来利用候选邻域之间的关系,并为训练目标样本推断出准确的正向邻域。实验表明,GPP有利于邻域不变性的学习,并能持续地提高学习结果,尤其是地图的学习效果。此外,我们分析了这三种不变性的机制,这有助于我们理解这三种不变性是如何促使网络适应目标域的。

THE PROPOSED METHOD

本文旨在解决无监督领域自适应(UDA)与个人再识别(reID)的问题。在reid中的UDA上下文中,我们提供了一个全标记的源域{Xs, Ys}和一个未标记的目标域Xt。源域包括M恒等式的Ns行人图像。每个人的图像xs与一个身份ys相关联。目标域包含Nt行人图像。目标域的标识注释不可用。通常源和目标域来自不同的分布,源和目标域中的标识完全不同。在本文中的目标是学习一个可转移的深度re-ID模型,该模型能很好地在目标测试集上推广。在训练过程中利用了标记源域和未标记目标域。

Overview of Framework

在这里插入图片描述
所提方法的框架如上图所示。输入从带标记的源域和未带标记的目标域采样。输入首先被送入特征提取器以获得最新的特征。特征提取器由卷积层、全局平均池(GAP)和批处理归一层组成。卷积层是ImageNet上预训练的ResNet-50的剩余块。特征提取器的输出是2048维。随后开发了源分支和目标分支,分别用源数据和目标数据训练该模型。每个分支包括一个范例内存模块。内存模块用作特性存储,保存每个源/目标样本的最新特征提取器输出。源分支的目标有两方面。一方面,使用交叉熵损失的标识分类器来学习特征提取器的基本表示;另一方面,首先从源存储器中选择输入的最高级特征。将这些最重要的特征作为候选近邻,用于学习基于图的正向预测(GPP)网络。GPP网络由几个图卷积层和一个正分类器组成,其目的是预测一个候选对象属于输入的一个正样本的概率。目标分支被设计用来在未标记的目标数据上加强提出的三个不变性,即范例不变性,摄像机不变性和邻域不变性。给定一个目标样本,通过估计目标样本与整个目标样本在目标存储器中的相似性来计算不变性学习损失。在不变性学习中,我们使用学习的GPP来推断目标样本的可靠正邻居。这些邻居是根据GPP的正分类器所获得的概率从目标存储器的候选对象中选择的。注意,GPP网络只使用源数据进行训练。此外,没有利用GPP网络的丢失来更新特征提取器。

Supervised Learning for Source Domain

给定标记的源数据,可以学习一个基本的鉴别模型在监督的方式。在本文中把源域的训练过程作为一个身份分类问题。因此源域的监督损失由交叉熵损失计算,公式为:
在这里插入图片描述
其中, p ( y i s ∣ x i s ) p(y^s_i|x^s_i) p(yisxis)是源图像 x i s x^s_i xis属于身份 y i s y^s_i yis的预测概率。 p ( y i s ∣ x i s ) p(y^s_i|x^s_i) p(yisxis)是由源分支的身份分类器得到的。

据报道,模型训练使用标记源数据产生相同的分布式测试集的精度高。然而,没有适应模型,性能将显著恶化,当在一个看不见的(目标)测试组进行测试。接下来将引入基于样本记忆的目标不变性学习方法来提高模型的可转移性。

Invariance Learning for Target Domain

只使用源数据训练的深层re-ID模型通常对目标域的域内变化很敏感。实际上,这些变化是影响目标测试集性能的关键因素。因此,在将知识从源域转移到目标域的过程中,考虑目标域的域内变化是非常重要和必要的。为此,本文研究了目标不变性的三个基本性质,并利用这三个性质的约束来适应网络。目标不变性的三个性质分别是范例不变性(EI)、相机不变性(CI)和邻域不变性(NI),描述如下。

Three Properties of T arget Invariance

Exemplar-invariance。给定一个训练良好的re-ID模型,排名最高的结果通常在视觉上与查询相似。这表明,该模型已经学会了通过明显的相似性来区分不同的人。但是,当在不同的分布式数据集上测试时,这种现象可能不再适用。事实上,每个人形象的外观可能与他人非常不同,即使他们拥有相同的身份。我们把这个属性称为范例不变性,即每个人的形象应该离自己近,而离他人远。因此,通过在目标图像上增强样本不变性,可以使模型提高基于表观表征的人图像的识别能力。

Camera-invariance。相机风格的变化是re-ID中一个自然而重要的因素,在不同的相机下,人的形象可能会发生显著的外观变化。使用标记源数据训练的模型可以学习源摄像机的摄像机不变性,但可能会受到目标摄像机的影响。这是因为这两个域的相机设置非常不同。受HHL[64]的启发,我们通过学习未标记的目标图像及其相机样式转移对应的图像来实现目标相机不变性的特性。这些对应物是不同相机的风格,但与原始图像有着相同的身份。在相机不变性的约束下,目标图像与其相机风格的传输对应图像被鼓励彼此靠近。假设目标集中有C个摄像机,我们用CycleGAN[68]或StarGAN[6]对目标域的CamStyle模型[66]进行训练。对于市场1501[58]和DukeMTMC-reID[61]有较少的摄像机,我们使用CycleGAN训练CamStyle模型。对于多摄像头的MSMT17,我们使用StarGAN来训练CamStyle模型。通过学习的CamStyle模型,每个从相机c采集的真实目标图像都被其他相机风格的c - 1图像增强,同时保持原始身份。由CamStyle模型生成的真实图像和伪图像示例如图3所示。
在这里插入图片描述
在DukeMTMCreID上转换相机样式图像的例子。从某一相机采集的真实图像被转换成其他相机样式的图像。在这个过程中,一定程度上保留了身份信息。在相机不变性学习中,假设真实图像和伪图像属于同一类。

Neighborhood-invariance。除了相机的变化特性是自然的和容易识别的,还有许多关键的域内变化,如果没有身份的注解是很难克服的,例如姿态和背景的变化。事实上,对于每一幅目标图像,在目标数据集中都可能存在一定数量的正样本。如果我们能够在适应过程中利用这些正样本,就能够进一步提高reid模型在克服目标域变化时的鲁棒性。假设我们得到了一个适当的传输模型和一个查询目标样本。目标集中查询的最近邻居最有可能是查询的正样本。鉴于此,我们引入邻域不变性,假设目标图像与其可靠邻域具有相同的恒等性,且相邻的邻域应该很近。
接下来,我们将介绍在网络中执行这三个不变性约束的损失函数。

Target Invariance Learning with Memory

实现不变性的三个基本特性的一个关键步骤是估计目标样本之间的相似性(关系)。直观地,一个直接的解决方案是计算一个训练小批内的样本之间的相似性,并通过对比损失或三重损失来执行这三个约束。但是由于GPU内存的限制,**一个小批训练中的样本数量远远少于整个训练集中的样本数量。这将在不变性学习中产生两个问题。首先,很难组成一个适当的小批量,其中包括各种样本,以及它们对应的CamStyle副本和邻居。其次,与整个数据集相比,迷你批处理样本之间的相似性是局部的,并且是有限的。**为了解决这些问题在网络中引入了一个范例存储器来存储整个目标样本的最新表示。通过记忆,网络可以直接估计一个训练目标样本和整个目标样本的相似性,从而有效地实现全局不变性约束。

范例的记忆存储。范例内存是一个特性库,它存储整个数据集的最新特性。给出一个包含图像Nt的未标记目标数据,构造一个包含nt的样本存储器(Ft)。每个槽存储特征提取器对对应目标图像的l2归一化输出。在初始化过程中,我们将内存中所有特征的值初始化为零。在每次训练迭代时,对一个目标训练样本 x i t x^t_i xit,通过模型进行转发,得到特征提取器f( x i t x^t_i xit)的l2归一化输出。
在这里插入图片描述
其中 F t [ i ] F^t[i] Ft[i]是图像 x i t x^t_i xit在第i个槽上的特征。超参数a∈[0,1]控制更新速率。接下来将介绍基于记忆的不变性学习方法。

样本不变性学习。样本不变性使得目标图像离自己很近,而离其他图像很远。为了实现这一目标将Nt目标图像视为Nt个不同类,并采用非参数化的方式将每个图像分类到各自的类中。为简单起见,我们将对应的索引指定为每个目标样本的类。具体来说,给定一个目标图像 x i t x^t_i xit,首先计算嵌入的f( x i t x^t_i xit)与存储在内存Ft中的特征之间的余弦相似度,然后使用softmax函数计算 x i t x^t_i xit属于类i的预测概率,
在这里插入图片描述
其中,B∈(0,1)是平衡分布规模的参数。范例不变性学习的目标是使目标图像 x i t x^t_i xit, as的负对数似然最小化
在这里插入图片描述
相机不变性学习。相机不变性使目标图像与其样式转换的对应图像相近。为了将相机不变性学习引入到模型中,我们尝试将每幅真实图像及其风格转换对应图像分类到同一类中。相机不变性的损失函数解释为:
在这里插入图片描述
x i t x^t_i xit的目标图像随机抽样风格迁移图像。通过这种方式,图像在不同的相机风格相同的示例被迫互相接近。

邻居不变性学习。邻域不变性使目标图像接近其可靠邻域。为了将这个特性赋予到网络中,我们将目标图像 x i t x^t_i xit分类到其可靠邻居的类中。假设在记忆体中选定的xt i的可靠邻居记为K( x i t x^t_i xit),为 x i t x^t_i xit属于类j的概率赋权,
在这里插入图片描述
其中|K( x i t x^t_i xit)|表示K( x i t x^t_i xit)的大小。邻域不变性学习的目标表示为软标签损失,
在这里插入图片描述
邻域不变量学习的关键是在K( x i t x^t_i xit)中包含尽可能多的正样本,同时剔除负样本。
不变性学习的整体损失。通过综合考虑样本不变性、相机不变性和邻域不变性,不变性学习在目标训练图像上的整体损失可以写成:
在这里插入图片描述
其中,xt是从xt和它的相机样式传输的图像的并集中随机采样的图像。当i = j时,我们通过将e xt i分类到它自己的类中,使用样本不变性学习和相机不变性学习来优化网络。当i不等于j时,通过邻域不变性学习,使ext在K(ext i)中接近其可靠邻域,从而优化网络。

代码简单理解

#invariance.py代码段
class ExemplarMemory(Function):
    def __init__(self, em, alpha=0.01):
        super(ExemplarMemory, self).__init__()
        self.em = em#范例记忆特征存储来存储训练样本的最新特征表示
        self.alpha = alpha#特征在每轮训练后的更新率

    def forward(self, inputs, targets):
        self.save_for_backward(inputs, targets)
        #save_for_backward是会保留此input的全部信息,并提供避免in-place操作导致的input在backward被修改的情况.就相当于self.inputs=inputs,self.targets=targets
        outputs = inputs.mm(self.em.t())#inputs与em相乘
        return outputs

    def backward(self, grad_outputs):
        inputs, targets = self.saved_tensors
        grad_inputs = None
        if self.needs_input_grad[0]:
            grad_inputs = grad_outputs.mm(self.em)
        for x, y in zip(inputs, targets):
            #zip函数以可迭代的对象作为输入参数,将对象中对应的元素打包成元组输出新的对象,即将inputs和targets对应连接
            self.em[y] = self.alpha * self.em[y] + (1. - self.alpha) * x#更新em记忆特征表示
            self.em[y] /= self.em[y].norm()
        return grad_inputs, None


# Invariance learning loss损失函数
class InvNet(nn.Module):
    def __init__(self, num_features, num_classes, beta=0.05, knn=6, alpha=0.01):
        super(InvNet, self).__init__()
        self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
        self.num_features = num_features#特征向量的维度
        self.num_classes = num_classes#分类的类别数
        self.alpha = alpha  # Memory update rate#更新率
        self.beta = beta  # Temperature fact温度参数,类似于学习率,设置比较大,那么预测的概率分布会比较平滑,那么loss会很大,这样可以避免我们陷入局部最优解。随着训练的进行,我们将之变小,也可以称作降温,类似于模拟退火算法
        self.knn = knn  # Knn for neighborhood invariance

        # Exemplar memory
        self.em = nn.Parameter(torch.zeros(num_classes, num_features))
		
    def forward(self, inputs, targets, epoch=None):

        alpha = self.alpha * epoch#随着轮数发生变化
        inputs = ExemplarMemory(self.em, alpha=alpha)(inputs, targets)
		
        inputs /= self.beta
        if self.knn > 0 and epoch > 4:
            # With neighborhood invariance有邻居不变性,平滑损失
            loss = self.smooth_loss(inputs, targets)
        else:
            # Without neighborhood invariance没有邻居不变性,交叉熵损失
            loss = F.cross_entropy(inputs, targets)
        return loss

    def smooth_loss(self, inputs, targets):#标签平滑损失
        targets = self.smooth_hot(inputs.detach().clone(), targets.detach().clone(), self.knn)
        outputs = F.log_softmax(inputs, dim=1)
        loss = - (targets * outputs)
        loss = loss.sum(dim=1)
        loss = loss.mean(dim=0)
        return loss

    def smooth_hot(self, inputs, targets, k=6):
        # Sort
        _, index_sorted = torch.sort(inputs, dim=1, descending=True)

        ones_mat = torch.ones(targets.size(0), k).to(self.device)
        targets = torch.unsqueeze(targets, 1)
        targets_onehot = torch.zeros(inputs.size()).to(self.device)

        weights = F.softmax(ones_mat, dim=1)
        targets_onehot.scatter_(1, index_sorted[:, 0:k], ones_mat * weights)
        targets_onehot.scatter_(1, targets, float(1))

        return targets_onehot

猜你喜欢

转载自blog.csdn.net/qq_34124009/article/details/108104790