python不使用for计算两组、多个矩形两两间的iou方式


Posted in Python onJanuary 18, 2020

解决问题: 不使用for计算两组、多个矩形两两间的iou

使用numpy广播的方法,在python程序中并不建议使用for语句,python中的for语句耗时较多,如果使用numpy广播的思想将会提速不少。

代码:

def calc_iou(bbox1, bbox2):
 if not isinstance(bbox1, np.ndarray):
  bbox1 = np.array(bbox1)
 if not isinstance(bbox2, np.ndarray):
  bbox2 = np.array(bbox2)
 xmin1, ymin1, xmax1, ymax1, = np.split(bbox1, 4, axis=-1)
 xmin2, ymin2, xmax2, ymax2, = np.split(bbox2, 4, axis=-1)
 
 area1 = (xmax1 - xmin1) * (ymax1 - ymin1)
 area2 = (xmax2 - xmin2) * (ymax2 - ymin2)
 
 ymin = np.maximum(ymin1, np.squeeze(ymin2, axis=-1))
 xmin = np.maximum(xmin1, np.squeeze(xmin2, axis=-1))
 ymax = np.minimum(ymax1, np.squeeze(ymax2, axis=-1))
 xmax = np.minimum(xmax1, np.squeeze(xmax2, axis=-1))
 
 h = np.maximum(ymax - ymin, 0)
 w = np.maximum(xmax - xmin, 0)
 intersect = h * w
 
 union = area1 + np.squeeze(area2, axis=-1) - intersect
 return intersect / union

程序中输入为多个矩形[xmin, ymin, xmax,ymax]格式的数组或者list,输出为numpy格式,例:输入的shape为(3, 4)、(5,4)则输出为(3, 5)各个位置为boxes间相互的iou值。后面会卡一个iou的阈值,然后就可以将满足条件的索引取出。如:

def delete_bbox(bbox1, bbox2, roi_bbox1, roi_bbox2, class1, class2, idx1, idx2, iou_value):
 idx = np.where(iou_value > 0.4)
 left_idx = idx[0]
 right_idx = idx[1]
 left = roi_bbox1[left_idx]
 right = roi_bbox2[right_idx]
 xmin1, ymin1, xmax1, ymax1, = np.split(left, 4, axis=-1)
 xmin2, ymin2, xmax2, ymax2, = np.split(right, 4, axis=-1)
 left_area = (xmax1 - xmin1) * (ymax1 - ymin1)
 right_area = (xmax2 - xmin2) * (ymax2 - ymin2)
 left_idx = left_idx[np.squeeze(left_area < right_area, axis=-1)]#小的被删
 right_idx = right_idx[np.squeeze(left_area > right_area, axis=-1)]
 
 bbox1 = np.delete(bbox1, idx1[left_idx], 0)
 class1 = np.delete(class1, idx1[left_idx])
 bbox2 = np.delete(bbox2, idx2[right_idx], 0)
 class2 = np.delete(class2, idx2[right_idx])
 
 return bbox1, bbox2, class1, class2

IOU计算原理:

python不使用for计算两组、多个矩形两两间的iou方式

ymin = np.maximum(ymin1, np.squeeze(ymin2, axis=-1))

xmin = np.maximum(xmin1, np.squeeze(xmin2, axis=-1))

ymax = np.minimum(ymax1, np.squeeze(ymax2, axis=-1))

xmax = np.minimum(xmax1, np.squeeze(xmax2, axis=-1))

h = np.maximum(ymax - ymin, 0)

w = np.maximum(xmax - xmin, 0)

intersect = h * w

计算矩形间min的最大值,max的最小值,如果ymax-ymin值大于0则如左图所示,如果小于0则如右图所示

以上这篇python不使用for计算两组、多个矩形两两间的iou方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单讲解Python中的数字类型及基本的数学计算
Mar 11 Python
详解python之配置日志的几种方式
May 22 Python
轻松理解Python 中的 descriptor
Sep 15 Python
Python 单元测试(unittest)的使用小结
Nov 14 Python
Python小游戏之300行代码实现俄罗斯方块
Jan 04 Python
python实现对象列表根据某个属性排序的方法详解
Jun 11 Python
Django应用程序入口WSGIHandler源码解析
Aug 05 Python
Pycharm连接远程服务器过程图解
Apr 30 Python
Python实现UDP程序通信过程图解
May 15 Python
python实现监听键盘
Apr 26 Python
python爬虫之selenium库的安装及使用教程
May 23 Python
Python实现位图分割的效果
Nov 20 Python
浅谈Python3实现两个矩形的交并比(IoU)
Jan 18 #Python
利用setuptools打包python程序的方法步骤
Jan 18 #Python
python计算二维矩形IOU实例
Jan 18 #Python
解决python replace函数替换无效问题
Jan 18 #Python
使用Python来做一个屏幕录制工具的操作代码
Jan 18 #Python
pytorch 状态字典:state_dict使用详解
Jan 17 #Python
Python标准库itertools的使用方法
Jan 17 #Python
You might like
php适配器模式介绍
2012/08/14 PHP
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
jQuery代码优化 事件委托篇
2011/11/01 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
javascript页面加载完执行事件代码
2014/02/11 Javascript
jQuery中的编程范式详解
2014/12/15 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
基本DOM节点操作
2017/01/17 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
深入理解Angular4订阅(Subscribe)与取消
2017/11/22 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
详解如何修改 node_modules 里的文件
2020/05/22 Javascript
详细分析vue响应式原理
2020/06/22 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
酒店值班经理的工作职责范本
2014/02/18 职场文书
家长写给孩子的评语
2014/04/18 职场文书
民族精神月活动总结
2014/08/28 职场文书
教师三严三实心得体会
2014/10/11 职场文书
学习与创新自我评价
2015/03/09 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
安全教育培训制度
2015/08/06 职场文书
母亲节主题班会
2015/08/14 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书