要计算尺度为32,16,8的anchors,需要先确定每个尺度下的网格大小。假设输入图像大小为224x224,那么在尺度为32时,网格大小为7x7,尺度为16时,网格大小为14x14,尺度为8时,网格大小为28x28。然后根据每个尺度下的网格大小,确定每个尺度下的anchors数量和尺寸。

以尺度为32为例,假设要生成3个不同尺寸的anchors,可以采用如下公式计算:

anchor_sizes = [0.1, 0.2, 0.5] # anchors的尺寸比例 anchor_ratios = [1, 2, 0.5] # anchors的长宽比例

anchors = [] for size in anchor_sizes: for ratio in anchor_ratios: w = size * math.sqrt(ratio) h = size / math.sqrt(ratio) anchors.append([w, h])

num_anchors = len(anchors) # anchors数量 print('num_anchors:', num_anchors) print('anchors:', anchors)

在尺度为32下,上述代码生成了3个不同尺寸、长宽比例为1:1、1:2、2:1的anchors,分别为[0.1, 0.1]、[0.1414, 0.0707]、[0.0707, 0.1414]。这里的尺寸是相对于整个图像的比例,需要根据网格大小进行缩放得到每个anchor在网格坐标系下的尺寸。

对于每个网格,需要生成num_anchors个anchors,每个anchor的中心点坐标为该网格的中心点坐标。以尺度为32时,假设共有7x7个网格,可以采用如下代码生成所有anchors:

grid_size = 7 # 网格大小 stride = 32 # 步长

anchors = np.array(anchors) scales = np.array([stride * grid_size, stride * grid_size]) offsets = np.transpose(np.reshape(np.array([np.arange(grid_size)] * grid_size * num_anchors), (num_anchors, grid_size, grid_size)), (1, 2, 0)) offsets = np.expand_dims(offsets, axis=0) offsets = np.tile(offsets, (2, 1, 1, 1)) anchors = np.expand_dims(anchors, axis=1) anchors = np.expand_dims(anchors, axis=1) anchors = np.tile(anchors, (1, grid_size, grid_size, 1)) anchors = anchors + offsets anchors = np.reshape(anchors, (grid_size * grid_size * num_anchors, 4)) anchors[:, 0::2] /= scales[1] anchors[:, 1::2] /= scales[0]

print('anchors shape:', anchors.shape) print('anchors:', anchors)

上述代码首先根据网格大小和步长,计算出所有anchors在图像坐标系下的尺寸。然后生成所有anchors的中心点坐标,最后将所有anchors的中心点坐标和尺寸按照网格坐标系的顺序排列,得到最终的anchors。在尺度为16和8时,可以采用类似的方法生成anchors。

用yolov6人脸检测分别率是224 如何计算尺度分别为32168的anchors

原文地址: https://www.cveoy.top/t/topic/btwO 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录