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 17 Python
Python标准库defaultdict模块使用示例
Apr 28 Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
May 24 Python
python之virtualenv的简单使用方法(必看篇)
Nov 25 Python
Python列表切片操作实例总结
Feb 19 Python
Python自动抢红包教程详解
Jun 11 Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 Python
Python接口测试文件上传实例解析
May 22 Python
Python读写锁实现实现代码解析
Nov 28 Python
Python Django ORM连表正反操作技巧
Jun 13 Python
Python中的 enumerate和zip详情
May 30 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框架的性能
2008/01/10 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
JavaScript弹窗基础篇
2016/04/27 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
python 字符串格式化代码
2013/03/17 Python
python 实现登录网页的操作方法
2018/05/11 Python
Python递归函数实例讲解
2019/02/27 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
在python里使用await关键字来等另外一个协程的实例
2020/05/04 Python
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
2012/10/20 HTML / CSS
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
linux面试题参考答案(7)
2014/07/24 面试题
部队学习十八大感言
2014/01/11 职场文书
市场安全管理制度
2014/01/26 职场文书
党性心得体会
2014/09/03 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
python spilt()分隔字符串的实现示例
2021/05/21 Python