目标检测之 IoU

 

iou

IoU 作为目标检测算法性能 mAP 计算的一个非常重要的函数。

但纵观 IoU 计算的介绍知识,都是直接给出代码,给出计算方法,没有人彻底地分析过其中的逻辑,故本人书写该篇博客来介绍下其中的逻辑。

1. IoU的简介及原理解析

IoU 的全称为交并比(Intersection over Union),通过这个名称我们大概可以猜到 IoU 的计算方法。IoU 计算的是 “预测的边框” 和 “真实的边框” 的交集和并集的比值。

在这里插入图片描述

开始计算之前,我们首先进行分析下交集和并集到底应该怎么计算:我们首先需要计算交集,然后并集通过两个边框的面积的和减去交集部分即为并集,因此 IoU 的计算的难点在于交集的计算。

为了计算交集,你脑子里首先想到的方法应该是:考虑两个边框的相对位置,然后按照相对位置(左上,左下,右上,右下,包含,互不相交)分情况讨论,来计算交集。

在这里插入图片描述

上图就是你的直觉,这样想没有错。但计算一个交集,就要分多种情况讨论,要是程序真的按照这逻辑编写就太搞笑了。因此对这个问题进行进一步地研究显得十分有必要。

让我们重新思考一下两个框交集的计算。两个框交集的计算的实质是两个集合交集的计算,因此我们可以将两个框的交集的计算简化为:

在这里插入图片描述

通过简化,我们可以清晰地看到,交集计算的关键是交集上下界点(图中蓝点)的计算。

我们假设集合 A 为 [

x1x_{1}

x1​,

x2x_{2}

x2​],集合 B 为 [

y1y_{1}

y1​,

y2y_{2}

y2​]。然后我们来求AB交集的上下界限。

交集计算的逻辑

  • 交集下界
    z1z_{1}

    z1​:

    max(x1,y1)text{max}(x_{1}, y_{1})

    max(x1​,y1​)

  • 交集上界
    z2z_{2}

    z2​:

    min(x2,y2)text{min}(x_{2}, y_{2})

    min(x2​,y2​)

  • 如果
    z2z1z_{2}-z_{1}

    z2​−z1​ 小于0,则说明集合 A 和集合 B 没有交集。

下面使用Python来实现两个一维集合的 IoU 的计算:

def iou(set_a, set_b):     '''     一维 iou 的计算     '''     x1, x2 = set_a # (left, right)     y1, y2 = set_b # (left, right)          low = max(x1, x2)     high = min(y1, y2)     # intersection     if high-low<0:         inter = 0     else:         inter = high-low     # union     union = (x2 - x1) + (y2 - y1) - inter     # iou     iou = inter / union     return iou 

上面,我们计算了两个一维集合的 iou,将上面的程序进行扩展,即可得到两个框 IoU 计算的程序。

def iou(box1, box2):     '''     两个框(二维)的 iou 计算          注意:边框以左上为原点          box:[top, left, bottom, right]     '''     in_h = min(box1[2], box2[2]) - max(box1[0], box2[0])     in_w = min(box1[3], box2[3]) - max(box1[1], box2[1])     inter = 0 if in_h<0 or in_w<0 else in_h*in_w     union = (box1[2] - box1[0]) * (box1[3] - box1[1]) +              (box2[2] - box2[0]) * (box2[3] - box2[1]) - inter     iou = inter / union     return iou 

2. 基于TensorFlow的IoU实现

上节介绍了IoU,及其的计算,下面我们给出其在 TensorFlow 上的实现:

import tensorflow as tf  def IoU_calculator(x, y, w, h, l_x, l_y, l_w, l_h):     """calaulate IoU     Args:       x: net predicted x       y: net predicted y       w: net predicted width       h: net predicted height       l_x: label x       l_y: label y       l_w: label width       l_h: label height          Returns:       IoU     """          # convert to coner     x_max = x + w/2     y_max = y + h/2     x_min = x - w/2     y_min = y - h/2       l_x_max = l_x + l_w/2     l_y_max = l_y + l_h/2     l_x_min = l_x - l_w/2     l_y_min = l_y - l_h/2     # calculate the inter     inter_x_max = tf.minimum(x_max, l_x_max)     inter_x_min = tf.maximum(x_min, l_x_min)       inter_y_max = tf.minimum(y_max, l_y_max)     inter_y_min = tf.maximum(y_min, l_y_min)       inter_w = inter_x_max - inter_x_min     inter_h = inter_y_max - inter_y_min          inter = tf.cond(tf.logical_or(tf.less_equal(inter_w,0), tf.less_equal(inter_h,0)),                      lambda:tf.cast(0,tf.float32),                      lambda:tf.multiply(inter_w,inter_h))     # calculate the union     union = w*h + l_w*l_h - inter          IoU = inter / union     return IoU 

注意:欢迎大家转载,但需注明出处哦

quad quad &ThickSpace;;

https://blog.csdn.net/u014061630/article/details/82818112

相关阅读

电脑开机提示DQS training failed on previous boot怎

近来有不少用户反映在电脑开机时出现了提示:&ldquo;DQS training failed on previous boot,reverted to slower DRAM speed&rdquo;,

发表评论