BBBBchan / CorrMatch

Official code for "CorrMatch: Label Propagation via Correlation Matching for Semi-Supervised Semantic Segmentation"
128 stars 8 forks source link

About the question of datasets #17

Closed macaulishxcoo closed 4 months ago

macaulishxcoo commented 4 months ago

请问作者,关于自定义数据集的制作有什么需要注意的点吗?是我们人为分配labeled.txt和unlabeled.txt数据吗?数据集下的train_aug.txt和val.txt这两个文件起什么作用,我们需要怎么分配数据? 十分期待您的回复,谢谢!!!

BBBBchan commented 4 months ago

您好,感谢您的关注。为了公平比较,我们遵循了UniMatch,在代码中使用了与CPS方法相同的数据划分,这也是大多数半监督语义分割方法使用的最通用的划分方式。 如果您需要使用别的数据划分(例如U2PL划分方式)或自定义数据集划分,可以对labeled.txt和unlabeled.txt中的数据进行相应调整。注:不同的数据划分会显著影响模型性能,我们在论文中也对其进行了讨论。 train_aug.txt中包含了数据集中的全部数据,仅起标识作用,没有实际参与代码运行;val.txt文件中包含了数据集提供的标准验证集,用于验证模型性能。

BBBBchan commented 4 months ago

您好。您可以在configs/.yaml文件中找到并修改训练时使用的crop size。crop size即为我们训练过程中使用的输入尺寸。具体来说,针对PASCAL数据集,我们在论文中汇报了321和513两种输入尺寸的结果,对于Cityscapes数据集,我们使用了801输入尺寸。为公平对比,这些设置均与Unimatch保持一致。

在验证时,对于PASCAL数据集,我们保持了原始图像大小,对于Cityscapes数据集,我们使用了sliding window的方法进行evaluation,您可以参考论文描述和evaluate.py获取更多细节。

macaulishxcoo @.***> 于 2024年7月5日周五 15:16写道:

谢谢您的回复!我理解了。还有另外一个问题想要请教,我在源码中没有找到图像的输入尺寸,这部分参数在源码中哪里?我需要用您的方法与一般的全标注数据训练做个对比实验,所以需要保证一些参数的一致性。

— Reply to this email directly, view it on GitHub https://github.com/BBBBchan/CorrMatch/issues/17#issuecomment-2210329528, or unsubscribe https://github.com/notifications/unsubscribe-auth/AHWT7BRJNHU7ZEQCBYBZGRDZKZB3TAVCNFSM6AAAAABKMR3ZF2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDEMJQGMZDSNJSHA . You are receiving this because you commented.Message ID: @.***>

macaulishxcoo commented 4 months ago

代码中计算特征图之间的correlation map这段怎么理解?作者能不能大概讲述下流程,这段不是很理解。

BBBBchan commented 4 months ago

CorrMatch在构建相关矩阵时,对每一个分支都分别计算相似度。我们对每一个分支的特征都计算了自己和自己之间的相似度矩阵,由于骨干网络本身具有的抽象语义的能力,以及我们对 correlation loss的计算,使其在进行softmax和之后,其每一行都可以表示单个像素对全图所有像素位置的相似性,这其中蕴含着丰富的形状信息(具有相同语义的像素位置相关性更强,在该issue里有一些更详尽的表述)。Pixel Propagation便是利用这种逐像素之间的相似性,鼓励模型对具有相同语义的像素给出相似的输出。在Region Propagation策略中,我们进一步将抽样出的形状信息进行归一化和二值化,直接利用其中的形状信息,对高置信度区域进行拓展。

macaulishxcoo commented 4 months ago

