解析目标检测之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实现大文件排序的方法
Jul 10 Python
Python 提取dict转换为xml/json/table并输出的实现代码
Aug 28 Python
再谈Python中的字符串与字符编码(推荐)
Dec 14 Python
python多环境切换及pyenv使用过程详解
Sep 27 Python
基于keras输出中间层结果的2种实现方式
Jan 24 Python
Python json转字典字符方法实例解析
Apr 13 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
浅析Python 条件控制语句
Jul 15 Python
Python 远程开关机的方法
Nov 18 Python
详解用selenium来下载小姐姐图片并保存
Jan 26 Python
Python函数式编程中itertools模块详解
Sep 15 Python
opencv深入浅出了解机器学习和深度学习
Mar 17 Python
pycharm代码删除恢复的方法
Python max函数中key的用法及原理解析
Python访问Redis的详细操作
一文搞懂python异常处理、模块与包
Python实战之OpenCV实现猫脸检测
Python爬虫基础之简单说一下scrapy的框架结构
Python爬虫基础之初次使用scrapy爬虫实例
You might like
PHP临时文件的安全性分析
2014/07/04 PHP
php实现可逆加密的方法
2015/08/11 PHP
基于PHP实现短信验证码接口(容联运通讯)
2016/09/06 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
破解Session cookie的方法
2006/07/28 Javascript
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
jQuery的Ajax时无响应数据的解决方法
2010/05/25 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
2014/06/05 Javascript
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
jQuery 操作input中radio的技巧
2016/07/18 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
Python键盘输入转换为列表的实例
2018/06/23 Python
详解Python对JSON中的特殊类型进行Encoder
2019/07/15 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
python3 配置logging日志类的操作
2020/04/08 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
幼儿园亲子活动方案
2014/01/29 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
认错检讨书
2014/10/02 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
运动会广播稿50字
2015/08/19 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis
python中使用 unittest.TestCase单元测试的用例详解
2021/08/30 Python
nginx搭建NFS网络文件系统
2022/04/14 Servers