Few-shot Segmentation 论文阅读总结

本文概述了Few-shot Segmentation的任务设置,强调其利用少量样本进行学习的目标。介绍了四篇相关论文,包括One-Shot Learning for Semantic Segmentation、Conditional Networks for Few-Shot Semantic Segmentation、SG-One: Similarity Guidance Network以及PANet,详细解析了各论文的网络结构、训练和测试策略。这些工作旨在解决深度学习中通过少量样本进行有效学习的挑战。

 

目录

 

 

One-shot/Few-shot segmentation一般任务设置

paper 1:One-Shot Learning for Semantic Segmentation                     BMVC 2017

paper 2 : CONDITIONAL NETWORKS FOR FEW-SHOT SEMANTIC SEGMENTATION  ICLR 2018

paper 3:SG-One: Similarity Guidance Network for One-Shot Semantic Segmentation   

paper 4: PANet: Few-Shot Image Semantic Segmentation with Prototype Alignment       ICCV2019

相关论文


 

One-shot/Few-shot segmentation一般任务设置


  • 在测试任务上:通过利用很少的具有分割标签的support set 来获得query set上目标的分割结果;所以说对于query set 和 support set 两者的要求就是类别是相同的;
  • 训练任务的要求:训练任务的support set与query set都需要给出分割的mask, support  set 的mask是用于提供指导信息;query set mask用于计算预测损失,用于反向传播更新网络参数;
  • 训练任务与测试任务的要求:训练任务中的类别与测试任务中的类别需要是不同。

从问题设置角度来说,one-shot/few-shot segmentation 的终极目的是利用support 中的K个训练图像对来“学习”一个模型,使得该模型能对训练图像对中出现的类别的新样本能够实现分割。至于“学习”为什么加引号后面再说;首先乍一看,one-shot/few-shot 可真厉害,就用几个训练样本"学习"一下就可以对新样本进行分割;不过还是那句话 No free lunch ! 为了实现小样本的学习,前提是我们需要一个更大样本库;具体流程描述如下:

训练的时候,我们构建一系列训练任务,每个训练任务都包含K个图像对,每个图像对是指训练图像与其对应的mask,通过构建很多的训练任务来对模型进行训练;测试过程其实就是前面所说的one-shot/few-shot segmentation的终极目的。所以说,测试过程中support set 中图像的目的并不是为了学习,因为网络参数在训练过程结束的时候已经固定了,更准确来说它们应该是起到一种指导的作用;来指导网络利用已学得的知识进行"举一反三"。这就好比让你在做一种新类型的题目前先给你看一遍参考答案的解题过程;然后让你学会做这种类型的题目。这时候又突然想到这与迁移学习的区别,同样借这个比方来解释一下迁移学习,迁移学习就是在做题目前你已经刷题无数,但是恰好现在的题目没见过,咋办,重新找和现在已有题目相似的题目重刷一遍,更新知识库,再去做题。所以当前的深度学习大部分情况下只能从头开始训练。使用Fine-tune来学习新任务,而Meta Learning 就是研究如何让神经网络很好的利用以往的知识,使得能根据新任务的调整自己。


paper 1:One-Shot Learning for Semantic Segmentation                     BMVC 2017

问题设置:

 

 

 

网络结构

本文首次提出双分支的网络用于few-shot segmentation,使用conditioning branch直接预测segmentation branch的权重参数,对segmentation branch提取到的特征进行加权融合,经过上采样后得到分割结果。每个网络分支的细节如下:

conditioning branch:

  • 输入将原始三通道彩色图像与其中目标对应的mask相乘得到,这样就保证了输入只包含目标的信息。

  • 输出的时候,为了是参数量与segmentation branch的特征图的通道数相对应,采用weight hashing的策略,将输出的1000维向量映射为4097维(w:4096, b:1),论文中是把这种映射机制建模成固定权重参数的全

