目录

  • 一. IoU介绍
  • 二. 计算思路
  • 2.1 相交的情况
  • 2.2 不相交情况
  • 三. 代码

一. IoU介绍

  • IoU,即 intersection over Union,就是两个矩形框的交集面积与他们并集面积的比值。(其实也不一定是矩形框,这里以矩形框进行说明)
  • IoU也是一种算法性能的指标,例如在语义分割时就会用IoU来衡量分割效果的好坏。
  • 举例说明,如下图所示:

Iou计算 NLP iou计算逻辑_机器学习

已知:

  1. 左边的矩形框假设为N,左上角坐标为(x1, y1), 右下角坐标为(x2, y2);
  2. 右边的矩形框假设为M,左上角坐标为(a1, a1), 右下角坐标为(a2, a2);
  3. 相交的矩形框假设为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的上下左右,四种情况,如下图所示:

Iou计算 NLP iou计算逻辑_并集_02

有两种判断不相交的方法:

  1. 上面的四种情况,用红字标出了;
  2. 计算出的相交区域宽和高假设为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)