论文标题:Cross-Domain Few-Shot Semantic Segmentation
作者:Virginia Tech、美国NEC lab、北航杜博文老师
发表信息:European conference on computer vision. Cham: Springer Nature Switzerland, 2022.
论文地址:https://www.semanticscholar.org/paper/Cross-Domain-Few-Shot-Semantic-Segmentation-Lei-Zhang/cf17dfa43a679766f0f647f2695d2c77b51b6382
开源信息:已开源,开源地址https://github.com/slei109/PATNet,数据集模型训练预测全部开源了,readme写的不是很清楚,然后版本有点老旧,复现难度中等,本蒟蒻已成功复现,具体步骤见本文末尾。

论文摘要:
Few-shot semantic segmentation aims at learning to segment a novel object class with only a few annotated examples. Most existing methods consider a setting where base classes are sampled from the same domain as the novel classes. However, in many applications, collecting sufficient training data for meta-learning is infeasible or impossible. In this paper, we extend few-shot semantic segmentation to a new task, called Cross-Domain Few-Shot Semantic Segmentation (CD-FSS), which aims to generalize the meta-knowledge from domains with sufficient training labels to low-resource domains. Moreover, a new benchmark for the CD-FSS task is established and characterized by a task difficulty measurement. We evaluate both representative few-shot segmentation methods and transfer learning based methods on the proposed benchmark and find that current few-shot segmentation methods fail to address CD-FSS. To tackle the challenging CD-FSS problem, we propose a novel Pyramid-Anchor-Transformation based few-shot segmentation network (PATNet), in which domain-specific features are transformed into domain-agnostic ones for downstream segmentation modules to fast adapt to unseen domains. Our model outperforms the state-of-the-art few-shot segmentation method in CD-FSS by 8.49% and 10.61% average accuracies in 1-shot and 5-shot, respectively. Code and datasets are available at https://github.com/slei109/PATNet.

研究背景与动机

​​传统小样本语义分割 (FSS) 的局限

FSS:学习用少量标注样本分割训练阶段未见过的​​新类别​​。
假设:训练阶段的基础类 (base classes) 和测试阶段的新类 (novel classes) ​​来自同一个视觉领域 (同一数据分布)​​。例如,都是在自然图像 (如PASCAL VOC) 上训练和测试。
问题:现实世界中,我们常常需要在​​全新、低资源​​的领域应用模型(如医学影像、卫星图像),而这些领域与训练数据的分布差异巨大,且标注极少。传统FSS方法在这种​​跨域​​场景下性能会严重下降。

​​提出新任务:CD-FSS

​​目标:​​ 将在​​源域​​ (source domain, 如PASCAL VOC自然图像) 学到的分割能力,泛化到​​目标域​​ (target domain, 如医学X光片、卫星图像),仅用目标域中少量(K-shot)标注样本就能分割该目标域中的新类别。

这个任务CD-FSS与FSS的区别就在于跨域,也很好理解,这里的域指的是领域,比如从自然图像到医学图像,就是不同的领域,在自然图像上训练(源域)在医学图像上测试(目标域)就是跨域。

动机图

在这里插入图片描述
解释动机图:
第一排是跨域语义分割,Xs ≠ Xt, Ys = Yt。训练时可访问目标域数据(无标签),目标是适应到​​相同类别​​的不同分布。
第二排是标准小样本分割,Xs = Xt, Ys ≠ Yt。训练和测试数据分布相同(比如都是自然图像),但类别不同(测试集要分割的东西不可能在训练集出现)。
第三排就是作者提出的CD-FSS,Xs ≠ Xt, Ys ≠ Yt。​​数据分布和类别都不同​​,且测试时只能用目标域的少量样本。

关键挑战在于:

  • ​​领域偏移:​​ Xs ≠ Xt (源域和目标域数据分布不同)。
  • 类别不相交:​​ Ys ∩ Yt = ∅ (源域和目标域的类别完全不同)。
  • ​训练约束:​​ 模型​​只能​​在源域数据上训练,​​不能​​访问目标域数据(除了最终测试时的少量支持集)。

贡献

  1. 提出CD-FSS任务
  2. 搞了两个指标评估跨域的这个任务的难度
  3. 自己提出了PATNet模型里面的两个模块PATM和TFI有创新且有效
  4. 发现现有FSS模型不如普通迁移模型,而自己的模型比这些模型性能都好很多。

模型: PATNet

作者提出 ​​Pyramid Anchor-based Transformation Network (PATNet)​​ 来解决CD-FSS的核心挑战:​​将域相关特征转化为域无关特征​​,使得下游分割模块能在稳定空间中进行匹配。
​​核心思想:​​ 学习一个变换,将不同域的输入特征映射到一个​​共享的、域无关的度量空间​​。在此空间中,同一类别的特征(即使来自不同域)应彼此接近,不同类的彼此远离。

