【实例间对比】ICE: Inter-instance Contrastive Encoding for Unsupervised Person Re-identification论文笔记

思路及创新点

提出了实例间对比编码(ICE),它利用实例间成对相似度分数来提升效果。使用成对相似度排序作为难样本实例对比的one-hot难伪标签,旨在减少类内方差。然后,使用相似度分数作为软伪标签来增强数据增强后的视图和原始视图之间的一致性,这使得模型对增强扰动更加鲁棒。
在这里插入图片描述
上图中online encoder是传统的神经网络,momentum encoder与MoCo类似,通过online encoder的累积权重进行更新。
在这里插入图片描述
总损失为:
在这里插入图片描述

For a camera-agnostic memory

集群 a 的代理被定义为属于该集群的所有实例的平均动量表示:
m为momentum encoder输出
在这里插入图片描述
fa为online encoder集群 a的输出。通过上述损失,异常值不会从集群实例中推开,这使能够为提出的难样本对比挖掘更多的难样本。
在这里插入图片描述

For a camera-aware memory

pab 定义为相机 cb 中属于集群 a 的所有实例的平均动量表示:
在这里插入图片描述
给定一个在线表示fab,跨相机代理对比损失是一个softmax log loss,其中pai为一个正跨相机代理和Nneg为最近的负代理数。
在这里插入图片描述
其中 < · > 表示余弦相似度,τc 是跨相机温度超参数。 |P|是跨相机正代理的数量。由于这种跨相机代理对比损失,来自一个相机的实例被拉近其他相机的代理,这减少了类内相机风格差异。

Hard Instance Contrastive Loss

一个 mini-batch 由 NP 个身份组成,其中每个身份都有 NK 个正实例。给定一个属于第 i 类的锚实例 fi,对与 fi 的余弦相似度最低的最难的正动量表示 mik 进行采样,见图 4。
图4

在这里插入图片描述
其中其中 k = arg min (<fi·mik>),也就是选择正样本中最不相似的一张。

Soft Instance Consistency Loss

对于数据增强后的一批图像,我们测量anchor fA与所有小批量NK×NP实例之间的实例间相似度,如图4所示。然后,实例间相似度转化为一个softmax的预测分布P:
在这里插入图片描述
对于没有数据增强的同一批次,我们测量同一锚的动量表示与所有小批量 NK × NP 实例之间的实例间相似性,因为动量编码器更稳定。我们得到一个目标分布 Q:
在这里插入图片描述
在这里插入图片描述

实验结果

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是结合 Focal Loss 和 Batch-Balanced Contrastive Loss 的 PyTorch 代码: ```python import torch import torch.nn as nn import torch.nn.functional as F class FocalLoss(nn.Module): def __init__(self, alpha=1, gamma=2, reduction='mean'): super(FocalLoss, self).__init__() self.alpha = alpha self.gamma = gamma self.reduction = reduction def forward(self, inputs, targets): ce_loss = F.cross_entropy(inputs, targets, reduction='none') pt = torch.exp(-ce_loss) focal_loss = self.alpha * (1-pt)**self.gamma * ce_loss if self.reduction == 'mean': return focal_loss.mean() elif self.reduction == 'sum': return focal_loss.sum() else: return focal_loss class BatchBalancedContrastiveLoss(nn.Module): def __init__(self, margin=0.5, alpha=0.5, beta=1, gamma=2, reduction='mean'): super(BatchBalancedContrastiveLoss, self).__init__() self.margin = margin self.alpha = alpha self.beta = beta self.gamma = gamma self.reduction = reduction def forward(self, inputs, targets): n = inputs.size(0) sim_mat = torch.matmul(inputs, inputs.t()) targets = targets.view(n,1) mask = targets.expand(n,n).eq(targets.expand(n,n).t()) pos_mask = mask.triu(diagonal=1) neg_mask = (mask-triu(diagonal=1)).bool() pos_pair = sim_mat[pos_mask] neg_pair = sim_mat[neg_mask] num_pos_pair = pos_mask.sum() num_neg_pair = neg_mask.sum() alpha = self.alpha beta = self.beta if num_pos_pair > 0: alpha = (num_neg_pair / num_pos_pair) * self.alpha if num_neg_pair > 0: beta = (num_pos_pair / num_neg_pair) * self.beta pos_loss = F.relu(pos_pair - self.margin) neg_loss = F.relu(self.margin - neg_pair) if self.gamma > 0: pos_loss = torch.pow(pos_loss, self.gamma) neg_loss = torch.pow(neg_loss, self.gamma) pos_loss = alpha * pos_loss neg_loss = beta * neg_loss bbcon_loss = torch.cat([pos_loss, neg_loss], dim=0) if self.reduction == 'mean': return bbcon_loss.mean() elif self.reduction == 'sum': return bbcon_loss.sum() else: return bbcon_loss class FocalBatchBalancedContrastiveLoss(nn.Module): def __init__(self, alpha=1, gamma=2, margin=0.5, beta=1, reduction='mean'): super(FocalBatchBalancedContrastiveLoss, self).__init__() self.alpha = alpha self.gamma = gamma self.margin = margin self.beta = beta self.reduction = reduction self.focal_loss = FocalLoss(alpha=self.alpha, gamma=self.gamma, reduction='none') self.bbcon_loss = BatchBalancedContrastiveLoss(margin=self.margin, alpha=1, beta=self.beta, reduction='none') def forward(self, inputs, targets): n = inputs.size(0) ce_loss = self.focal_loss(inputs, targets) bbcon_loss = self.bbcon_loss(inputs, targets) if self.reduction == 'mean': return (ce_loss + bbcon_loss).mean() elif self.reduction == 'sum': return (ce_loss + bbcon_loss).sum() else: return ce_loss + bbcon_loss ``` 使用方法: ```python loss_fn = FocalBatchBalancedContrastiveLoss(alpha=1, gamma=2, margin=0.5, beta=1, reduction='mean') optimizer = torch.optim.Adam(model.parameters(), lr=0.001) for epoch in range(num_epochs): for i, (inputs, targets) in enumerate(train_loader): optimizer.zero_grad() outputs = model(inputs) loss = loss_fn(outputs, targets) loss.backward() optimizer.step() ``` 注意,这里的 `inputs` 是模型的输出,而 `targets` 是标签。在训练过程中,你需要将 `inputs` 和 `targets` 输入到模型中,得到输出 `outputs`,然后计算损失并进行反向传播和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值