解析目标检测之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的Django框架来制作一个RSS阅读器
Jul 22 Python
Python urls.py的三种配置写法实例详解
Apr 28 Python
Python 通配符删除文件的实例
Apr 24 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
python os.path模块常用方法实例详解
Sep 16 Python
PyQt打开保存对话框的方法和使用详解
Feb 27 Python
python通过matplotlib生成复合饼图
Feb 06 Python
keras 获取某层输出 获取复用层的多次输出实例
May 23 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
Python爬虫使用bs4方法实现数据解析
Aug 25 Python
Python存储读取HDF5文件代码解析
Nov 25 Python
Python数据分析之pandas读取数据
Jun 02 Python
pycharm代码删除恢复的方法
Python max函数中key的用法及原理解析
Python访问Redis的详细操作
一文搞懂python异常处理、模块与包
Python实战之OpenCV实现猫脸检测
Python爬虫基础之简单说一下scrapy的框架结构
Python爬虫基础之初次使用scrapy爬虫实例
You might like
怎样辨别一杯好咖啡
2021/03/03 新手入门
php实现利用phpexcel导出数据
2013/08/24 PHP
分享php邮件管理器源码
2016/01/06 PHP
thinkPHP5.0框架独立配置与动态配置方法
2017/03/17 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
JS中style属性
2006/10/11 Javascript
用js实现随机返回数组的一个元素
2007/08/13 Javascript
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
2014/04/04 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
Vue.js对象转换实例
2017/06/07 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
python实现二维码扫码自动登录淘宝
2016/12/27 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
python下载卫星云图合成gif的方法示例
2020/02/18 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
使用CSS3实现多列布局与多背景的技巧
2016/02/29 HTML / CSS
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
美国一家著名的手表在线折扣网站:Discount Watch Store
2020/02/24 全球购物
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
3.12植树节活动总结2014
2014/03/13 职场文书
服装仓管员岗位职责
2014/06/17 职场文书
节约用电倡议书
2015/04/28 职场文书
小学运动会通讯稿
2015/07/18 职场文书
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript