关于目标检测锚框绘制代码的疑惑

这是目标检测基础的一段代码

# 绘制锚框
def draw_anchor_box(center, length, scales, ratios, img_height, img_width):
    """center为中心,产生一系列锚框
    其中length指定了一个基准的长度
    scales是包含多种尺寸比例的list
    ratios是包含多种长宽比的list
    img_height和img_width是图片的尺寸,生成的锚框范围不能超出图片尺寸之外
    """
    bboxes = []
    for scale in scales:
        for ratio in ratios:
            h = length*scale*math.sqrt(ratio)
            w = length*scale/math.sqrt(ratio) 
            x1 = max(center[0] - w/2., 0.)
            y1 = max(center[1] - h/2., 0.)
            x2 = min(center[0] + w/2. - 1.0, img_width - 1.0)
            y2 = min(center[1] + h/2. - 1.0, img_height - 1.0)
            print(center[0], center[1], w, h)
            bboxes.append([x1, y1, x2, y2])
    for bbox in bboxes:
        draw_rectangle(currentAxis, bbox, edgecolor = 'b')

注释里写ratio是长宽比,对锚框而言就是宽高比即w/h。那产生了两个问题,①为什么比例要先用sqrt(ration)进行开方再计算比例 ②length是长度w的话,那么lengthscalemath.sqrt(ratio)不就相当于w*(w/h)了吗?为什么结果是h?

我习惯写成h/w,你理解成w/h也一样的,与下面的同理:
1,假设length * scale=100,假设你的ratio=0.5即你原意是h/w=0.5=1/2;
那么按第13行,h=100 * 根号0.5;
按第14行,w=100 / 根号0.5=100 * (1/根号0.5);
h/w=根号0.5 / (1/根号0.5)= (根号0.5)的平方=0.5,这与你的ratio一致。所以正确。
如果按你说的不要根号,那就是0.25了,与你最初的ratio不一致。
2,length并不是w,也不是h。它不是解释了吗,只是一个基准。 可以将其理想化为一根铁丝,而一根给定的铁丝你是可以将其弯成不同的矩形的。举个栗子,length * scale=200(这个scale就是调节基准的不用太在意),假设ratio1=1/16,那么h=50,w=800;如果ratio2=1/4,那么h=100,w=400;这两组不就很像去弯铁丝吗,只是它是弯出一样面积的矩形,长宽随意跟着你设的ratio去调节。