IOU指标是目标检测中重要的评价指标,即交集与并集的比值。
如图:
IOU的计算公式如下:
即预测框与真实框的交并比。先计算交集的面积,在计算并集的面积,然后求两者的比值。
计算代码如下:
其中ground truth的坐标为(x0,y0,w0,h0),bounding box的坐标分别为(x1,y1,w1,h1)
W = (min((x0+w0),(x1+w1))-max(x0,x1))
H = (min((y0+h0),(h1+h1))-max(y0,y1))
Intersection = W*H
Union = w0*h0 + w1*h1 -Intersection
这里跟上图的表示不一致,上图中的bbox和gtbox的坐标表示为(x1,y1,x2,y2),分别表示bbox的左上角坐标和右下角坐标。
如果将上述代码适应于上图,则代码可改写为:
w0 = gx2 - gx1
w1 = cx2 - cx1
h0 = gy1 - gy2
h1 = cy1 - cy2
W = (min((x0+w0),(x1+w1))-max(x0,x1))
H = (min((y0+h0),(h1+h1))-max(y0,y1))
Intersection = W*H
Union = w0*h0 + w1*h1 -Intersection
例子:
# 真实框的坐标,宽高
gt_box = [gt_x, gt_y,gt_w,gt_h] = 1,1,4,5
# 预测框的坐标,宽高
c_box = [c_x, c_y,c_w,c_h] = 3,2,3,6
# IOU 计算函数
def IOU(gt_box, c_box):
W = (min((gt_box[0]+gt_box[2]), (c_box[0]+c_box[2])) - max(gt_box[0], c_box[0]))
H = (min((gt_box[1]+gt_box[3]), (c_box[1]+c_box[3])) - max(gt_box[1], c_box[1]))
inter = W * H
iou = inter / (gt_box[2] * gt_box[3] + c_box[2] * c_box[3] - inter)
print('iou is {}'.format(iou))
return iou
if __name__ = '__main__':
IOU(gt_box, c_box)
结果是:
iou is 0.26666666666666666