模型图

在这里插入图片描述
黄色部分是可学习的,蓝色部分是冻结的不更新的。

特征提取骨干 (Feature Extraction Backbone)

对应模型图左上角蓝色框框里面的,跟大多数FSS方法一样。
输入:支持图像+掩码 (Is, Ms) 和查询图像 Iq。
输出:提取多层级(金字塔)特征图。常用VGG-16或ResNet-50(ImageNet预训练,​​训练时冻结​​)。

基于金字塔锚点的转换模块(Pyramid Anchor-based Transformation Module, PATM)

目的:​​ 对骨干提取的​​每一层特征图​​,应用一个线性变换矩阵 W l W_l Wl,将其从域相关空间变换到域无关空间。

关键组件 - 锚点层 (Anchor Layers):​​
为减少参数量,​​仅为不同维度的特征层级​​(如低维conv3、中维conv4、高维conv5)​​分别设置一个可学习的锚点层权重矩阵 A l A_l Al​​( A l = [ a f , l ∣ a f , l ∣ , a b , l ∣ a b , l ∣ ] A_l = [ \frac{a_{f,l}}{|a_{f,l}|}, \frac{a_{b,l}}{|a_{b,l}|} ] Al=[af,laf,l,ab,lab,l] a f , l a_{f,l} af,l是前景锚点向量, b f , l b_{f,l} bf,l是背景锚点向量)。
这个锚点层的特点:参数可学习、同维度特征共享、分层次设置(低/中/高层)

变换矩阵 W l W_l Wl计算流程​:
先算前景原型: p f , l s = ∑ i F l , i s ⋅ ζ l ( M s ) i ∑ i ζ l ( M s ) i p_{f,l}^s = \frac{\sum_{i} \mathbf{F}_{l,i}^{s} \cdot \zeta_l(\mathbf{M}^s)_i}{\sum_{i} \zeta_l(\mathbf{M}^s)_i} pf,ls=iζl(Ms)iiFl,isζl(Ms)i。然后背景原型跟前景是相似的,只不过用的是背景区域。最后得到的原型矩阵是 ​​ P l s = [ p f , l s ∣ p f , l s ∣ , p b , l s ∣ p b , l s ∣ ] ​​P_l^s = [ \frac{p_{f,l}^s}{|p_{f,l}^s|}, \frac{p_{b,l}^s}{|p_{b,l}^s|} ] ​​Pls=[pf,lspf,ls,pb,lspb,ls]
接下来是求解变换矩阵,通过伪逆最小二乘解, W l = A l ⋅ P l s + W_l = A_l · P_l^{s+} Wl=AlPls+。也就是寻找使 W l ⋅ P l s ≈ A l W_l · P_l^s ≈ A_l WlPlsAl的线性变换,将源域原型映射到锚点定义的域无关空间。

最后使用查询集特征和支持集特征构建4D相关性图即可。
在这里插入图片描述

任务自适应微调推理 (Task-adaptive Fine-tuning Inference - TFI)

目的:​​ 在​​测试/推理阶段​​,利用当前任务的支持集信息,对模型进行​​快速微调,进一步提升在​​具体目标域任务​​上的分割精度,避免过拟合。
​​关键:​​ ​​只微调PATM中的锚点层参数​​,保持骨干和分割模块冻结。轻量高效。
先冻结所有参数,用当前支持集 (Is, Ms) 和查询图像 Iq 通过模型得到初始预测掩码。再​​微调锚点层,计算​​前景原型相似性的KL散度损失( L k l L_{kl} Lkl),​​仅优化PATM中的锚点层参数​​,进行若干次迭代。​​最终预测时,冻结所有参数(包括微调后的锚点层),再次用相同的支持集和查询图像通过模型,得到​​最终优化的预测掩码。
​​原理:​​ 如果模型预测准确,查询图像的前景区域特征应接近支持集前景原型。 L k l L_{kl} Lkl 强制模型调整锚点层,使得变换后的查询特征能更好地与支持原型对齐。微调后的变换更适应当前目标域任务。
在这里插入图片描述

实验

Benchmark

在这里插入图片描述
每个领域的任务难度从两个方面来衡量:
(1) 域偏移(跨数据集)【指标FID】
(2) 单个图像中的类别区分(在数据集内)【指标DisFB】

