darknet源码剖析box_iou详细分析

Posted mazinkaiser1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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源码剖析box_iou详细分析的主要内容,如果未能解决你的问题,请参考以下文章

编程艺术剖析 darknet load_weights 接口

经验分享剖析 darknet entry_index 指针偏移逻辑

编程艺术剖析 darknet parse_network_cfg 接口

编程艺术剖析 darknet read_data_cfg 接口

编程艺术剖析 darknet 链表查找 option_find_xx 接口

可能是全网最详细的 Spark Sql Aggregate 源码剖析