我正在尝试在cityscapes数据集上训练一个UNET模型,该数据集有20个“有用”的语义类别,还有一些可以忽略的背景类别(例如天空、自车、山脉、路灯)。为了训练模型忽略这些背景像素,我在网上使用了以下常见解决方案:
- 我为所有属于忽略类别的像素分配了一个共同的
ignore_label
(例如:ignore_label=255
) - 使用每个像素预测的
cross_entropy
损失来训练模型 - 在
cross_entropy
损失中提供ignore_label
参数,因此计算的损失会忽略这些不必要类别的像素。
但这种方法存在一个问题。一旦训练完成,模型最终会将这些背景像素分类为20个类别中的一个。这是可以预见的,因为在损失中我们没有对模型对背景像素的任何分类进行惩罚。
因此,第二个显而易见的解决方案是为所有背景像素使用一个额外的类别。因此,它是cityscapes中的第21个类别。然而,我担心这样做会“浪费”模型的容量,因为它需要学习分类这个额外的不必要类别。
处理背景像素类别最准确的方法是什么?
回答:
第二种解决方案无疑是更好的。这是最佳解决方案,背景类别确实是一个额外的类别,但不是不必要的,因为这样可以清楚地区分你想要检测的类别和背景。
事实上,这是分割中推荐的标准程序,将一个类别分配给背景,当然,背景代表了除你特定类别之外的所有其他事物。