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的消息队列包SnakeMQ使用初探
Jun 29 Python
解决Pycharm运行时找不到文件的问题
Oct 29 Python
Python设计模式之工厂方法模式实例详解
Jan 18 Python
详解Python中的测试工具
Jun 09 Python
使用Python和Scribus创建一个RGB立方体的方法
Jul 17 Python
python中的逆序遍历实例
Dec 25 Python
pytorch读取图像数据转成opencv格式实例
Jun 02 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
django rest framework 自定义返回方式
Jul 12 Python
基于python实现生成指定大小txt文档
Jul 20 Python
python实现KNN近邻算法
Dec 30 Python
Django中的DateTimeField和DateField实现
Feb 24 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
数据库的日期格式转换
2006/10/09 PHP
php基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
PHP var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
2014/05/12 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
2015/05/11 PHP
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
jquery win 7透明弹出层效果的简单代码
2013/08/06 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
21个值得收藏的Javascript技巧
2014/02/04 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
jquery移动节点实例
2015/01/14 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
JS添加或删除HTML dom元素的方法实例分析
2019/03/05 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
python基础教程之字典操作详解
2014/03/25 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
2018/07/10 Python
详解flask入门模板引擎
2018/07/18 Python
Django中ORM的基本使用教程
2020/12/22 Python
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
公司活动邀请函
2014/01/24 职场文书
铁路个人事迹材料
2014/01/30 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
春节超市活动方案
2014/08/14 职场文书
公务员检讨书
2014/11/01 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL