IoU(交并比)是目标检测中一个常用的概念,通常用来衡量候选框(candidate)与真实标记框(ground truth)之间的交叠程度。
定义两个集合A和B,两者的IoU为两者的交与两者的并的比值,即: I o U = A ∩ B A ∪ B IoU=\frac{A \cap B}{A \cup B} IoU=A∪BA∩B。
例如图中有两个有重叠部分的矩形:一个是蓝色矩形A,另一个是绿色矩形B,交叠部分用橙色表示。则矩形A和B的 IoU 为橙色面积与三色面积总和的比值。
那么这个IoU实际用途是什么呢?我们知道,在Pascal VOC这些数据集中,都标定好了物体在图像中位置,这些标定物体位置的矩形框成为ground truth(GT)。示例如下:
我们现在要自己产生一些候选框,这些候选框应该尽可能的与GT重叠,以保证其位置和大小的识别准确性,这种情况下,候选框和GT的 IoU 接近1;如果候选框和GT重叠部分很少,或者交叠部分远小于两者的面积总和,那么 IoU 的值趋近于0。
candidate(黄色)与GT(蓝色)大致存在以下三种关系:
(1)对于左图,candidate和GT的 IoU 趋近于1,可以认为是效果比较好的候选框;
(2)对于中图,candidate和GT的重叠部分较少,因此 IoU 比较小,效果不好;
(3)对于右图,虽然candidate和GT的重叠部分为整个黄色框,但是两者的面积(GT面积)总和更大,因此 IoU 也比较小,效果一般。
最后放一段计算 IoU 的代码:
def compute_iou(boxA, boxB):
#box四个参数:左上角横坐标、纵坐标,右下角横坐标、纵坐标
int_w = max(min(boxA[2], boxB[2]) - max(boxA[0], boxB[0]), 0)
int_h = max(min(boxA[3], boxB[3]) - max(boxA[1], boxB[1]), 0)
inter = int_h * int_w
union = (boxA[3] - boxA[1]) * (boxA[2] - boxA[0]) + (boxB[3] - boxB[1]) * (boxB[2] - boxB[0]) - inter
iou = inter / union
return iou