作者建立了一个​​CD-FSS评测基准​​,包含4个与PASCAL VOC (源域) ​​视觉差异大​​的目标域:
​​Deepglobe:​​ 卫星图像(城郊、农田等)。​​域偏移中等​​。
​​ISIC2018:​​ 皮肤镜图像(皮肤病变)。​​域偏移大​​。
​​Chest X-ray:​​ X光胸片(结核病区域)。​​域偏移大​​,且是灰度图。
​​FSS-1000:​​ 自然图像(1000类物体子集)。​​域偏移小​​(最接近PASCAL VOC),作为“简单”参照。
​​评估指标:​​ Mean Intersection over Union (mIoU)。

主实验

在这里插入图片描述
现有FSS方法,在域偏移大的目标域(ISIC, Chest X-ray),性能​​严重下降​​。
在Deepglobe和Chest X-ray上,一些FSS方法甚至​​不如简单的迁移学习基线​​(如1NNDeeplab, LinearDeeplab)。
在​​所有4个目标域​​上,PATNet (ResNet-50) ​​显著优于所有基线方法​​。

消融实验

在这里插入图片描述
在这里插入图片描述

可视化展示

在这里插入图片描述

个人看法总结

CD-FSS的开山之作,提出了这个任务,然后解决这个问题的思路也很清楚,就是把相关特征转为域无关特征,但是具体做法那一块感觉写的不是很清楚,本小白读起来很吃力,公式符号还有啥锚点啥的,理解起来花了比较久。然后这个方法的模型性能还是可以的,在一些最近的CD-FSS的文章里面,也大部分都是second-best的存在,说明这个模型还是有可取之处的。

代码复现教程

本小白花了一整天时间复现这个,踩了很多坑,记录一下,希望能对大家有帮助。
首先,作者的readme里面只说了要下这个VOCdevkit和VOC的这个语义分割扩展,我根据代码反推猜测可能目录这样放,这样放我反正是运行起来了,要把数据集结构放成下面这样(首先先下载VOCdevkit.zip,然后解压缩,再下载SegmentationClassAug,把这个SegmentationClassAug放到解压后的VOC2012文件夹里面):
在这里插入图片描述
这里面的JPEGImages就是原始图像,然后SegmentationClassAug里面就是语义分割的标签,Annotations里面是xml,是对图片打的标签。然后SegmentationObject是目标检测任务时候用的。

最关键的是配置环境这一部分,作者给的版本太老,会出问题
在这里插入图片描述
这个cuda10.1太老了,基本找不到维护这个版本的navidia-smi了。我的navidia-smi是12.4的,其它我都是按照这个requirements配的,会在调用模型的时候突然进程中断(根本都不进入forward里面,在内部库函数的时候就断了),也不报错,断点调试也找不到问题,尝试了网上说的很多方法都解决不了,显存也没有爆,使用try exception也捕捉不到问题,进程就是会直接中断。我用pycharm直接运行就给我直接退出了,logger里面也没有任何信息,使用终端跑的时候还是给我报了一个已放弃(核心已转储),后面觉得可能是cuda版本的问题,然后也是吸取了经验,nvcc nvidia-smi torch 这3个的版本都要一致,对于这种古董项目,不一定非要用他给的requirements,尤其是不涉及一些特定的库的时候,直接用最适合你nvidia-smi的CUDA版本即可。总而言之,建议使用我这个版本的requirements:
在这里插入图片描述
然后CUDA Version: 12.4
具体操作执行步骤:

conda create -n patnet python=3.8
conda activate patnet
conda install pytorch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 pytorch-cuda=12.1 -c pytorch -c nvidia
pip install tensorboardX

然后train.py是主函数,要先把这里面的路径配置好:
在这里插入图片描述
模型选resnet50,运行之后就会自动下载,然后现在好了之后还会有一个model.to(device)的操作,第一次执行会大概花个7-8分钟,耐心等待。

数据集这一块感觉他写的怪怪的,比如他传了一个’0’,但实际要一个int类型的,我改成了现在下面这样,是可以运行的:
在这里插入图片描述
然后在pascal.py里面要配置路径,他原来写的相对路径有点问题,我改了半天相对路径也没改好,索性就直接写了绝对路径了,你们也可以这样配一下。
在这里插入图片描述
然后logger.py里面,每次都会mkdir,已经存在再创建就会报错了,建议改成下面这样:
在这里插入图片描述
最后便能轻松愉快的炼丹啦:
在这里插入图片描述
最后说一下测试,还是先按照他给的链接下载并解压,我这没处理的特别好,目录是:
在这里插入图片描述
然后就只能改test.py里面的主函数的路径:
在这里插入图片描述
然后把fss.py里面的也对应改过来:
在这里插入图片描述
我这样写可能扩展性不是很好,换别的测试集上可能要改动不少,不过也不管了,反正思路是路径要调正确,在test.py和对应数据集.py改对。

结果展示:
在这里插入图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