Domain Adaptive在无监督语义分割上的应用

介绍几个域适应在分割上的比较好理解的应用:

不了解Domain adaptive可以先看看简介:https://blog.csdn.net/qq_33278461/article/details/90480525
以下几篇文章主要是用判别方法对域适应,有很多共性,主要讲一下第一篇,后面的作为对比参考,最后一篇ADDA是对利用判别方法作域适应的一个总结文章,它把这个过程抽象成了一个统一框架(推荐看一看)。

Learning from Synthetic Data: Addressing Domain Shift for Semantic Segmentation

Domain Adaptive在无监督语义分割上的应用_第1张图片

  • 主要贡献
    可以看出在源域训练,未经DA直接在目标域测试效果比经过DA的差很多。
    之前有一些工作直接在特征空间判别源域和目标域特征,以减少特征差异的方法。本文提出在生成空间判别(一种利用生成模型来对齐域之间的特征空间方法),这样效果会更好一些。
    Domain Adaptive在无监督语义分割上的应用_第2张图片
  • 四个子网络:
    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()
  • 网络结构
    Domain Adaptive在无监督语义分割上的应用_第3张图片

  • 效果:
    Domain Adaptive在无监督语义分割上的应用_第4张图片

  • 实验:
    1.输入大小不同的影响
    Domain Adaptive在无监督语义分割上的应用_第5张图片
    2.只用判别器和生成器、判别器全用
    3.用不用patch判别器
    4.用不用辅助分割loss

Domain Adaptive在无监督语义分割上的应用_第6张图片

Learning to Adapt Structured Output Space for Semantic Segmentation

  • 主要贡献:
    源域和目标域的分割任务输出是结构化的,具有空间和位置相似性。
    所以对分割的结果判别,这里采用的是mutil-level adversarial。
    Domain Adaptive在无监督语义分割上的应用_第7张图片
  • 效果:
    Domain Adaptive在无监督语义分割上的应用_第8张图片
  • 实验:
    1.mutil-level adversarial比 single level好。
    Domain Adaptive在无监督语义分割上的应用_第9张图片
    2.Output Space Adaptation比Feature
    Level上做对抗学习更好,而且对参数范围更不敏感。
    Domain Adaptive在无监督语义分割上的应用_第10张图片

Fully Convolutional Adaptation Networks for Semantic Segmentation∗

  • 主要贡献:
    提出AAN(Appearance Adaptation Network)和RAN(Representation Adaptation Network)分别在
    视觉外观和特征表示上域适应。 并且在判别器用ASPP模块空洞卷积增加感受野(基于patch的判别而不是单张图判别)
    Domain Adaptive在无监督语义分割上的应用_第11张图片

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

Domain Adaptive在无监督语义分割上的应用_第12张图片

  • 效果:

Domain Adaptive在无监督语义分割上的应用_第13张图片

Adversarial Discriminative Domain Adaptation

  • 主要贡献:
    提出了一个通用的对抗自适应框架。
    基于这个框架,提出一种新的对抗自适应算法。使用判别模型,不进行权重共享,使用GAN loss。
    Domain Adaptive在无监督语义分割上的应用_第14张图片

  • 主要研究以下几点:
    1)使用生成式模型还是判别式模型
    2)不同域的映射结构是否共享权重
    3)使用哪种对抗损失函数
    Domain Adaptive在无监督语义分割上的应用_第15张图片

  • 训练方式
    其实和之前的很多工作都差不多
    Domain Adaptive在无监督语义分割上的应用_第16张图片

你可能感兴趣的:(深度学习)