1

所以这个想法是为分割任务编写一个精度和召回指标。分割任务的常用指标通过逐像素比较地面实况和预测掩码来计算此指标。我要计算的方式是,即使预测了地面实况中对象的某些部分,那么整个对象 os 也被认为是真阳性。

我目前处理问题的方式是计算逻辑和基本事实和预测的掩码。然后使用skimage.measure.label为每个 blob 分配一个唯一的 id。然后我通过使用两者中的 blob 数来计算 True Positives、False Negatives 等

and_mask = np.logical_and(gt, pred)
labels1 = measure.label(gt, neighbors=8, background=0)
labels2 = measure.label(and_mask, neighbors=8, background=0)

这适用于大多数情况,但在我预测的 blob 掩码被预测为两部分的情况下,然后对其执行logical_and 会给我一个额外的对象。这搞砸了我对指标的计算。

有没有办法防止这种情况,还有一种更简单的方法吗?

4

2 回答 2

0

我设法解决了它。我使用 measure.label 来获取单个掩码,然后使用 gt 掩码计算 iou。这就是我想要的

    labels1 = measure.label(gt, neighbors=8, background=0)
        # loop over the unique components
        for label in np.unique(labels1):
            # if this is the background label, ignore it
            if label == 0:
                continue
            # otherwise, construct the label mask 
            labelMask1 = np.zeros(pred.shape, dtype="uint8")
            labelMask1[labels1 == label] = 255
            c, counts1 = np.unique(np.logical_and(labelMask1, pred, 
             where=255), return_counts=True)
            inter = np.sum(np.logical_and(labelMask1, pred, where=255)) / 
            np.sum(np.logical_or(labelMask1, pred, where=255))

如果有人感兴趣,这是粗略的算法。

于 2019-02-04T10:48:11.533 回答
0

细分评估是一个活跃的研究领域,但一些指标已经存在。我最喜欢的是信息的变化。一个关键特性是它不依赖于每个图像中的标签数量或图像之间的标签分配。这还没有在 scikit-image 中,但我们有一个拉取请求打开以包含它:

https://github.com/scikit-image/scikit-image/pull/3354

您可以查看该分支或从那里复制实现,或者稍等片刻,希望它会在下一个版本中出现!

于 2019-02-01T06:41:54.917 回答