介绍
IoU,Intersection over Union,交并比
公式如下图:
计算
情况一
有2个方框 A 和 B ,分别知道 左上角 和 右下角 的坐标,如下图:
为了计算上图 绿色框 的面积,就要知道绿色框 左上角、右下角的坐标:
- 比较 ax1 和 bx1,取最大值
- 比较 ax2 和 bx2,取最小值
上面 最小值 减去 最大值,就是 绿色框 的长度
同理求出 绿色框 宽度,让 长度 乘以 宽度,就求出面积
为什么要比较大小
A 和 B 相交的方式有6种情况绿色框 的左上角 不总是(bx1,by1),右下角不总是(ax2,ay2):
def iou(box1, box2):
'''
两个框(二维)的 iou 计算
注意:边框以左上为原点
box:[x1, y1, x2, y2]
'''
in_h = min(box1[2], box2[2]) - max(box1[0], box2[0])
in_w = min(box1[3], box2[3]) - max(box1[1], box2[1])
inter = 0 if in_h<0 or in_w<0 else in_h*in_w
union = (box1[2] - box1[0]) * (box1[3] - box1[1]) + \
(box2[2] - box2[0]) * (box2[3] - box2[1]) - inter
iou = inter / union
return iou
情况二
在目标检测中,已知 A 和 B 框的 中心点坐标 和 宽高,如下图:
计算时,先计算出 A 和 B 框 左上角 和 右下角的坐标,再按 情况一 计算
import tensorflow as tf
def get_iou(x1,y1,w1,h1, x2,y2,w2,h2):
xmin1 = x1 - 0.5*w1
xmax1 = x1 + 0.5*w1
ymin1 = y1 - 0.5*h1
ymax1 = y1 + 0.5*h1
xmin2 = x2 - 0.5*w2
xmax2 = x2 + 0.5*w2
ymin2 = y2 - 0.5*h2
ymax2 = y2 + 0.5*h2
inter_x_min = tf.maximum(xmin1,xmin2)
inter_x_max = tf.minimum(xmax1,xmax2)
inter_w = inter_x_max - inter_x_min
inter_y_min = tf.maximum(ymin1, ymin2)
inter_y_max = tf.minimum(ymax1, ymax2)
inter_h = inter_y_max - inter_y_min
inter = inter_w * inter_h
union = w1*h1 + w2*h2 - inter
iou = inter / union
return iou
感谢:
https://blog.csdn.net/u014061630/article/details/82818112

