解析目标检测之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 可爱的大小写
Sep 06 Python
python在指定目录下查找gif文件的方法
May 04 Python
Python入门学习之字符串与比较运算符
Oct 12 Python
Python实现将xml导入至excel
Nov 20 Python
python脚本设置系统时间的两种方法
Feb 21 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
python 中的divmod数字处理函数浅析
Oct 17 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
Mar 22 Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 Python
PyTorch实现AlexNet示例
Jan 14 Python
pycharm代码删除恢复的方法
Python max函数中key的用法及原理解析
Python访问Redis的详细操作
一文搞懂python异常处理、模块与包
Python实战之OpenCV实现猫脸检测
Python爬虫基础之简单说一下scrapy的框架结构
Python爬虫基础之初次使用scrapy爬虫实例
You might like
理解PHP5中static和const关键字的区别
2007/03/19 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
解析isset与is_null的区别
2013/08/09 PHP
Laravel实现autoload方法详解
2017/05/07 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
PHP递归实现汉诺塔问题的方法示例
2017/11/25 PHP
jQuery 使用个人心得
2009/02/26 Javascript
js保存当前路径(cookies记录)
2010/12/14 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
javascript 回调函数详解
2014/11/11 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
2020/11/16 Javascript
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
pow在python中的含义及用法
2019/07/11 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
python将unicode和str互相转化的实现
2020/05/11 Python
python实现简单的五子棋游戏
2020/09/01 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
多视角3D可旋转的HTML5 Logo动画
2016/03/02 HTML / CSS
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
递归计算如下递归函数的值(斐波拉契)
2012/02/04 面试题
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
文明演讲稿范文
2014/05/12 职场文书
教育教学工作反思
2016/02/24 职场文书
Mysql Show Profile
2021/04/05 MySQL
小程序wx.getUserProfile接口的具体使用
2021/06/02 Javascript
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL