解析目标检测之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 相关文章推荐
pycharm 使用心得(五)断点调试
Jun 06 Python
python中Genarator函数用法分析
Apr 08 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
Dec 24 Python
深入理解 Python 中的多线程 新手必看
Nov 20 Python
python中的不可变数据类型与可变数据类型详解
Sep 16 Python
python3去掉string中的标点符号方法
Jan 22 Python
Python正则表达式匹配和提取IP地址
Jun 06 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
PyCharm中关于安装第三方包的三个建议
Sep 17 Python
python解包用法详解
Feb 17 Python
Python进阶学习之带你探寻Python类的鼻祖-元类
May 08 Python
Python3的进程和线程你了解吗
Mar 16 Python
pycharm代码删除恢复的方法
Python max函数中key的用法及原理解析
Python访问Redis的详细操作
一文搞懂python异常处理、模块与包
Python实战之OpenCV实现猫脸检测
Python爬虫基础之简单说一下scrapy的框架结构
Python爬虫基础之初次使用scrapy爬虫实例
You might like
PHP 文件类型判断代码
2009/03/13 PHP
CentOS安装php v8js教程
2015/02/26 PHP
最新优化收藏到网摘代码(digg,diigo)
2007/02/07 Javascript
轻轻松松学习JavaScript
2007/02/25 Javascript
基于jQuery的弹出框插件
2012/03/18 Javascript
关于jQuery UI 使用心得及技巧
2012/10/10 Javascript
面向对象设计模式的核心法则
2013/11/10 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
jQuery.cookie.js使用方法及相关参数解释
2017/03/06 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
[33:42]LGD vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
在Python上基于Markov链生成伪随机文本的教程
2015/04/17 Python
python中随机函数random用法实例
2015/04/30 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
Python实现的手机号归属地相关信息查询功能示例
2017/06/08 Python
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
应届毕业生应聘自荐信
2013/12/07 职场文书
铁路个人事迹材料
2014/01/30 职场文书
年终晚会活动方案
2014/08/21 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
Python实现为PDF去除水印的示例代码
2022/04/03 Python