详细记录Few-Shot Semantic Segmentation的框架笔记
Few-Shot Semantic Segmentation
任务: 以one-shot为例,在support set 中,给定新类(比如狗)的一张图片(或多张图片,比如few-shot,就是多张)以及对应的分割mask(label),这里需要注意,这里的新类(狗)并没有出现在训练任务中。然后在quiery set 给定一张含新类(狗)的图片,需要准确地对这张图片进行分割。这个问题简单说就是:给你一张有mask的图片,比如图片中这是一只狗,然后给你其他新的图片,你还能知道哪个是狗并分割出来,这如何做到的呢?
1、训练
构建很多训练任务,以VOC数据集为例,有20个类别,拿15个类别作为训练任务,5个类别作为测试任务。在训练的时候,比如训练分割飞机的任务,训练分割车的任务等等,当然可以针对15个类别都构建一个训练任务。以训练分割飞机的任务为例:训练任务中support set 和query set会给定mask,利用support set 的mask作为指导,query set 的mask用于计算损失函数。这个和具体算法相关。
直白的理解就是:训练的时候,模型已经学会了如何做分割的方式(可认为是先验知识或经验),当你做测试时候,只需要按学会的方式去分割就可以了(举一反三)。这跟迁移学习的区别在于:迁移学习需要在大量数据中先训练一个模型,做新任务时去Fine-tune就行,所以训练数据和测试数据需要相近。主要区别就是,当碰到新类别/没见过数据,前者直接按照训练学会的经验就能完成,后者要么去Fine-tune或重新训练。而Meta Learning 则可以很好的利用以往的知识,能根据新任务的调整自己。
2、一般框架
- Fine-Tuning based:调参过程依赖先验知识,参数量大,容易过拟合
- two-branch based:一条分支学习参数,,提供指导信息,另一条分支动态更新参数
- Metric Learning Based:计算 Support Image 和 Query Image 之间的相似度
3、One-Shot Learning for Semantic Segmentation
过程: 构建好训练任务后,比如分割狗的任务,条件分支输入狗的图片,根据 mask提取对应目标区域,经过VGG后提取1000维度的特征向量。然后通过权重哈希(可理解为固定权重的全连接层,映射得到的向量,即下面公式的W权重是固定的)的方法变为4097维的向量。分割分支也输入一张图片,经过FCN-32s,32倍下采样后提取通道为4096的特征图,针对每个像素点都是4096维度,利用条件分支的4096+1的向量进行逻辑回归,进过**函数后得到预测掩码,最后对预测掩码通过双线性插值上采样32倍,恢复原图大小,最后得到分割图像。通过最大化预测的对数似然进行参数更新。
采样:VOC数据集中采样查询集图像Q和对应的语义分割图Y(包含所有物体分割,如狗,车,船,飞机等),选择要分割的类别(狗),并得到对应的mask,从VOC数据集中包含类别(狗)的图片中,先去除Q,采样得到支持集S
2、