我正在做一个关于多类语义分割的项目。我已经制定了一个模型,输出相当下降分割图像通过减少损失值。但是,我不能用度量来评估模型的性能,例如meanIoU或Dice系数。在二值语义分割的情况下,只需将阈值设置为0.5,将输出作为目标或背景进行分类,但对于多类语义分割则不起作用。请告诉我如何获得上述指标的模型性能好吗?任何帮助都将不胜感激!
顺便说一下,我使用的是PyTorch框架和CamVid数据集。
发布于 2020-06-19 06:46:43
如果有人对这个答案感兴趣,也请看本期。该问题的作者指出,mIoU可以用一种不同的方法来计算(这一方法在文献中被更多地接受)。因此,在为任何正式发布使用实现之前,请考虑这一点。
基本上,问题海报建议的另一种方法是在整个数据集上分别积累交叉和联合,并在最后一步对它们进行划分。下面的原始答案中的方法计算一批图像的交集和合并,然后将它们分割为当前批的IoU,然后在整个数据集上取一个IoU的平均值。
但是,下面这个给定的原始方法是有问题的,因为最终的平均IoU会随批处理大小而变化。另一方面,mIoU不会随问题所在中提到的方法的批处理大小而变化,因为单独的累积将确保批大小无关(虽然更高的批大小肯定有助于加快评估)。
原始答案:
下面给出了一个在IoU中实现均值PyTorch (交集超过联合)的方法。
def mIOU(label, pred, num_classes=19):
pred = F.softmax(pred, dim=1)
pred = torch.argmax(pred, dim=1).squeeze(1)
iou_list = list()
present_iou_list = list()
pred = pred.view(-1)
label = label.view(-1)
# Note: Following for loop goes from 0 to (num_classes-1)
# and ignore_index is num_classes, thus ignore_index is
# not considered in computation of IoU.
for sem_class in range(num_classes):
pred_inds = (pred == sem_class)
target_inds = (label == sem_class)
if target_inds.long().sum().item() == 0:
iou_now = float('nan')
else:
intersection_now = (pred_inds[target_inds]).long().sum().item()
union_now = pred_inds.long().sum().item() + target_inds.long().sum().item() - intersection_now
iou_now = float(intersection_now) / float(union_now)
present_iou_list.append(iou_now)
iou_list.append(iou_now)
return np.mean(present_iou_list)您的模型的预测将是一个热门形式,所以首先以softmax (如果您的模型还没有),然后是argmax,以获得在每个像素的概率最高的索引。然后,我们计算每个类的IoU (并在结尾取平均值)。
我们可以将预测和标签都重塑为一维向量(我读到它使计算速度更快)。对于每个类,我们首先使用pred_inds = (pred == sem_class)和target_inds = (label == sem_class)标识该类的索引。生成的pred_inds和target_inds将有1 at像素标记为该特定类,而对于任何其他类则为0。
然后,有可能目标根本不包含特定的类。这将使该类的IoU计算无效,因为它不存在于目标中。因此,您为这样的类分配一个NaN IoU (以便以后可以识别它们),而不让它们参与平均值的计算。
如果目标中存在特定的类,那么pred_inds[target_inds]将给出一个1s和0的向量,其中具有1的索引是预测和目标相等的,否则为零。取所有元素之和,就会给我们交集。
如果我们添加pred_inds和target_inds的所有元素,我们将得到该特定类像素的并+交点。因此,我们减去已经计算过的交点,得到合并。然后,我们可以将交集和联合除以得到特定类的IoU,并将其添加到有效的IoU列表中。
最后,取整个列表的平均值来获得mIoU。如果你想要骰子系数,你可以用类似的方式计算它。
https://stackoverflow.com/questions/62461379
复制相似问题