李沐《动手学深度学习》锚框部分计算交并比(IoU)函数笔记

本文主要是学习沐神《动手学深度学习》锚框部分计算交并比(IoU)这一部分函数的手写笔记,主要给自己看,字丑见谅。

交并比(IoU)

1.得到锚框和真实框面积
def box_iou(boxes1, boxes2):
    """计算两个锚框或边界框列表中成对的交并比"""
    box_area = lambda boxes: ((boxes[:, 2] - boxes[:, 0]) *
                              (boxes[:, 3] - boxes[:, 1]))
    # boxes1,boxes2,areas1,areas2的形状:
    # boxes1:(boxes1的数量,4),
    # boxes2:(boxes2的数量,4),
    # areas1:(boxes1的数量,),
    # areas2:(boxes2的数量,)
    areas1 = box_area(boxes1)
    areas2 = box_area(boxes2)
   

得到锚框与真实边框面积

2.获得交集左上和右下坐标
# inter_upperlefts,inter_lowerrights,inters的形状:
    # (boxes1的数量,boxes2的数量,2)
    inter_upperlefts = torch.max(boxes1[:, None, :2], boxes2[:, :2])
    inter_lowerrights = torch.min(boxes1[:, None, 2:], boxes2[:, 2:])
    inters = (inter_lowerrights - inter_upperlefts).clamp(min=0)

获得交集左上和右下坐标

3.计算交集并集面积

交集,并集指的是锚框和真实框之间

  # inter_areas 和 union_areas的形状:(boxes1的数量,boxes2的数量)
    inter_areas = inters[:, :, 0] * inters[:, :, 1]
    union_areas = areas1[:, None] + areas2 - inter_areas

计算交集并集面积1
计算交集并集面积2

4.返回IOU矩阵
 return inter_areas / union_areas

返回IOU矩阵

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这行代码涉及到目标检测中的 Intersection over Union (IoU) 计算。具体来说,它计算了一个框(boxes[i,:])与多个其他框(boxes[B[1:],:])之间的 IoU 值。 其中,boxes 是一个大小为 `(N, 4)` 的张量,表示 N 个框,每个框由左上角和右下角坐标表示。`i` 是一个整数,表示当前需要计算 IoU 值的框的索引。`B` 是一个大小为 `M` 的数组,表示需要与当前框计算 IoU 值的其他框的索引。 具体来说,该行代码做了以下几个操作: 1. 将当前框(`boxes[i,:]`)和其他框(`boxes[B[1:],:]`)分别重塑为大小为 `(1, 4)` 和 `(M-1, 4)` 的张量,并调用 `d2l.box_iou` 函数计算它们之间的 IoU 值。这个函数的具体实现可以参考以下代码: ``` def box_iou(boxes1, boxes2): box_area = lambda boxes: ((boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1])) area1 = box_area(boxes1) area2 = box_area(boxes2) inter_upperlefts = np.maximum(boxes1[:, None, :2], boxes2[:, :2]) inter_lowerrights = np.minimum(boxes1[:, None, 2:], boxes2[:, 2:]) inter_wh = np.maximum(inter_lowerrights - inter_upperlefts, 0) intersection = inter_wh[:, :, 0] * inter_wh[:, :, 1] return intersection / (area1[:, None] + area2 - intersection) ``` 2. 将上一步计算出来的 IoU 值重塑为大小为 `M-1` 的一维数组(通过 `reshape(-1)` 实现),并将其返回。 需要注意的是,这个代码片段只计算了一个框与其他框之间的 IoU 值,如果需要计算多个框之间的 IoU 值,需要对其进行循环或者矩阵化处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值