当前位置:   article > 正文

深度学习中的IOU计算方式和代码实践_intersection-of-union是什么意思

intersection-of-union是什么意思

IOU,全称为intersection of union, 中文名“交并比”。这个概念理解起来不难,本文将从原理以及代码实践来解读IOU。

首先要说明的是,IOU在检测领域和分割领域都有应用,但这两个领域的IOU计算方式是不一样的。所以本文就分为两个部分。分别讲解在分割和检测两个领域的IOU计算方式。

分割领域的IOU计算方式

在这里插入图片描述
假设白色区域为1,黑色区域为0。
根据IOU计算公式:
i o u = A ∩ B A ∪ B iou = \frac{A \cap B}{A \cup B} iou=ABAB
假设网络输出为A,GT为B。
那么A交B非常好算。

intersection = (A * B).sum()
  • 1

A并B的计算方式,就是A的白色面积+B的白色面积, 减去A和B的交集。

union = A.sum() + B.sum() - intersection
  • 1

最终的IOU就是:

IOU = intersection / union
  • 1

对于多类的语义分割任务计算IOU

上面讲解的例子属于二类分割,语义分割所要处理的数据集往往都是很多类的。网络输出的map的shape是[Batchsize, N, H, W], N是数据集的类别。这个时候我们如何计算IOU呢。
假设label的shape是[Batchsize , H, W], 值的范围是[0-N-1]

A = net(X) # A是网络输出,shape为[Batchsize, N, H, W]
A = np.argmax(A, axis=1)  # A的shape现在为 [Batchsize, H, W],和Gt一致
A += 1
Gt += 1
intersection = A * (A == Gt)
area_inter, _ = np.histogram(intersection, bins= NUMCLASS, range=(1, NUMCLASS))
area_pred, _ = np.histogram(A, bins= NUMCLASS, range=(1, NUMCLASS))
area_label, _ = np.histogram(Gt, bins= NUMCLASS, range=(1, NUMCLASS))
area_union = area_pred + area_label - area_inter
iou = area_inter / area_union
miou = iou.mean()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

做一下解释。np.histogram是统计直方图的函数,通过该函数,

  • 我们得知交集中每一个类别的像素值数目是多少

area_inter, _ = np.histogram(intersection, bins= NUMCLASS, range=(1, NUMCLASS))

  • 得知预测结果的每一类别的像素值数目是多少

area_pred, _ = np.histogram(A, bins= NUMCLASS, range=(1, NUMCLASS))

  • 得知label中每一个类别的像素值数目是多少

area_label, _ = np.histogram(Gt, bins= NUMCLASS, range=(1, NUMCLASS))

然后还是利用了两个集合的并集等于两个集合相加减去公共的部分

area_union = area_pred + area_label - area_inter

这里得到了每一个类的IOU,Miou就是求均值,这就是最后两句代码的含义。

检测任务中的IOU计算方式

在这里插入图片描述

依然是根据IOU的计算公式:
i o u = A ∩ B A ∪ B iou = \frac{A \cap B}{A \cup B} iou=ABAB
假设A是预测,B是GT。
先求交集。
在这里插入图片描述
我这里仅分析如何获得X轴上的交集区域的宽。另一个维度的分析类似的。
问号所指的长度使我们想求的。
W ? = W A + W B − ( B x m a x − A x m i n ) W_? = WA+WB - (Bxmax - Axmin) W?=WA+WB(BxmaxAxmin)

然后我们使用相同的分析方法,得到 H ? H_? H?。交集区域的面积就是
S i n t e r = W ? ∗ H ? S_{inter} = W_? * H_? Sinter=WH?

知道了交集,并集就好求了。
还是根据并集定理,A和B的并集是A和B的相加减去A和B的交集。
S u n i o n = S A + S B − S i n t e r S_{union} = S_A + S_B - S_{inter} Sunion=SA+SBSinter

代码实践:

def iou(axmin,aymin,axmax,aymax, bxmin,bymin, bxmax, bymax):
    width = min(axmin,bxmin) + (axmax-axmin) + (bxmax-bxmin) - max(axmax,bxmax)
    height = min(aymin,bymin) + (aymax-aymin) + (bymax-bymin) - max(aymax,bymax)
    return max(width*height/(
        (ymax-ymin)*(xmax-xmin) + (aymax-aymin)*(axmax-axmin) - width*height
    ), 0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

最后结果的结果要和0比较,因为如果得到的IOU小于0,说明没有交集,iou为0.但是分子的面积仍然是非0数字,是负数。所以最后需要和0比较。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/114089
推荐阅读
相关标签
  

闽ICP备14008679号