解析目标检测之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列表list数组array用法实例解析
Oct 28 Python
python获取各操作系统硬件信息的方法
Jun 03 Python
利用Python脚本实现ping百度和google的方法
Jan 24 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
Jun 17 Python
python3 线性回归验证方法
Jul 09 Python
pandas factorize实现将字符串特征转化为数字特征
Dec 19 Python
通过实例解析Python return运行原理
Mar 04 Python
Scrapy爬虫文件批量运行的实现
Sep 30 Python
用Python写一个简易版弹球游戏
Apr 13 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 Python
pycharm代码删除恢复的方法
Python max函数中key的用法及原理解析
Python访问Redis的详细操作
一文搞懂python异常处理、模块与包
Python实战之OpenCV实现猫脸检测
Python爬虫基础之简单说一下scrapy的框架结构
Python爬虫基础之初次使用scrapy爬虫实例
You might like
我的论坛源代码(四)
2006/10/09 PHP
让你成为更出色的PHP开发者的10个技巧
2011/02/25 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
PHP多进程简单实例小结
2019/11/09 PHP
JavaScript中null与undefined分析
2009/07/25 Javascript
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
2016/09/01 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
JS实现网站吸顶条
2020/01/08 Javascript
javascript事件循环event loop的简单模型解释与应用分析
2020/03/14 Javascript
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
Python操作Excel之xlsx文件
2017/03/24 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
2019/03/29 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
安全生产检查通报
2014/01/29 职场文书
财经学院自荐信范文
2014/02/02 职场文书
业务部门经理岗位职责
2014/02/23 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
计算机科学系职业生涯规划书
2014/03/08 职场文书
会议室标语
2014/06/21 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
大学学生会辞职信
2015/05/13 职场文书
傲慢与偏见读书笔记
2015/06/29 职场文书
Python加密与解密模块hashlib与hmac
2022/06/05 Python