解析目标检测之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连接PostgreSQL数据库的方法
Nov 28 Python
利用python获取当前日期前后N天或N月日期的方法示例
Jul 30 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
python requests.post带head和body的实例
Jan 02 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
Feb 12 Python
IntelliJ 中配置 Anaconda的过程图解
Jun 01 Python
浅谈Django前端后端值传递问题
Jul 15 Python
python实现简单的五子棋游戏
Sep 01 Python
python中turtle库的简单使用教程
Nov 11 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
Dec 23 Python
Python各协议下socket黏包问题原理
Apr 12 Python
pycharm代码删除恢复的方法
Python max函数中key的用法及原理解析
Python访问Redis的详细操作
一文搞懂python异常处理、模块与包
Python实战之OpenCV实现猫脸检测
Python爬虫基础之简单说一下scrapy的框架结构
Python爬虫基础之初次使用scrapy爬虫实例
You might like
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
php查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
分享PHP守护进程类
2015/12/30 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
2016/04/15 PHP
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
JavaScript字符串对象(string)基本用法示例
2017/01/18 Javascript
webpack构建换肤功能的思路详解
2017/11/27 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
vue项目中实现的微信分享功能示例
2019/01/21 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
[51:26]VP vs VG 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python中使用Inotify监控文件实例
2015/02/14 Python
python绘制多个子图的实例
2019/07/07 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
python如何获取apk的packagename和activity
2020/01/10 Python
Python不支持 i ++ 语法的原因解析
2020/07/22 Python
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
P/Invoke是什么
2015/07/31 面试题
linux面试题参考答案(9)
2016/01/29 面试题
Java语言的优势
2015/01/10 面试题
商铺门前三包责任书
2014/07/25 职场文书
美术教师求职信范文
2015/03/20 职场文书
2015年度内部审计工作总结
2015/05/20 职场文书
拉贝日记观后感
2015/06/05 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
高中体育课教学反思
2016/02/16 职场文书
MySQL中的隐藏列的具体查看
2021/09/04 MySQL
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android
redis数据一致性的实现示例
2022/03/18 Redis