锚框之间的IOU理解

news/2024/7/2 23:28:15

以下函数是计算两两锚框之间的IOU,但是有两行代码看了好久,记录一下,怕下次又不理解了。。(哭泣)
在这里插入图片描述

def box_iou(boxes1, boxes2):
#计算两个锚框或边界框列表中成对的交并⽐#boxes形状:(boxes数量,4)4表示每个锚框的左上(x,y)、右下坐标(x, y)。#areas形状:(box数量,)box_area = lambda boxes: ((boxes[:, 2] - boxes[:, 0])) * ((boxes[:, 3] - boxes[:, 1]))areas1 = box_area(boxes1)areas2 = box_area(boxes2)print(boxes1[:, None, :2])print(boxes2[:, :2])inter_upperlefts = torch.max(boxes1[:, None, :2], boxes2[:, :2])print(f'inter_upperlefts:{inter_upperlefts}')# `inter_upperlefts`, `inter_lowerrights`, `inters`的形状:# (boxes1的数量, boxes2的数量, 2)inter_lowerrights = torch.min(boxes1[:, None, 2:], boxes2[:, 2:])inters = (inter_lowerrights - inter_upperlefts).clamp(min=0)inter_areas = inters[:, :, 0] * inters[:, :, 1]union_areas = areas1[:, None] + areas2 - inter_areasreturn inter_areas / union_areas
box1 = torch.tensor([[67.50,  67.50, 433.50, 433.50],[128.50, 128.50, 372.50, 372.50]])box2 = torch.tensor([[ -8.30, 121.10, 509.30, 379.90],[189.50, 189.50, 311.50, 311.50]])
c = box_iou(box1, box2)

输出结果:

tensor([[[ 67.50,  67.50]],[[128.50, 128.50]]])tensor([[ -8.30, 121.10],[189.50, 189.50]])inter_upperlefts:tensor([[[ 67.50, 121.10],[189.50, 189.50]],[[128.50, 128.50],[189.50, 189.50]]])

boxes1[:, None, :2]是一个2*1*2的形状,也就是None给Tensor增加了一个维度,boxes2[:, :2]是一个2*2的形状,当torch.max()对两者作用时,会触发广播机制,将两者进行扩充,最终输出的inter_upperlefts形状为2*2*2。

具体点,就是将boxes1中的每个左上坐标,跟boxes2中所有锚框的左上坐标进行比较,取得最大值。
以代码为例,传入的是2*2也就是每个boxes中含有两个锚框,因此在执行上述代码时,会对boxes1和boxes2进行广播,均变成2*2*2。图中的标号代表广播时,将boxes1中的前左上坐标“一个一个”复制n份(n为锚框个数),而boxes2中的左上坐标是“一份一份”的进行复制,这样对应起来就是boxes1中的每一个在跟boxes2中的每一个进行比较后取最大值。在这个过程中要比较(boxes1中锚框个数*boxes2中锚框个数)次,最终inter_leftrights中存储的就是两两比较后的较大左上坐标,inter_lowerrights中存储的两两比较后的较小右下坐标。两者相减再相乘就是两两锚框之间的相交面积。
(emm,描述起来好多字hhh)在这里插入图片描述


http://lihuaxi.xjx100.cn/news/247499.html

相关文章

pandas中DataFrame的ix,loc,iloc索引方式的异同

pandas中DataFrame的ix,loc,iloc索引方式的异同 1、loc: 按照标签索引,范围包括start和end 2、iloc: 在位置上进行索引,不包括end 3、ix: 先在index上索引,索引不到就在index的位置上进行索引(如果index非全…

HTTP的KeepAlive是开启还是关闭?

转自:http://blog.csdn.net/gaogaoshan/article/details/38580013 1、KeepAlive的概念与优势 HTTP的KeepAlive就是浏览器和服务端之间保持长连接,这个连接是可以复用的。当客户端发送一次请求,收到相应内容后,这个连接会保持一段时…

with admin option /with grant option

1. with admin option是用在系统权限上的,with grant option是用在对象权限上的。 SQL> grant create synonym to scott with grant option;grant create synonym to scott with grant option *第 1 行出现错误:ORA-01939: 只…

数学的关键是概念而非技巧

因为中小学数学里面的概念比较少,所以就在一些难题、技巧上下功夫,这恰恰是舍本逐末的做法,值得所有的数学教育工作者深思。 那么数的概念是什么呢,大家知道有理数啊,一看就知道了,绝大多数同学不会去记这…

torch.nonezero()的用法

函数原型: torch.nonzero(input, outNone) → LongTensor参数: input (Tensor) – 源张量 out (LongTensor, optional) – 包含索引值的结果张量 代码示例 返回一个包含输入input中非零元素索引的张量。输出张量中的每行包含输入中非零元素的索引。 x torch.t…

perl 编程 - 判断系统进程是否活着的方法

2019独角兽企业重金招聘Python工程师标准>>> 前言:我在使用perl编写CGI程序时遇到的一些问题,解决以后,记录一下我的心得,有心的朋友们会从中得到帮助并养成正确使用的好习惯。 perl编程中判断系统进程是否存活的方法…

如何用ABAP代码读取CDS view association的数据

我有如下一个CDS view, 这个view的数据来自CRMD_ORDERADM_H, 定义了一个名称为_statushelp的association, 指向了另一个CDS view Z_C_Status_Valuehelp.该view暴露了两个字段STATUS_KEY和STATUS_TEXT. 现在我的需求是:在ABAP代码里只需要一次读操作,既能…