目录
- 一. IoU介绍
- 二. 计算思路
- 2.1 相交的情况
- 2.2 不相交情况
- 三. 代码
一. IoU介绍
- IoU,即 intersection over Union,就是两个矩形框的交集面积与他们并集面积的比值。(其实也不一定是矩形框,这里以矩形框进行说明)
- IoU也是一种算法性能的指标,例如在语义分割时就会用IoU来衡量分割效果的好坏。
- 举例说明,如下图所示:
已知:
- 左边的矩形框假设为N,左上角坐标为(x1, y1), 右下角坐标为(x2, y2);
- 右边的矩形框假设为M,左上角坐标为(a1, a1), 右下角坐标为(a2, a2);
- 相交的矩形框假设为X,左上角坐标设为点A,右下角坐标设为点B;
现在要计算 IoU = area_X / (area_N + area_M - area_X) ?
二. 计算思路
2.1 相交的情况
两个矩形相交情况,如上图所示,只要矩形框A和B点的坐标,即可求出相交区域的面积,从而求得IoU。
计算思路如下:
- A的横坐标 等于 两个矩形框左上角横坐标较大的那个,即Ax = max(x1, a1)
- A的纵坐标 等于 两个矩形框左上角纵坐标较大的那个,即Ay = max(y1, b1)
- B的横坐标 等于 两个矩形框右下角横坐标较小的那个,即Bx = min(x2, a2)
- B的纵坐标 等于 两个矩形框右下角纵坐标较小的那个,即By = min(y2, b2)
2.2 不相交情况
以矩形框N为参考矩形,矩形框M如果与N不相交,那么M可能出现在N的上下左右,四种情况,如下图所示:
有两种判断不相交的方法:
- 上面的四种情况,用红字标出了;
- 计算出的相交区域宽和高假设为w, h, 如果不相交的话,会出现w<=0,或者 h<=0。
三. 代码
def iou(x1,y1, x2, y2, a1, b1, a2, b2):
ax = max(x1, a1) # 相交区域左上角横坐标
ay = max(y1, b1) # 相交区域左上角纵坐标
bx = min(x2, a2) # 相交区域右下角横坐标
by = min(y2, b2) # 相交区域右下角纵坐标
area_N = (x2 - x1) * (y2 - y1)
area_M = (a2 - a1) * (b2 - b1)
w = bx - ax
h = by - ay
if w<=0 or h<=0:
return 0 # 不相交返回0
area_X = w * h
return area_X / (area_N + area_M - area_X)
- 上述代码可以对w和h可以取max(0, w)和max(0, h),这样就简化了代码,如下所示:
def iou(x1,y1, x2, y2, a1, b1, a2, b2):
ax = max(x1, a1) # 相交区域左上角横坐标
ay = max(y1, b1) # 相交区域左上角纵坐标
bx = min(x2, a2) # 相交区域右下角横坐标
by = min(y2, b2) # 相交区域右下角纵坐标
area_N = (x2 - x1) * (y2 - y1)
area_M = (a2 - a1) * (b2 - b1)
w = max(0, bx - ax)
h = max(0, by - ay)
area_X = w * h
return area_X / (area_N + area_M - area_X)