解析目标检测之IoU


Posted in Python onJune 26, 2021

一、IoU的简介及原理解析

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

解析目标检测之IoU

开始计算之前,我们首先进行分析下交集和并集到底应该怎么计算:我们首先需要计算交集,然后并集通过两个边框的面积的和减去交集部分即为并集,因此 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 相关文章推荐
介绍Python中几个常用的类方法
Apr 08 Python
Python计算两个日期相差天数的方法示例
May 23 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
python画图的函数用法以及技巧
Jun 28 Python
Django自定义模板过滤器和标签的实现方法
Aug 21 Python
解决Atom安装Hydrogen无法运行python3的问题
Aug 28 Python
Python函数基本使用原理详解
Mar 19 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 Python
python 实时调取摄像头的示例代码
Nov 25 Python
解决pytorch 数据类型报错的问题
Mar 03 Python
python 指定源路径来解决import问题的操作
Mar 04 Python
python数据可视化JupyterLab实用扩展程序Mito
Nov 20 Python
pycharm代码删除恢复的方法
Python max函数中key的用法及原理解析
Python访问Redis的详细操作
一文搞懂python异常处理、模块与包
Python实战之OpenCV实现猫脸检测
Python爬虫基础之简单说一下scrapy的框架结构
Python爬虫基础之初次使用scrapy爬虫实例
You might like
PHP图像处理类库及演示分享
2015/05/17 PHP
php微信公众账号开发之前五个坑(一)
2016/09/18 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
javascript 自动转到命名锚记
2009/01/10 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
JavaScript中Math.SQRT2属性的使用详解
2015/06/14 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
js获取图片宽高的方法
2015/11/25 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
详解Angular系列之变化检测(Change Detection)
2018/02/26 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
javascript中的this作用域详解
2019/07/15 Javascript
VUE路由动态加载实例代码讲解
2019/08/26 Javascript
vscode调试node.js的实现方法
2020/03/22 Javascript
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
Python csv模块使用方法代码实例
2019/08/29 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
python 实现&quot;神经衰弱&quot;翻牌游戏
2020/11/09 Python
Bootstrap 学习分享
2012/11/12 HTML / CSS
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
标准导师推荐信(医学类)
2013/10/28 职场文书
简历自荐信
2013/12/02 职场文书
小区门卫岗位职责
2013/12/31 职场文书
教师党员思想汇报
2014/01/06 职场文书
2014的自我评价
2014/01/13 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
作文评语集锦
2014/12/25 职场文书
初中军训感言
2015/08/01 职场文书
Java常用函数式接口总结
2021/06/29 Java/Android