解析目标检测之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比较两个列表大小的方法
Jul 11 Python
Python实现字符串逆序输出功能示例
Jun 24 Python
Django内容增加富文本功能的实例
Oct 17 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
Python字符串、整数、和浮点型数相互转换实例
Aug 04 Python
理想高通滤波实现Python opencv示例
Jan 30 Python
Python当中的array数组对象实例详解
Jun 12 Python
详解用Python为直方图绘制拟合曲线的两种方法
Aug 21 Python
Python numpy.zero() 初始化矩阵实例
Nov 27 Python
python文件绝对路径写法介绍(windows)
Dec 25 Python
利用python绘制中国地图(含省界、河流等)
Sep 21 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 Python
pycharm代码删除恢复的方法
Python max函数中key的用法及原理解析
Python访问Redis的详细操作
一文搞懂python异常处理、模块与包
Python实战之OpenCV实现猫脸检测
Python爬虫基础之简单说一下scrapy的框架结构
Python爬虫基础之初次使用scrapy爬虫实例
You might like
详解PHP如何更好的利用PHPstorm的自动提示
2017/08/18 PHP
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
2007/02/15 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
Js参数值中含有单引号或双引号问题的解决方法
2013/11/06 Javascript
jquery控制页面部分刷新的方法
2015/06/24 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
jQuery获取file控件中图片的宽高与大小
2016/08/04 Javascript
概述jQuery的元素筛选
2016/11/23 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
easy ui datagrid 从编辑框中获取值的方法
2017/02/22 Javascript
JavaScript之DOM_动力节点Java学院整理
2017/07/03 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
bootstrap table实现合并单元格效果
2018/12/24 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python 默认参数问题的陷阱
2016/02/29 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
python实现网页自动签到功能
2019/01/21 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
详解Python中import机制
2020/09/11 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
德国机车企业:FC-Moto
2017/10/27 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
同学会邀请书大全
2014/01/12 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
采购经理岗位职责
2014/02/16 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
房屋租赁合同解除协议书
2014/10/11 职场文书
教学质量月活动总结
2015/05/11 职场文书
订货会主持词
2015/07/01 职场文书
创业计划书之暑假培训班
2019/11/09 职场文书
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
Python 可迭代对象 iterable的具体使用
2021/08/07 Python