darknet源码剖析(五)box_iou详细分析

在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。

你可能感兴趣的:(darknet源码剖析,darknet,iou)