文章目录
- 1. 交并比(IoU)
- 2.原理
- 3.代码实现
1. 交并比(IoU)
具体来说,它是两边界框相交部分面积与相并部分面积之比,如下所示:
也就是两个框的交集和两个框的并集之比。
2.原理
这里详细解释一下计算的原理:
一般来说我们给定框的坐标有两种形式:
[x,y,w,h]
(或者说是[x,y,h,w]
原理一样) 其中这里的x,y代表框的中心坐标,w代表宽,h代表高度。那么我们用中心坐标分别加上(减去)w/2和h/2就能把框四个角的坐标求出来。
[x1,y1,x2,y2]
x1,y1代表左上角的顶点坐标,x2,y2代表右下角的坐标。也就是把对角的两个坐标给出。两种形式计算IoU的区别不大,以第一种形式为例子:
我们想要把两个框相交区域的面积(即深蓝色区域)S求出来,那么就要知道这个区域的宽和高,也就是图中的w和h。首先,我们根据给的[x,y,w,h]
坐标框可以把两个框的所有坐标计算出来:
看上图的两个虚线框,虚线框将两个框的上边线(下边线)框在了一起,要求h,我们只需要看Y轴方向,两条上边线的Y坐标分别是4(篮框)和3(黄框),两者取小即Ymax=3
,同理下边线要取大即Ymin=2
,很明显:
h=Ymax-Ymin=1,w同理。总结就是上取小下取大,右取小左取大,
3.代码实现
import numpy as np
class calculate_iou():
def __init__(self,box1,box2):
self.box1=box1
self.box2=box2
#以中心坐标格式为例
def center_iou(self):
x1,y1,w1,h1=self.box1
x2,y2,w2,h2=self.box2
#计算每个框的上下左右边线的坐标
y1_max=y1+h1/2
x1_max=x1+w1/2
y1_min=y1-h1/2
x1_min=x1-w1/2
y2_max=y2+h2/2
x2_max=x2+w2/2
y2_min=y2-h2/2
x2_min=x2-w2/2
#上取小下取大,右取小左取大
xx1 = np.max([x1_min, x2_min])
yy1 = np.max([y1_min, y2_min])
xx2 = np.min([x1_max, x2_max])
yy2 = np.min([y1_max, y2_max])
#计算各个框的面积
area1 = (x1_max-x1_min) * (y1_max-y1_min)
area2 = (x2_max-x2_min) * (y2_max-y2_min)
#计算相交的面积
inter_area = (np.max([0, xx2-xx1])) * (np.max([0, yy2-yy1]))
#计算IoU
iou = inter_area / (area1+area2-inter_area)
return iou
#传入目标框的坐标
a=calculate_iou([2,2,2,2],[3,3,2,2])
print(1/7) # 根据公式手动计算的IoU:0.14285714285714285
a.center_iou() # 0.14285714285714285