比较两个分割图预测

Posted

技术标签:

【中文标题】比较两个分割图预测【英文标题】:Compare two segmentation maps predictions 【发布时间】:2021-08-13 08:25:48 【问题描述】:

我在未标记数据上使用两个预测分割图之间的一致性。对于标记数据,我使用的是 nn.BCEwithLogitsLoss 和 Dice Loss。

我正在制作视频,这就是为什么要输出 5 维。 (batch_size, channels, frames, height, width)

我想知道我们如何比较两个预测的分割图。

gmentation maps.

# gt_seg - Ground truth segmentation map. - (8, 1, 8, 112, 112)
# aug_gt_seg - Augmented ground truth segmentation map - (8, 1, 8, 112, 112)

predicted_seg_1 = model(data, targets)       # (8, 1, 8, 112, 112)
predicted_seg_2 = model(augmented_data, augmented_targets) #(8, 1, 8, 112, 112)

# define criterion
seg_criterion_1 = nn.BCEwithLogitsLoss(size_average=True)
seg_criterion_2 = nn.DiceLoss()

# labeled losses
supervised_loss_1 = seg_criterion_1(predicted_seg_1, gt_seg)
supervised_loss_2 = seg_criterion_2(predicted_seg_1, gt_seg)

# Consistency loss
if consistency_loss == "l2":
      consistency_criterion = nn.MSELoss()
      cons_loss = consistency_criterion(predicted_gt_seg_1, predicted_gt_seg_2)

elif consistency_loss == "l1":
      consistency_criterion = nn.L1Loss()
      cons_loss = consistency_criterion(predicted_gt_seg_1, predicted_gt_seg_2)

total_supervised_loss = supervised_loss_1 + supervised_loss_2
total_consistency_loss = cons_loss

这是在两个预测分割图之间应用一致性的正确方法吗?

我主要是因为火炬网站上的定义而感到困惑。这是输入 x 与目标 y 的比较。我认为它看起来是正确的,因为我希望两个预测的分割图都相似。但是,第二个分割图不是目标。这就是为什么我很困惑。因为如果这可能是有效的,那么每个损失函数都可以以某种或另一种方式应用。这看起来对我没有吸引力。如果是正确的比较方式,是否可以扩展到其他基于分段的损失,例如 Dice Loss、IoU Loss 等?

关于标记数据损失计算的另一个查询:

# gt_seg - Ground truth segmentation map
# aug_gt_seg - Augmented ground truth segmentation map

predicted_seg_1 = model(data, targets)
predicted_seg_2 = model(augmented_data, augmented_targets)

# define criterion
seg_criterion_1 = nn.BCEwithLogitsLoss(size_average=True)
seg_criterion_2 = nn.DiceLoss()

# labeled losses
supervised_loss_1 = seg_criterion_1(predicted_seg_1, gt_seg)
supervised_loss_2 = seg_criterion_2(predicted_seg_1, gt_seg)

# augmented labeled losses
aug_supervised_loss_1 = seg_criterion_1(predicted_seg_2, aug_gt_seg)
aug_supervised_loss_2 = seg_criterion_2(predicted_seg_2, aug_gt_seg)

total_supervised_loss = supervised_loss_1 + supervised_loss_2 + aug_supervised_loss_1 + aug_supervised_loss_2

total_supervised_loss 的计算是否正确?我可以为此应用 loss.backward() 吗?

【问题讨论】:

是的,您可以将loss.backward() 应用于由多个成分损失组成的损失函数,即使是多次前向传递(在这种情况下,您每 1 次后向传递执行 2 次前向传递)。尽管存储复杂网络的计算图会为每个前向传递消耗相当多的内存。 你能解释一下最后一句与内存问题有关的内容吗?任何建议如何提高内存效率。 【参考方案1】:

是的,这是实现一致性损失的有效方法。 pytorch 文档使用的命名法将一个输入作为目标,另一个作为预测,但考虑到 L1、L2、Dice 和 IOU 损失都是对称的(即Loss(a,b) = Loss(b,a))。因此,这些函数中的任何一个都将完成一种形式的一致性损失,而不管一个输入实际上是真实的还是“目标”。

【讨论】:

以上是关于比较两个分割图预测的主要内容,如果未能解决你的问题,请参考以下文章

分割概率图取决于 CPU 或 GPU

语义分割PointRend

语义分割中的上采样

图像语义分割之特征整合和结构预测

图像语义分割之特征整合和结构预测

基于边缘像素图的图像分割