如何检查两个图像中标记的区域是否相同?

时间:2019-01-31 14:58:40

标签: deep-learning computer-vision image-segmentation scikit-image image-morphology

因此,想法是为细分任务编写精度和召回率指标。细分任务的常用指标是通过将地面真实情况和预测蒙版逐像素进行比较来计算该指标的。我要计算的方法是,即使预测了地面真实情况中的物体的某些部分,整个物体也被视为真实正值。

我目前解决该问题的方式是我正在计算逻辑,基础事实和预测的掩码。然后使用skimage.measure.label为每个Blob分配一个唯一的ID。然后,我通过使用两个点中的斑点数来计算正值,负值等。

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

这在大多数情况下都有效,但是在将我对斑点的预测蒙版分为两部分进行预测的情况下,然后对其进行逻辑运算,就会给我带来额外的好处。这搞砸了我的指标计算。

是否有防止这种情况的方法,还有没有更简单的方法?

2 个答案:

答案 0 :(得分:0)

细分的评估是一个活跃的研究领域,但是某些指标已经存在。我最喜欢的是信息的变化。一个主要功能是它不依赖于每个图像中标签的数量或图像之间标签的分配。尚未在scikit-image中显示,但是我们已经打开了一个拉取请求以包含它:

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

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

答案 1 :(得分: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))

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