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获取文件ssdeep值的方法
Oct 05 Python
Python实现的数据结构与算法之队列详解
Apr 22 Python
深入浅析Python传值与传址
Jul 10 Python
python实现决策树分类(2)
Aug 30 Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 Python
PySide和PyQt加载ui文件的两种方法
Feb 27 Python
基于python cut和qcut的用法及区别详解
Nov 22 Python
python 命名规范知识点汇总
Feb 14 Python
PyCharm 在Windows的有用快捷键详解
Apr 07 Python
解决tensorflow 释放图,删除变量问题
Jun 23 Python
Python 爬虫性能相关总结
Aug 03 Python
Python echarts实现数据可视化实例详解
Mar 03 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加速器eAccelerator的配置参数、API详解
2014/05/05 PHP
php绘制一条弧线的方法
2015/01/24 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
List Installed Software Features
2007/06/11 Javascript
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
JavaScript JMap类定义与使用方法示例
2019/01/22 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
2017/10/20 Python
Python进程间通信之共享内存详解
2017/10/30 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
2020/06/05 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
旅游网创业计划书
2014/01/31 职场文书
护士找工作求职信
2014/07/02 职场文书
大学生自荐信范文
2015/03/05 职场文书
小学语文新课改心得体会
2016/01/22 职场文书
MySQL中varchar和char类型的区别
2021/11/17 MySQL
Python+pyaudio实现音频控制示例详解
2022/07/23 Python