chunbolang / BAM

Official PyTorch Implementation of Learning What Not to Segment: A New Perspective on Few-Shot Segmentation (CVPR'22 Oral & TPAMI'23).
MIT License
249 stars 43 forks source link

关于您给的pascal-5i base annotation数据集的问题 #63

Open cs-xiyan opened 7 months ago

cs-xiyan commented 7 months ago

pascal-5i是从20个类别挑选五个作为查询集,剩下15个作为支持集,不同I代表不同采样方法,可是您给的base annotation,i无论是0还是3,无论是train还是val都只是1-15类。这是为什么呢? image image image

cs-xiyan commented 7 months ago

我好像理解怎么回事了,BAM 中的base_annotation实际上只是产生了支持集,被用于pspnet的训练,也就是支持分支,他是两段式训练。虽然都是1-15但是实际上包含了不同类别。不知道这样解释是否正确。

qjmltz commented 6 months ago

您好,我刚开始研究FSS,请问您知道为什么在BAM之前的模型,像是PFEnet和HSNenet、SSP都没有用到base_annotation,而为什么BAM用到base_annotation?HSNenet和SSP虽然有下载VOC2012的annotation,但似乎不加也没有关系。 非常期待您的回复,十分感谢!

cs-xiyan commented 6 months ago

我是这么理解的假设一共20类,base_annotation是将数据集进行了处理,选择15个类重新映射为1-15,比如前5类是novel class,后15类是base class,那么把6-20映射成1-15。然后新建一个数据集。其他模型并没有重新映射这步。因为需要用基学习器也就是传统语义分割模型先把15类分好。所以需要重新映射,方便后续损失计算。 BAM/util /get_mulway_base_data.py 69-74 line

for cls in range(1,num_classes+1):
        select_pix = np.where(label_tmp == cls)
        if cls in sub_list:
            label[select_pix[0],select_pix[1]] = sub_list.index(cls) + 1
        else:
            label[select_pix[0],select_pix[1]] = 0

BAM是两段训练,先训练好基学习器,分出15类,然后加载基学习器权重,再训练元学习器。 PFENET不需要这样,他是直接像传统语义分割一样读取image,和mask,在自定义dataset类部分直接分成支持集和查询集,直接训练。

qjmltz commented 6 months ago

我是这么理解的假设一共20类,base_annotation是将数据集进行了处理,选择15个类重新映射为1-15,比如前5类是novel class,后15类是base class,那么把6-20映射成1-15。然后新建一个数据集。其他模型并没有重新映射这步。因为需要用基学习器也就是传统语义分割模型先把15类分好。所以需要重新映射,方便后续损失计算。 BAM/util /get_mulway_base_data.py 69-74 线

for cls in range(1,num_classes+1):
        select_pix = np.where(label_tmp == cls)
        if cls in sub_list:
            label[select_pix[0],select_pix[1]] = sub_list.index(cls) + 1
        else:
            label[select_pix[0],select_pix[1]] = 0

BAM是两段训练,先训练好基学习器,分出15类,然后加载基学习器权重,再训练元学习器。 PFENET不需要这样,他是直接像传统语义分割一样读取image,和mask,在自定义数据集类部分直接分成支持集和查询集,直接训练。

非常感谢您的回复,让我对BAM的论文理解更加深了一层,对于初学者的我来说帮助很大,感谢~