动机
采用一般的UDA方法:源域预训练+目标域伪标签微调,这种方法有2个缺点:(1)伪标签噪声;(2)两个域的gap。
思路
三种方法:聚类对比学习;步进域适应;傅里叶数据增强
1、聚类对比学习:用到了对比学习算法思路、moco思路(设置一个动态的队列挖掘负样本)、聚类;聚类和对比学习交替进行,从而减少错误噪声伪标签。
2、步进域适应:对两个域联合学习,而不是采用一般UDA方法
3、傅里叶数据增强:在傅里叶空间构建额外的损失
方法
Cluster-wise Contrastive Learning
效果:涨6个点
方法:聚类和对比学习交替进行。
个人理解:训练过程中,源域和目标域之间并没有联系。1、对于目标域的一个batch,在student encoder中找聚类得到的正样本,在teacher encoder中找负样本,构建对比学习损失,出发点—teacher学到更好的特征,这是moco的一个创新点,没有仅用某一个encoder的特征去做损失;2、队列中会有之前的feature,动态更新,此外聚类一次整个队列全部换一次,聚类+对比学习的点在这;3、会丢弃正例样本,这是本文创新,因为Moco是通过加很多负样本,从而减小正样本的影响(因为从teacher中认为都是负样本,即使有少量正样本,由于负样本比例大很多,所以不会影响)
1、产生伪标签,构建损失
**注意:**positive样本是在当前的batch中选,而negative样本是从MMA encoder得到的队列中选,这个队列包含当前和过去batch的样本feature。同时为了防止采样到负样本,会把队列里和anchor同一伪标签的特征丢弃。
和MOCO的区别:
(1)MOCO通过数据增强获得新的正样本,而负样本是非这类图像,即,拉近同一张图的不同数据增强的图像的距离,是实例级别。本文则是基于伪标签提取正负样本,并在队列中丢弃正样本。
个人理解:moco的输入是anchor样本及其数据增强后样本(正例)+一堆负例,目的就是想拉近正例距离,拉远与负例距离。本文两个encoder同时输入目标域,从数据上说,想要拉近的不是某一个id的不同数据增强样本,而实一个id不同视角下的图像;从标签上说,判断是否同一个id是用聚类获得, 而不是gt。
(2)队列会在重新聚类之后全部换一次,因为聚类伪标签每次都不会保持一致,而Moco则仅更新队列,将旧的batch逐步丢弃,加入新的batch。
Progressive Domain Adaptation
效果:涨8个点
目的:不采用一般UDA思路,当前较流行的是同时输入两个域的图像进行操作,但是本文针对Loss的更新进行了创新,比较巧妙。
方法:输入还是两个域,但是做有监督loss(交叉熵和三元)时,先对源域给大权重,目标域小权重,以梯度方式随着训练次数递减和升高。
首先,0到e1阶段仅用源域训练,相当于初始化;其次,e1到e2阶段,源域仍然采用两个loss更新,目标域除了那两个loss,还有一个CCL loss(不断找目标域负样本,拉远距离);最后阶段仅训练目标域。
个人启发:换成其他函数形式的更新方式,会不会提高一点?
Fourier Augmentation
提升2个点
目的:对输出特征用傅里叶变换后获得振幅M,可以当作一种非线性变换。本文实验证明它比用一个MLP效果好。
方法:用振幅做交叉熵。因为三元组损失在特征空间和傅里叶空间一样的,所以没有做三元。
总损失以及实验
Lspa是包含交叉熵和三元损失(目标域基于伪标签计算);Lfre仅包含交叉熵(傅里叶空间)
参数设置:
1、训练次数分段:0-20;20-50;50-80
2、deta=0.1;gamma=0.7(CCL不占大头但很有用,主要还是特征空间的交叉熵和三元)
3、队列长度为1024,对比损失CCL中,tao = 0.07
4、聚类用的DBSCAN
**注意:**加了星号的表示以MMT的方法为基础做的工作,即加上了soft label 和Mutual learning。(本文结构图的MMA就是一个mean net。)
合成数据集PersonX的跨域效果
车辆跨域重识别效果
启发
1、CCL思路:
(1)student-teacher结构,用teacher找负样本,student找正样本,做对比损失。
(2)teacher的特征用队列装起来,从而能保留past negative样本
(3)teacher的队列会丢弃正例样本。(label来自聚类)
2、PDA思路:
适用广,对于输入两个域的特征,在不同epoch中侧重不同的域的损失
3、傅里叶思路:
个人觉得纯属用于提点,换成加一个MLP其实也能涨几个点