计算联合的平均交集

数据挖掘 评估 准确性
2021-09-25 03:54:00

我想在带有神经网络的分割模型中为每个类设置一个全局 IoU 度量。这个想法是,一旦网络被训练,对所有训练示例进行前向传递并计算 IoU,我正在考虑两种方法(对于每个类):1)计算每个训练实例的 IoU,最后,计算mean IoU (per class) 2) 沿所有训练实例(每类)累积交集和并集,最后取比率。

为了说明这个问题,让我们举两个训练实例,其中 class=0,intersection_1 = 2,intersection_2 = 3,union_1=7,union_2=6。平均 IoU(方法 1)将为 0.3929,第二种方法为 5/13 = 0.3846。您认为哪种方法会产生更好/不偏不倚的结果?

2个回答

以我的经验,这两种方法可以给出完全不同的结果。它并没有真正显示在您提供的示例中,因为尺寸相似。但是,在某些情况下,在对象检测中,您可以让同一个对象在两个图像中出现大小非常不同的情况。您的第一种方法将平等地衡量 IoU,但第二种方法会给较大的对象更多的权重。我在网上找到的用于计算平均 IoU 的脚本似乎采用了第二种方法,但在我看来,无论其大小如何,一个类的每个实例的权重都应该相同。

编辑

第一种方法是:1niiui

第二个是:iiui.

假设我们正在检测两个对象,第一个对象非常小并且被很好地检测到。它有 20 个像素的交集和 21 个像素的并集。第二个物体非常大,很难检测到。它有 20 个像素的交集和 200 个并集。第一种方法的平均 IoU 为 0.52,而第二种方法的 IoU 为 0.18。第一种方法单独处理每个对象检测并平均 IoU,有效地为每个对象检测赋予相同的权重。第二种方法偏向于较大的对象。

如果您的所有图像和对象的大小都合理,这两种方法通常不会产生很大的不同。合理地说,我的意思是你不是在处理一些只有几个像素大的对象。

我通常更喜欢第二种方法。一个特别的原因是您不必担心 I 和 U 都为 0 的情况,这可能在您的训练阶段开始时经常发生。

根据我的经验,大多数机器学习软件都采用第二种方法。例如,mean_iou在 Tensorflow 中,在计算每个类的 IoU 之前,只需将输入张量扁平化为一个向量。