解析目标检测之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抓取Discuz!用户名脚本代码
Dec 30 Python
python3爬取各类天气信息
Feb 24 Python
Python使用post及get方式提交数据的实例
Jan 24 Python
Python之lambda匿名函数及map和filter的用法
Mar 05 Python
Python基于WordCloud制作词云图
Nov 29 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
Feb 20 Python
python argparse模块通过后台传递参数实例
Apr 20 Python
PyCharm最新激活码(2020/10/27全网最新)
Oct 27 Python
python搜索算法原理及实例讲解
Nov 18 Python
如何利用python生成MD5并去重
Dec 07 Python
学点简单的Django之第一个Django程序的实现
Feb 24 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 Python
pycharm代码删除恢复的方法
Python max函数中key的用法及原理解析
Python访问Redis的详细操作
一文搞懂python异常处理、模块与包
Python实战之OpenCV实现猫脸检测
Python爬虫基础之简单说一下scrapy的框架结构
Python爬虫基础之初次使用scrapy爬虫实例
You might like
全新Mac配置PHP开发环境教程
2016/02/03 PHP
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
微信小程序自定义导航隐藏和显示功能
2017/06/13 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
vue-router 组件复用问题详解
2018/01/22 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
详解redux异步操作实践
2018/08/15 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
python交互式图形编程实例(三)
2017/11/17 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
Pandas库之DataFrame使用的学习笔记
2019/06/21 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
python批量生成条形码的示例
2020/10/10 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
美术指导求职信
2014/03/17 职场文书
贷款承诺书范文
2014/05/19 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
SpringBoot 拦截器妙用你真的了解吗
2021/07/01 Java/Android
SpringBoot详解执行过程
2022/07/15 Java/Android