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

本文介绍了域适应在分割上的几个应用,包括多篇相关文章。如第一篇文章提出在生成空间判别以减少特征差异;第二篇采用 mutil - level adversarial 对分割结果判别;第三篇提出 AAN 和 RAN 进行域适应;第四篇提出 FCN - based 无监督域适应网络;最后一篇提出通用对抗自适应框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

不了解Domain adaptive可以先看看简介:https://blog.youkuaiyun.com/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)使用哪种对抗损失函数
    在这里插入图片描述

  • 训练方式
    其实和之前的很多工作都差不多
    在这里插入图片描述

### 关于弱监督学习在乳腺超声图像语义分割中的应用 弱监督学习是一种利用不完全标注数据(如图像级标签而非像素级掩码)来训练模型的方法,在医学影像分析领域具有重要意义。对于乳腺超声图像的语义分割任务,这种方法可以显著降低人工标注的成本和时间开销。 #### 弱监督学习的核心概念 弱监督学习通过使用较少的信息量作为输入来进行模型训练,常见的形式包括图像级别的标签、边界框或其他间接提示[^3]。这些信息被用来指导网络提取目标区域的关键特征并完成分割任务。 #### 基于弱监督学习的乳腺超声图像分割方法 近年来,研究者提出了多种基于弱监督学习的技术用于解决乳腺超声图像的语义分割问题: 1. **多实例学习 (Multiple Instance Learning, MIL)** 多实例学习允许仅依赖图像级别标签进行训练,而不需提供具体的像素标记位置。例如,有研究表明MIL框架能够有效应用于乳腺肿块检测与分割中,其核心在于设计特定池化策略以捕捉最具代表性的实例特征[^4]。 2. **伪标签生成技术** 利用预训练好的全监督模型预测初始分割图谱,并以此为基础构建高质量伪标签集合供后续迭代优化过程使用。此方式可逐步提升最终输出精度水平的同时保持较低的人工干预需求程度[^5]。 3. **自适应阈值调整机制结合注意力模块** 部分工作探索了如何动态设定决策界限以及增强局部细节表达能力两者相结合的方式改进传统FCN架构表现效果。具体而言就是引入额外损失项鼓励网络关注感兴趣部位同时抑制背景干扰因素影响从而达到更好分离前景物体的目的[^6]。 以下是实现上述思路的一个简单代码片段展示: ```python import torch.nn as nn class WeaklySupervisedSegmentationModel(nn.Module): def __init__(self): super(WeaklySupervisedSegmentationModel, self).__init__() # Backbone network such as ResNet or Swin Transformer self.backbone = ... # Attention mechanism to focus on important regions self.attention_layer = ... # Final segmentation head with adaptive thresholding self.segmentation_head = ... def forward(self, x): features = self.backbone(x) attended_features = self.attention_layer(features) output = self.segmentation_head(attended_features) return output ``` 以上介绍了几种主流方向及其对应解决方案概览;值得注意的是每种方案都有各自适用场景及局限之处需要根据实际项目情况灵活选用合适工具链组合起来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值