解析目标检测之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的列表中利用remove()方法删除元素的教程
May 21 Python
Python读写/追加excel文件Demo分享
May 03 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
Python爬虫之正则表达式的使用教程详解
Oct 25 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
python+django+rest框架配置创建方法
Aug 31 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
Mar 14 Python
Python+logging输出到屏幕将log日志写入文件
Nov 11 Python
python 基于opencv操作摄像头
Dec 24 Python
python爬取youtube视频的示例代码
Mar 03 Python
python基础之文件操作
Oct 24 Python
python机器学习Github已达8.9Kstars模型解释器LIME
Nov 23 Python
pycharm代码删除恢复的方法
Python max函数中key的用法及原理解析
Python访问Redis的详细操作
一文搞懂python异常处理、模块与包
Python实战之OpenCV实现猫脸检测
Python爬虫基础之简单说一下scrapy的框架结构
Python爬虫基础之初次使用scrapy爬虫实例
You might like
Adodb的十个实例(清晰版)
2006/12/31 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
2019/01/10 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
jQuery 选择器详解
2015/01/19 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
Vue的路由动态重定向和导航守卫实例
2018/03/17 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
[00:12]DAC2018 天才少年转战三号位,他的SOLO是否仍如昔日般强大?
2018/04/06 DOTA
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python 可爱的大小写
2008/09/06 Python
利用python实现数据分析
2017/01/11 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
在PyCharm中实现关闭一个死循环程序的方法
2018/11/29 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
Python线程指南分享
2019/11/19 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
python中str内置函数用法总结
2020/12/27 Python
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
PHP如何去执行一个SQL语句
2016/03/05 面试题
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
酒店服务与管理毕业生求职信
2013/11/02 职场文书
心得体会范文
2014/01/04 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
大学生自荐书范文
2015/03/05 职场文书
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android