计算correlation map时是针对每一个像素计算相似度吗,例如特征图向量为(4,3,321,321),这张特征图和自己或其他特征图计算相似度时是不是得到一个(321^2,321^2)的correlation map?每张图只会随机裁减出1个区域吗?然后针对这个区域作特征提取出一个fp?如果我有10张标注数据,20张未标注数据,最后我是不是得到200个321^2的orrelation map的2d矩阵,是只需要标注数据和未标注数据correlation map计算吗?包括后面给伪标签是针对每个像素进行分类吗? 问题比较多,希望得到您的回复!另外:要是源码关于训练的部分有一些注释就好了,因为涉及变量和计算比较多,确实理解起来优点复杂。

BBBBchan commented 4 months ago

抱歉对您理解我们的方法造成了困扰,我们将分条回答您的问题:

  1. 关于correlation map的大小。以论文中的实验为例, 我们使用了encoder编码后的特征进行correlation map的计算。 由于encoder带有8x的下采样,因此,对于321x321的输入图像,特征图向量大小为41x41. 也就是说,在这种情况下,correlation map的大小为(41^2, 41^2)。
  2. 关于何时计算correlation map。对于有标签图像和无标签图像,我们都进行correlation map的计算。参考您的说法,如果当前batch中有10张标注数据,20张未标注数据,那么在此次训练时,训练中会产生30个(41^2, 41^2)大小的correlation map。
  3. 关于fp。fp的计算和correlation map无关,fp是UniMatch方法中提出的一种特征层面的数据增强,使用Dropout随机失活50%的特征向量,之后通过模型预测得到fp分支的输出,与伪标签进行损失函数计算。
  4. 关于伪标签。语义分割任务可以理解为一个像素级分类任务,即对每个像素位置进行分类。与UniMatch等主流半监督语义分割方法相同,我们使用弱图像增强分支的输出作为伪标签。

P.S. 我们会考虑对训练部分的源码增加部分注释。

macaulishxcoo commented 4 months ago

好的,十分感谢!通过对源码的阅读,已经差不多理解了。

mai556 commented 4 months ago

CorrMatch在构建相关矩阵时,对每一个分支都分别计算相似度。我们对每一个分支的特征都计算了自己和自己之间的相似度矩阵,由于骨干网络本身具有的抽象语义的能力,以及我们对 correlation loss的计算,使其在进行softmax和之后,其每一行都可以表示单个像素对全图所有像素位置的相似性,这其中蕴含着丰富的形状信息(具有相同语义的像素位置相关性更强,在该issue里有一些更详尽的表述)。Pixel Propagation便是利用这种逐像素之间的相似性,鼓励模型对具有相同语义的像素给出相似的输出。在Region Propagation策略中,我们进一步将抽样出的形状信息进行归一化和二值化,直接利用其中的形状信息,对高置信度区域进行拓展。

既然是计算自己和自己之间的相似度,为什么要先通过两个线性层映射成不同的张量再相乘呢?

BBBBchan commented 4 months ago

这是一个很好的问题。直观来讲,通过使用不同的线性变换矩阵,模型能够学习到更丰富的特征表示。具体来说,correlation map本身的计算是无参的,虽然其能够反应像素之间的相似性,但是两个独立的线性层可以帮助correlation map更加灵活地建模信息。

同时,在Pixel Propagation策略中,生成correlation map的分支有对应的label 和 unlabel损失函数进行监督,该监督信号本身就可以鼓励correlation map捕捉更加精确的形状信息。在该过程中,两个独立的线性层中的参数更新对correlation map的调整是有帮助的。

mai556 commented 4 months ago

尽管这样有效果,但我想最直观且容易理解的方式还是直接计算或者使用同一个线性层。我想问这样的做法是不是启发于Transformer中的Q和K也采用了不同的映射矩阵?

BBBBchan commented 4 months ago

感谢您的回复。正如您所说,构建correlation map的方式与Transformer中构建attention map的方式在形式上是相似的。事实上,针对一个可学习的分支,我们希望独立的线性层能够使得我们在构建correlation map时能够更准确地捕捉到特征位置之间的相关性。

mai556 commented 3 months ago

谢谢!