Haochen-Wang409 / U2PL

[CVPR'22 & IJCV'24] Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels & Using Unreliable Pseudo-Labels for Label-Efficient Semantic Segmentation
Apache License 2.0
436 stars 61 forks source link

about contrast loss and augmentation #87

Closed kimjisoo12 closed 2 years ago

kimjisoo12 commented 2 years ago

您好,首先感谢您的工作给很多人带来了启发,我在阅读您的关于contrast loss的代码部分时有一些困惑想向您请教,由于刚接触半监督不久水平有限,如果有一些说错的地方希望您可以指正。

                prob = torch.softmax(pred_u_large_teacher, dim=1)
                entropy = -torch.sum(prob * torch.log(prob + 1e-10), dim=1)

                low_thresh = np.percentile(entropy[label_u_aug != 255].cpu().numpy().flatten(), alpha_t)
                low_entropy_mask = (entropy.le(low_thresh).float() * (label_u_aug != 255).bool())

                high_thresh = np.percentile(entropy[label_u_aug != 255].cpu().numpy().flatten(),100 - alpha_t)
                high_entropy_mask = (entropy.ge(high_thresh).float() * (label_u_aug != 255).bool())

                low_mask_all = torch.cat(((label_l.unsqueeze(1) != 255).float(), low_entropy_mask.unsqueeze(1),))
                high_mask_all = torch.cat(((label_l.unsqueeze(1) != 255).float(), high_entropy_mask.unsqueeze(1),))

对于voc数据,我看到您这里是首先根据 label_u 经过 model_teacher 得到 pred_u_large_teacher,进而得到entropy。由于voc数据集标签部分您将边界部分赋予了255的值,随后在对 entropy 进行排序的时候剔除掉了255区域的 entropy 值,并根据 alpha_t 和 100 - alpha_t分别得到了 low_thresh 和 high_thresh。根据这两个值得到了只含有0,1的 low_entropy_mask 和 high_entropy_mask 相当于对无标签数据的label划分成了可靠和不可靠的区域,mask_all则是将label和unlabel拼接起来。 对于label划分可靠和不可靠区域我有一些困惑,如果说中心区域是可靠的,边界是不可靠的。 (1)对于

             (label_l.unsqueeze(1) != 255).float()

将255的区域都置为1,其余部分置为0。对 low_mask_all 而言是对的,那对 high_mask_all 这样处理岂不是中心部分也都是1,那中心部分不就成了不可靠的吗? (2)如果我想处理的数据集各标签的数据集标签周围没有边界255的这种情况我应该是如何处理,那是否说明我的整个label都是可靠的,还是说我应该将这些数据的标签周围也做成被255包裹的这样子。 (3)在数据增强部分我看到您是将1464张有标签重复取样到9118,从而达到一个1:1,我看您的数据增强策略只用在了unlabel上,对于label数据您是认为1464张足够吗,所以不需要对label进行augmentation从而防止过拟合的出现? 很抱歉打扰您,希望您可以帮助解决一下我的困惑,万分感谢您!

Haochen-Wang409 commented 2 years ago

(1)请注意,可靠与不可靠的概念只存在于 unlabeled data 中,对于 labeled data,即此处的 label_l,都是需要加以利用的。因此,不管是对于 low_mask 还是 high_masklabel_l 中不是 255 的部分都视为是合法的监督信息

(2)只需要认为整个 label 都是可靠的即可,255 是因为 VOC/Cityscapes 这些数据集标注时候使用的 ignore_index,对于 VOC 来说,255 通常出现在物体的边界,而对于 cityscapes,并没有这一显著规律

(3)对于 labeled data,CutMix/CutOut 等手段当然是可以使用的,我们没有使用是 follow 了前人的工作。在 unlabeled data 中,强数据扩增是十分重要的