在darknet中iou的计算是调用box_iou函数(box.c文件)
float box_iou(box a, box b)
{
return box_intersection(a, b)/box_union(a, b);
}
iou的计算公式比较简单,交集面积/并集面积。
先来看并集面积计算方式:
float box_union(box a, box b)
{
float i = box_intersection(a, b);
float u = a.w*a.h + b.w*b.h - i;
return u;
}
并集的计算公式中又用到了交集计算。并集的计算其实比较简单,就是两个box的面积相加然后减去交集的面积,如果没有交集则i为0。
float box_intersection(box a, box b)
{
float w = overlap(a.x, a.w, b.x, b.w);
float h = overlap(a.y, a.h, b.y, b.h);
if(w < 0 || h < 0) return 0;
float area = w*h;
return area;
}
交集计算中又调用overlap,首先看overlap的代码:
float overlap(float x1, float w1, float x2, float w2)
{
float l1 = x1 - w1/2;
float l2 = x2 - w2/2;
float left = l1 > l2 ? l1 : l2;
float r1 = x1 + w1/2;
float r2 = x2 + w2/2;
float right = r1 < r2 ? r1 : r2;
return right - left;
}
left表示左侧点较大者,而right表示右侧点较小者,right-left表示二者的交集,若left与right没有交集,则返回值小于0。通过以上步骤可以分别计算在x轴与y轴方向上的交集,若有一个方向上结果小于零,则代表box之间没有交集。否则返回area。