python不使用for计算两组、多个矩形两两间的iou方式
作者:学渣在路上 发布时间:2021-08-19 19:08:33
标签:python,for,矩形,iou
解决问题: 不使用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计算原理:
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则如右图所示
来源:https://blog.csdn.net/XDH19910113/article/details/96997528


猜你喜欢
- 如何在 git 中取消 pycache 文件如果使用 PyCharm 运行代码,会在 Python 脚本所在目录生成 __pycache__
- (一)Python 是如何进行内存管理的?答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制⒈对象的引用计数机制Pyth
- 问题你想创建一个内嵌变量的字符串,变量被它的值所表示的字符串替换掉。解决方案Python并没有对在字符串中简单替换变量值提供直接的支持。 但
- 我们在前面已经分别介绍了如何在spring Boot中使用JPA以及如何在Spring Boot中输出REST资源。那么关于数据库访问还有一
- Python中的数据可视化matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地
- 我就废话不多说了,直接上代码吧!import datetimeimport timedef get_float_time_stamp():
- 1.CNN卷积层通过nn.Conv2d可以设置卷积层,当然也有1d和3d。卷积层设置完毕,将设置好的输入数据,传给layer(),即可完成一
- 本文实例介绍了asp对access数据库常见操作方法,查找记录,添加记录更新记录,删除记录等。一、查找记录find.htm<HTML&
- 本文实例为大家分享了Python实现五子棋游戏的具体代码,供大家参考,具体内容如下了解游戏的规则是我们首先需要做的事情,如果不知晓规则,那么
- 在服务器上训练的网络放到本地台式机进行infer,结果出现报错:AssertionError: Invalid device id仔细检查后
- 模版结构优化引入模版有时候一些代码是在许多模版中都用到的。如果我们每次都重复的去拷贝代码那肯定不符合项目的规范。一般我们可以把这些重复性的代
- PyQt的使用与pycharm的结合环境安装pip install pyqt5 -i https://pypi.tuna.tsinghua.
- Python中多线程使用到Threading模块。Threading模块中用到的主要的类是Thread,我们先来写一个简单的多线程代码:#
- 前言为什么会做这个?因为我们把word转化为pdf,wps默认转化为文字pdf,而图片pdf要会员。网上确实也有网站可以实现免费的,但是未必
- (一)问题遗传算法求解正方形拼图游戏(二)代码#!/usr/bin/env python# -*- coding: utf-8 -*-fro
- 如下所示:"""提取文档数超过10000的数据按照某个字段的值具有唯一性进行升序,按照@timestamp进行
- 今天自己写个楼层效果,有一点烦躁,小地方犯错误。各位大神来修改不足啊!!!<!DOCTYPE html><html lan
- 注:MySQL5.7破解root密码,跳过密码认证登录到数据库,直接修改表中的密码即可,但是MySQL 8.0则不可以这样修改root密码,
- Git 创建仓库本章节我们将为大家介绍如何创建一个 Git 仓库。你可以使用一个已经存在的目录作为Git仓库。git initGit 使用
- 前言JSON类型是MySQL5.7.8中新加入的一种数据类型,并在后续版本尤其是MySQL8.0中得到了大幅增强,现在的JSON类型的功能十