介绍几个域适应在分割上的比较好理解的应用:
不了解Domain adaptive可以先看看简介:https://blog.csdn.net/qq_33278461/article/details/90480525
以下几篇文章主要是用判别方法对域适应,有很多共性,主要讲一下第一篇,后面的作为对比参考,最后一篇ADDA是对利用判别方法作域适应的一个总结文章,它把这个过程抽象成了一个统一框架(推荐看一看)。
Learning from Synthetic Data: Addressing Domain Shift for Semantic Segmentation
- 主要贡献
可以看出在源域训练,未经DA直接在目标域测试效果比经过DA的差很多。
之前有一些工作直接在特征空间判别源域和目标域特征,以减少特征差异的方法。本文提出在生成空间判别(一种利用生成模型来对齐域之间的特征空间方法),这样效果会更好一些。
- 四个子网络:
C: pixel-wise classifier
F: embedding, 原文用fcn网络输入img,输出score(分割结果)、fc7、pool4(1/16)、pool3(1/8);
G: generator network,输入F网络输出的fc7、pool4、pool3 ,输出生成的img
D: discriminator network,输入G生成的img,输出out_s(4通道的对每个像素的分类:real_s,fake_s、real_t、fake_t)、out_c(用生成的图分割的scores)
注:
输入D的分别是真实的图像和生成的图像,其中真实的图像需要归一化到0-1之间。
分割:只针对source数据。
分类:real和fake,逐像素判别。
-
训练步骤:
先更新D网络, (4个逐像素的判别器loss+1个辅助分割loss);
再更新G网络, (2个L1 loss,1个分割loss,2个判别loss);
最后更新C和F网络, (2个分割loss,2个判别loss)。 -
网络输入输出,以及更新步骤的核心代码
代码来自:https://github.com/swamiviv/LSD-seg
# Source domain
score, fc7, pool4, pool3 = self.model(data_source)
outG_src = self.netG(fc7, pool4, pool3)
outD_src_fake_s, outD_src_fake_c = self.netD(outG_src) #4class segmentation 都是每个像素
outD_src_real_s, outD_src_real_c = self.netD(data_source_forD)
# target domain
tscore, tfc7, tpool4, tpool3= self.model(data_target)
outG_tgt = self.netG(tfc7, tpool4, tpool3)
outD_tgt_real_s, outD_tgt_real_c = self.netD(data_target_forD)
outD_tgt_fake_s, outD_tgt_fake_c = self.netD(outG_tgt)
# Updates.
# There are three sets of updates - (1) Discriminator, (2) Generator and (3) F network
# (1) Discriminator updates
lossD_src_real_s = cross_entropy2d(outD_src_real_s, domain_labels_src_real, size_average=self.size_average)#4类
lossD_src_fake_s = cross_entropy2d(outD_src_fake_s, domain_labels_src_fake, size_average=self.size_average)#4类
lossD_src_real_c = cross_entropy2d(outD_src_real_c, label_forD, size_average=self.size_average) #分割
lossD_tgt_real = cross_entropy2d(outD_tgt_real_s, domain_labels_tgt_real, size_average=self.size_average)#4类
lossD_tgt_fake = cross_entropy2d(outD_tgt_fake_s, domain_labels_tgt_fake, size_average=self.size_average) #4类
self.optimD.zero_grad()
lossD = lossD_src_real_s + lossD_src_fake_s + lossD_src_real_c + lossD_tgt_real + lossD_tgt_fake
lossD /= len(data_source)
lossD.backward(retain_graph=True)
self.optimD.step()
# (2) Generator updates
self.optimG.zero_grad()
lossG_src_adv_s = cross_entropy2d(outD_src_fake_s, domain_labels_src_real,size_average=self.size_average) #4分类?
lossG_src_adv_c = cross_entropy2d(outD_src_fake_c, label_forD,size_average=self.size_average) #分割?
lossG_tgt_adv_s = cross_entropy2d(outD_tgt_fake_s, domain_labels_tgt_real,size_average=self.size_average)#4分类?
lossG_src_mse = F.l1_loss(outG_src,data_source_forD)#看生成质量
lossG_tgt_mse = F.l1_loss(outG_tgt,data_target_forD)#看生成质量
lossG = lossG_src_adv_c + 0.1*(lossG_src_adv_s+ lossG_tgt_adv_s) + self.l1_weight * (lossG_src_mse + lossG_tgt_mse
lossG /= len(data_source)
lossG.backward(retain_graph=True)
self.optimG.step()
# (3) F network updates
self.optim.zero_grad()
lossC = cross_entropy2d(score, labels_source,size_average=self.size_average) #分割 全图
lossF_src_adv_s = cross_entropy2d(outD_src_fake_s, domain_labels_tgt_real,size_average=self.size_average)#4分类
lossF_tgt_adv_s = cross_entropy2d(outD_tgt_fake_s, domain_labels_src_real,size_average=self.size_average)#4分类
lossF_src_adv_c = cross_entropy2d(outD_src_fake_c, label_forD,size_average=self.size_average)#分割 小图
lossF = lossC + self.adv_weight*(lossF_src_adv_s + lossF_tgt_adv_s) + self.c_weight*lossF_src_adv_c
lossF /= len(data_source)
lossF.backward()
self.optim.step()
-
网络结构
-
效果:
-
实验:
1.输入大小不同的影响
2.只用判别器和生成器、判别器全用
3.用不用patch判别器
4.用不用辅助分割loss
Learning to Adapt Structured Output Space for Semantic Segmentation
- 主要贡献:
源域和目标域的分割任务输出是结构化的,具有空间和位置相似性。
所以对分割的结果判别,这里采用的是mutil-level adversarial。
- 效果:
- 实验:
1.mutil-level adversarial比 single level好。
2.Output Space Adaptation比Feature
Level上做对抗学习更好,而且对参数范围更不敏感。
Fully Convolutional Adaptation Networks for Semantic Segmentation∗
- 主要贡献:
提出AAN(Appearance Adaptation Network)和RAN(Representation Adaptation Network)分别在
视觉外观和特征表示上域适应。 并且在判别器用ASPP模块空洞卷积增加感受野(基于patch的判别而不是单张图判别)
FCNs in the Wild: Pixel-level Adversarial and Constraint-based Adaptation
- 主要贡献:
提出一个FCN-based的无监督域适应网络,利用1)global domain alignment 和 2)category specific adaptation 两方面对特征对齐减少domain shift。
1)global domain alignment:其实就是判别loss。
2)category specific adaptation:统计源域label分布来限制目标域的预测,目的是为了迁移空间布局。
利用全卷积约束的MIL Loss[1]对齐类别空间局部信息,通过约束图片中类别的存在与否以及物体的尺寸,从而完成具体类别上的信息对齐。 [1] Fully convolutional multi-class multiple instance learning. In ICLR
详细的讲解请看:
https://baijiahao.baidu.com/s?id=1618391082771952291&wfr=spider&for=pc
https://baijiahao.baidu.com/s?id=1618210638152254491&wfr=spider&for=pc
- 效果:
Adversarial Discriminative Domain Adaptation
-
主要贡献:
提出了一个通用的对抗自适应框架。
基于这个框架,提出一种新的对抗自适应算法。使用判别模型,不进行权重共享,使用GAN loss。
-
主要研究以下几点:
1)使用生成式模型还是判别式模型
2)不同域的映射结构是否共享权重
3)使用哪种对抗损失函数
-
训练方式
其实和之前的很多工作都差不多