深度学习中的IOU计算方式和代码实践

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

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

分割领域的IOU计算方式

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

intersection = (A * B).sum()

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

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

最终的IOU就是:

IOU = intersection / union

对于多类的语义分割任务计算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()

做一下解释。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的计算公式:
iou=ABABiou = \frac{A \cap B}{A \cup B}
假设A是预测,B是GT。
先求交集。
在这里插入图片描述
我这里仅分析如何获得X轴上的交集区域的宽。另一个维度的分析类似的。
问号所指的长度使我们想求的。
W?=WA+WB(BxmaxAxmin)W_? = WA+WB - (Bxmax - Axmin)

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

知道了交集,并集就好求了。
还是根据并集定理,A和B的并集是A和B的相加减去A和B的交集。
Sunion=SA+SBSinterS_{union} = S_A + S_B - S_{inter}

代码实践:

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)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章