解析目标检测之IoU

 更新时间:2021年06月26日 14:47:59   作者:黑暗星球  
Intersection over Union(IoU)是一种测量在特定数据集中检测相应物体准确度的一个标准。IoU是一个简单的测量标准,只要是在输出中得出一个预测范围(bounding boxes)的任务都可以用IoU来进行测量

一、IoU的简介及原理解析

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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

我们假设集合 A 为 [x1,x2],集合 B 为 [y1,y2]。然后我们来求AB交集的上下界限。

交集计算的逻辑

  • 交集下界z1:max(x1,y1)
  • 交集上界z2:min(x2,y2)
  • 如果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, y1)
    high = min(x2, 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

二、基于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

以上就是解析目标检测之IoU的详细内容,更多关于目标检测IoU的资料请关注脚本之家其它相关文章!

相关文章

  • Python Pandas条件筛选功能

    Python Pandas条件筛选功能

    这篇文章主要介绍了Python Pandas条件筛选功能,筛选是在平时的工作中使用非常频繁的功能了,下文详细的相关资料介绍,需要的小伙伴可以参考一下
    2022-03-03
  • Python中list列表的一些进阶使用方法介绍

    Python中list列表的一些进阶使用方法介绍

    这篇文章主要介绍了Python中list列表的一些进阶使用方法介绍,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • python如何输出反斜杠

    python如何输出反斜杠

    在本篇内容中小编给大家整理了一篇关于python怎么输出反斜杠的相关基础文章,有兴趣的朋友们可以学习参考下。
    2020-06-06
  • 如何用Python从桌面读取二维码信息详解

    如何用Python从桌面读取二维码信息详解

    二维码作为一种信息传递的工具,在当今社会发挥了重要作用,下面这篇文章主要给大家介绍了关于如何用Python从桌面读取二维码信息的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • Python中函数相关的变量作用域

    Python中函数相关的变量作用域

    这篇文章主要介绍了Python中函数相关的变量作用域,变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,在访问时就会出现错误,需要的朋友可以参考下
    2023-08-08
  • python定时截屏实现

    python定时截屏实现

    这篇文章主要介绍了python定时截屏实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • python计算对角线有理函数插值的方法

    python计算对角线有理函数插值的方法

    这篇文章主要介绍了python计算对角线有理函数插值的方法,涉及Python数学运算的相关技巧,需要的朋友可以参考下
    2015-05-05
  • 利用Python实现外观数列求解

    利用Python实现外观数列求解

    这篇文章主要介绍了利用Python实现外观数列求解,文章利用举例说明文章的主题内容,具有一定的参考价值,需要的小伙伴乐意参考一下
    2022-03-03
  • python可变对象,不可变对象详解

    python可变对象,不可变对象详解

    这篇文章主要介绍了Python可变对象和不可变对象的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2021-09-09
  • python 判断字符串中是否含有汉字或非汉字的实例

    python 判断字符串中是否含有汉字或非汉字的实例

    今天小编就为大家分享一篇python 判断字符串中是否含有汉字或非汉字的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07

最新评论