论文分享|ECCV2022,PATnet,Cross-Domain Few-Shot Semantic Segmentation,CDFSS新基准,文末有复现教程
这篇论文提出的跨域小样本语义分割(CD-FSS)任务,旨在将源域学习的分割能力迁移到目标域,仅需少量标注样本。针对传统小样本分割方法在跨域场景性能下降的问题,作者提出了基于金字塔锚点变换的网络(PATNet),通过将域相关特征转换为域无关特征,并引入任务自适应微调推理(TFI)提升目标域适应能力。实验表明,PATNet在1-shot和5-shot设置下分别比现有方法提升8.49%和10.61%的准
论文分享|ECCV2022,PATnet,Cross-Domain Few-Shot Semantic Segmentation,CDFSS新基准,文末有复现教程
论文标题: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 = ∅ (源域和目标域的类别完全不同)。
- 训练约束: 模型只能在源域数据上训练,不能访问目标域数据(除了最终测试时的少量支持集)。
贡献
- 提出CD-FSS任务
- 搞了两个指标评估跨域的这个任务的难度
- 自己提出了PATNet模型里面的两个模块PATM和TFI有创新且有效
- 发现现有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,l∣af,l,∣ab,l∣ab,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)i∑iFl,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,ls∣pf,ls,∣pb,ls∣pb,ls]。
接下来是求解变换矩阵,通过伪逆最小二乘解, W l = A l ⋅ P l s + W_l = A_l · P_l^{s+} Wl=Al⋅Pls+。也就是寻找使 W l ⋅ P l s ≈ A l W_l · P_l^s ≈ A_l Wl⋅Pls≈Al的线性变换,将源域原型映射到锚点定义的域无关空间。
最后使用查询集特征和支持集特征构建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改对。
结果展示:
更多推荐
所有评论(0)