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 接口