NeurIPS 2022 | 南理工/百度/中科院提出SVF:小样本分割新范式!

点击下方卡片,关注“CVer”公众号

AI/CV重磅干货,第一时间送达

作者:syp2ysy  |  已授权转载(源:知乎)编辑:CVer

https://zhuanlan.zhihu.com/p/564674487

3139cc5f50a06be30ffaa03c74fde9c9.jpeg

Singular Value Fine-tuning: Few-shot Segmentation requires Few-parameters Fine-tuning

论文:https://arxiv.org/abs/2206.06122

代码:https://github.com/syp2ysy/SVF

1、引言

小样本分割的目的是利用少量densely-annotated样本分割出图像中的新类objects。在之前的工作中研究人员通过设计不同的分割头,使模型从少量样本中学习到尽量多的关于新类的知识,以提升few-shot seg的性能。然而众多few-shot seg的方法中有一个通用的设置---freeze backbone(冻结主干网络的参数)。因此传统few-shot seg模型的范式就是freeze backbone + seg head。众所周知,多数任务中finetune 会使backbone更加适应下游任务从而取得优越的性能。因此我们产生了疑惑-- few-shot seg 任务中freeze backbone是否是唯一的选择?能否通过fine-tune backbone来提高few-shot seg model的性能?

我们把传统的fine-tune backbone的方法分为fully fine-tune(微调整个backbone)和part fine-tune(微调backbone的部分参数)。因此我们在同一个few-shot seg model上对不同的fine-tune方法进行了实验。实验结果如下所示;我们发现无论是那种fine-tune方式都会出现过拟合现象 (training set表现优秀,test set表现拉夸)。

6df00b17f8382835d1384749094ee8b0.jpeg
(a) free-backbone, (b)fine-tuning part layer, (c) fine-tuning part conv (d) fully fine-tune

我们猜测导致这种结果出现的原因有两个,第一个是由于few-shot seg独特的属性,training set中学习的类,是不会在test set中出现的,因此传统fine-tune方法使backbone更加适应training set中的类,从而影响了模型泛化到test set的能力;第二个是由于few-shot中的样本数量太少,从而极容易导致过拟合情况的发生。

为了找到few-shot seg中合适的fine-tune方法,我们尝试分析freeze backbone的成功原因。因为few-shot seg中学习的所有类别的知识(我们称之为语义线索)都存在于pre-train weight中(因为voc & coco中所有类别均在imagenet中的出现过)。所以freeze backbone可以保证pre-train中的语义线索不会丢失。但是有一个新问题出现--pre-train中所有的语义线索都是有利于few-shot seg 任务的吗?我们认为并不是的,那如何动态调整pre-train中语义线索的重要程度并不改变pre-train中的语义线索成为我们设计新fine-tune方法的初衷。

pre-trian weight实际上是不同的张量组成,那么如何提取weight中的语义线索,也就转化成为如何从一个张量中获取其中的主成分。我们想到了SVD分解,因为SVD分解会得到特征值和特征向量,而这与我们的初衷契合,特征值可以表示初始pre-train中不同语义线索的权重,而特征向量表示pre-train中不同的语义线索。这样的话我们只需要在训练过程中fine-tune pre-train weight的特征值就可以了。这就是我们SVF的核心思想。

2、方法介绍

核心思想--不改变pre-train中的语义线索,而改变不同语义线索的权重;

使用工具--SVD分解

SVF的实现过程也非常简单,其与传统范式的区别如下图所示。不同与传统范式中freeze backbone的做法,SVF首先对pre-train weight进行SVD分解,然后freeze住特征向量空间U和V的参数,而放开特征值空间S的学习。由于SVF是针对backbone进行的,因此适用于大多数的few-shot seg 模型。

a20016d723778ce43d272ddc9c615b2b.jpeg

087e479033eb8362f4020bcf4974bd54.png

SVF的伪代码如下:

03af9ea8ad1b5857aabf24df07e6e291.jpeg

3、实验分析

首先,为了验证方法的有效性和通用性,我们分别在三种不同的方法上进行了实验。这三种方法分别是PFENet, BAM和baseline,其中baseline是将PFENet中的head替换成了ASPP。Pascal-5i和COCO-20i上的实验结果如下。

58370acec8f8b4d02a1d45e9a5429edd.jpeg 168d66a2a02b551be6883e1378dd547d.jpeg

我们可以看到SVF可以很大程度上提高few-shot model的性能,同时不同的方法上的表现是一致的,表明SVF在few-shot seg中是一种通用且有效的新范式。此外论文的补充材料中也有与更多方法的公平对比结果。同时论文中讨论了few-shot seg中的dataset trick对模型性能的影响。

此外,我们探讨SVF成功的原因。SVF的初衷是在不改变pre-train weight的语义线索的前提下,动态调整不同语义线索的权重。首先SVF fine-tune 结束后我们统计了特征值空间S的变化,下图,我们统计了layer3中最后一个3x3卷积层和1x1卷积层中特征值变化最大的TOP-30.我们发现在某些特征值的改变是非常明显的,那么我们分别对特征值降低最大和增长最大的特征值进行可视化。

14afcd18cdae7f02045a9554e436f35b.jpeg 765a995e9e54eba238fb51f861050e4d.jpeg