为了复现 *Domain-Rectifying Adapter for Cross-Domain Few-Shot Segmentation* 这篇论文中的方法和实验,需要按照论文中描述的模型结构、训练策略、数据处理方式以及评估指标进行系统性实现。以下是一个详细的复现指南: ### 模型架构与组件 论文中提出了一种领域修正适配器(Domain-Rectifying Adapter),其主要目标是在跨域少样本分割(CD-FSS)任务中提升模型的泛化能力。该方法基于一个少样本分割的基线模型(SSP),并在其主干网络(ResNet-50)上引入了扰动模块,用于增强模型对不同领域数据的适应性。 - **主干网络**:使用 ResNet-50 作为特征提取器,扰动模块应用于 ResNet 的前三个层,以增强模型对输入特征的鲁棒性[^3]。 - **扰动模块**:分为局部扰动和全局扰动两个部分。局部扰动通过在 ResNet 的前三个层中添加均值为 0、标准差为 0.75 的高斯噪声来实现;全局扰动则是在整个特征图上添加均值为 0、标准差为 1 的高斯噪声[^3]。 - **适配器结构**:该适配器模块被插入到主干网络中,用于调整特征表示,使其更适应目标领域的分布。 ### 训练设置与超参数 为了确保实验的可复现性,论文中提供了详细的训练设置和超参数配置: - **优化器**:使用随机梯度下降(SGD),动量设置为 0.9,初始学习率为 1e-3。 - **图像尺寸**:所有输入图像被统一调整为 400×400 的分辨率。 - **Batch Size**:训练过程中使用的 batch size 为 8。 - **训练轮数(Epoch)**:整个训练过程共进行 5 个 epoch。 ### 数据集与预处理 - **数据集**:论文中使用的数据集包括多个领域,用于构建 CD-FSS 基准数据集。这些数据集涵盖了不同的图像域,如自然图像、医学图像等。 - **数据增强**:在训练过程中,应用了数据增强技术,包括随机裁剪、旋转、颜色抖动等,以提高模型的泛化能力。 - **任务采样**:在少样本学习设置下,每个训练任务从支持集中随机选取少量样本(例如 1-shot 或 5-shot),并结合查询集进行训练。 ### 评估指标 - **评估方式**:使用平均交并比(mIOU, mean Intersection over Union)作为主要评估指标,该指标越大表示模型的分割性能越好。 - **测试阶段**:在测试阶段,模型需要在未见过的领域上进行少样本分割任务,评估其对新领域的适应能力。 ### 代码实现建议 以下是一个简化的代码框架,用于实现该论文中的方法: ```python import torch import torch.nn as nn import torch.optim as optim from torchvision import models class DomainRectifyingAdapter(nn.Module): def __init__(self, backbone): super(DomainRectifyingAdapter, self).__init__() self.backbone = backbone self.adapter = nn.Sequential( nn.Conv2d(256, 256, kernel_size=3, padding=1), nn.BatchNorm2d(256), nn.ReLU() ) # 局部扰动层 self.local_noise = GaussianNoise(mean=0, std=0.75) # 全局扰动层 self.global_noise = GaussianNoise(mean=0, std=1) def forward(self, x): features = [] for i, layer in enumerate(self.backbone.children()): if i < 3: x = layer(x) x = self.local_noise(x) else: x = layer(x) features.append(x) x = self.adapter(features[-1]) x = self.global_noise(x) return x class GaussianNoise(nn.Module): def __init__(self, mean=0, std=1): super(GaussianNoise, self).__init__() self.mean = mean self.std = std def forward(self, x): if self.training: noise = torch.randn_like(x) * self.std + self.mean return x + noise else: return x # 初始化模型 resnet50 = models.resnet50(pretrained=True) model = DomainRectifyingAdapter(resnet50) # 设置优化器 optimizer = optim.SGD(model.parameters(), lr=1e-3, momentum=0.9) # 定义损失函数 criterion = nn.CrossEntropyLoss() # 训练循环 for epoch in range(5): for images, labels in train_loader: images, labels = images.to(device), labels.to(device) outputs = model(images) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() ``` ### 实验注意事项 1. **数据集划分**:确保训练集、验证集和测试集的划分符合 CD-FSS 的设定,即训练阶段使用源域数据,验证和测试阶段使用目标域数据。 2. **任务采样策略**:在每个训练迭代中,应从支持集中随机采样少量样本,并结合查询集进行训练,以模拟少样本学习的设置。 3. **超参数调优**:虽然论文中提供了默认的超参数设置,但在实际复现过程中,可能需要根据具体硬件环境和数据集特性进行微调。 4. **评估方式**:在测试阶段,使用 mIOU 作为主要评估指标,并确保评估过程与论文中描述的一致。 ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperLee188

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值