YOLOv5中autoanchor.py的def metric(k)的r = wh[:, None] / k[None]的理解

check_anchors()内metric()函数
def check_anchors(dataset, model, thr=4.0, imgsz=640):
    """在train.py中调用,计算BPR确定是否需要改变anchors 需要就调用K-means重新计算anchors
       args: dataset -> 自定义数据集LoadImagesAndLabels返回的数据集
             model -> 初始化的模型
             thr -> 超参数,界定anchor与label匹配程度的阈值,anchor与标签框的比例范围为(1/thr, thr),在此范围内算是满足要求
             imgsz -> 输入图片尺寸,默认640"""
    # Check anchor fit to data, recompute if necessary

    # 打印字符串:autoanchor:Analyzing anchors...
    prefix = colorstr('autoanchor: ')
    print(f'\n{prefix}Analyzing anchors... ', end='')

    # 取出模型最后一层,即Detect层
    m = model.module.model[-1] if hasattr(model, 'module') else model.model[-1]  # Detect()
    # dataset.shapes.max(1, keepdims=True) = 每张图片的较长边
    # shapes: 将数据集图片的最长边缩放到img_size, 较小边相应缩放,得到新的所有数据集图片
    shapes = imgsz * dataset.shapes / dataset.shapes.max(1, keepdims=True)
    # 产生随机数scale [2501, 1]
    scale = np.random.uniform(0.9, 1.1, size=(shapes.shape[0], 1))  # augment scale
    # 将GT的归一化坐标缩放为基于图片大小为shapes * scale的坐标
    wh = torch.tensor(np.concatenate([l[:, 3:5] * s for s, l in zip(shapes * scale, dataset.labels)])).float()  # wh

    def metric(k):  # compute metric
        """根据wh计算anchor是否满足要求,即anchor与标签框的比值要在(1/thr, thr)
           args:k -> 一般传入的是anchors的宽高 [M, 2],也可传入GT的宽高wh: [N, 2],M为anchor的数量,作者M取9,N为GT的数量
           return:bpr -> best possible recall 最多能被召回(通过thr)的gt框数量/所有gt框数量,小于0.98 才会用k-means计算anchor
                   aat -> anchors above threshold 每个target平均有多少个anchors
        """
        r = wh[:, None] / k[None]
        # x:高宽比和宽高比的最小值,无论r大于1,还是小于等于1,最后统一结果都要小于1   [N, M]
        x = torch.min(r, 1. / r).min(2)[0]  # ratio metric
        best = x.max(1)[0]  # best_x
        aat = (x > 1. / thr).float().sum(1).mean()  # anchors above threshold
        bpr = (best > 1. / thr).float().mean()  # best possible recall
        return bpr, aat

None用以添加维度,所有GT的wh[:, None],[N, 2]->[N, 1, 2],所有anchor的wh k[None] [M, 2]->[1, M, 2]

r: GT的宽高与anchor的宽高的比值,即h/h_a, w/w_a,r.shape=(N, M, 2),r中元素有可能大于1,也可能小于等于1

为什么要添加维度:原来的维度是[N, 2]、[M, 2],无法相除,因为不满足广播机制,但是增加维度后就可以满足了广播原则的条件

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Taylor不想被展开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值