上述可视化结果中(a)表示特征值降低最大的语义线索,(b)表示特征值增长最大的语义线索。我们发现特征值降低最大是背景信息,这是不利于few-shot seg的,而特征值增长最大的语义线索确实更加关注object的前景。这也印证了我们的假设,pre-train weight中的语义线索并不是都有利于我们的下游任务的。因此在few-shot seg中SVF成功的关键是不破坏pre-train中的语义线索,动态调整不同语义线索的权重。

本文简单的介绍了SVF的研究动机,方法介绍和简单实验分析其有效性。paper中有这更加详细的讨论,并且有更详细的细节描述。希望我们的工作能够给 few-shot segmentation带来一些有意思的讨论。同时欢迎大家关注和提意见。

点击进入—> CV 微信技术交流群

CVPR 2022论文和代码下载

 
 

后台回复:CVPR2022,即可下载CVPR 2022论文和代码开源的论文合集

后台回复:Transformer综述,即可下载最新的3篇Transformer综述PDF

图像分割 交流群成立
扫描下方二维码,或者添加微信:CVer222,即可添加CVer小助手微信,便可申请加入CVer-图像分割 微信交流群。另外其他垂直方向已涵盖:目标检测、图像分割、目标跟踪、人脸检测&识别、OCR、姿态估计、超分辨率、SLAM、医疗影像、Re-ID、GAN、NAS、深度估计、自动驾驶、强化学习、车道线检测、模型剪枝&压缩、去噪、去雾、去雨、风格迁移、遥感图像、行为识别、视频理解、图像融合、图像检索、论文投稿&交流、PyTorch、TensorFlow和Transformer等。
一定要备注:研究方向+地点+学校/公司+昵称(如图像分割+上海+上交+卡卡),根据格式备注,可更快被通过且邀请进群

▲扫码或加微信号: CVer222,进交流群
CVer学术交流群(知识星球)来了!想要了解最新最快最好的CV/DL/ML论文速递、优质开源项目、学习教程和实战训练等资料,欢迎扫描下方二维码,加入CVer学术交流群,已汇集数千人!

▲扫码进群
▲点击上方卡片,关注CVer公众号
 
 
整理不易,请点赞和在看
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是上一段代码的测试代码 需要输出成功 #include "Assignment-3.h" #include "SVF-LLVM/LLVMUtil.h" #include "SVF-LLVM/SVFIRBuilder.h" #include "WPA/Andersen.h" #include "Util/Options.h" #include "Util/CommandLine.h" void Test1() { SVF::SVFModule *svfModule = SVF::LLVMModuleSet::getLLVMModuleSet()->buildSVFModule({"./Assignment-3/testcase/bc/no_alias.ll"}); /// Build Program Assignment Graph (SVFIR) SVF::SVFIRBuilder builder(svfModule); SVF::SVFIR *pag = builder.build(); pag->dump ("./Assignment-3/testcase/dot/no_alias_init"); AndersenPTA *andersenPTA = new AndersenPTA(pag); andersenPTA->analyze(); andersenPTA->dump_consCG("./Assignment-3/testcase/dot/no_alias_final"); delete andersenPTA; SVF::LLVMModuleSet::releaseLLVMModuleSet(); SVF::SVFIR::releaseSVFIR(); } void Test2() { SVF::SVFModule *svfModule = SVF::LLVMModuleSet::getLLVMModuleSet()->buildSVFModule({"./Assignment-3/testcase/bc/CI-global.ll"}); /// Build Program Assignment Graph (SVFIR) SVF::SVFIRBuilder builder(svfModule); SVF::SVFIR *pag = builder.build(); pag->dump ("./Assignment-3/testcase/dot/CI-global_init"); AndersenPTA *andersenPTA = new AndersenPTA(pag); andersenPTA->analyze(); andersenPTA->dump_consCG("./Assignment-3/testcase/dot/CI-global_final"); delete andersenPTA; SVF::SVFIR::releaseSVFIR(); SVF::LLVMModuleSet::releaseLLVMModuleSet(); } void Test3() { SVF::SVFModule *svfModule = SVF::LLVMModuleSet::getLLVMModuleSet()->buildSVFModule({"./Assignment-3/testcase/bc/CI-local.ll"}); /// Build Program Assignment Graph (SVFIR) SVF::SVFIRBuilder builder(svfModule); SVF::SVFIR *pag = builder.build(); pag->dump ("./Assignment-3/testcase/dot/CI-local_init"); AndersenPTA *andersenPTA = new AndersenPTA(pag); andersenPTA->analyze(); andersenPTA->dump_consCG("./Assignment-3/testcase/dot/CI-local_final"); SVF::LLVMModuleSet::releaseLLVMModuleSet(); SVF::SVFIR::releaseSVFIR(); delete andersenPTA; } void Test() { Test1(); Test2(); Test3(); } int main(int argc, char ** argv) { int arg_num = 0; int extraArgc = 1; char **arg_value = new char [argc + extraArgc]; for (; arg_num < argc; ++arg_num) { arg_value[arg_num] = argv[arg_num]; } // You may comment it to see the details of the analysis arg_value[arg_num++] = (char) "-stat=false"; std::vectorstd::string moduleNameVec; moduleNameVec = OptionBase::parseOptions( arg_num, arg_value, "Teaching-Software-Analysis Assignment 3", "[options]" ); Test(); return 0; }
05-22

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值