gpt4 book ai didi

python - Tensorflow 检测 API 中的 SSD anchor

转载 作者:行者123 更新时间:2023-12-04 22:39:41 27 4
gpt4 key购买 nike

我想训练一个 SSD N×N 图像的自定义数据集上的检测器。所以我挖了Tensorflow object detection API并在基于MobileNet v2的COCO上找到了SSD300x300的预训练模型。

查看用于训练的配置文件时:anchor_generator 字段如下所示:(遵循论文)

anchor_generator {
ssd_anchor_generator {
num_layers: 6
min_scale: 0.2
max_scale: 0.9
aspect_ratios: 1.0
aspect_ratios: 2.0
aspect_ratios: 0.5
aspect_ratios: 3.0
aspect_ratios: 0.33
}
}

当看 SSD anchor generator proto因此,我是否正确假设: base_anchor_height=base_anchor_width=1 ?

如果是,我假设得到的 anchor 是通过阅读 Multiple Grid anchors generator 获得的。 (如果图像是 300x300 正方形)是:
尺寸范围从 0.2*300=60*60 像素到 0.9*300=270*270 像素(具有不同的纵横比)?

因此,如果想通过固定字段来训练 NxN 图像:
fixed_shape_resizer {
height: N
width: N
}

他会使用相同的配置文件 anchor ,范围从 (0.2*N,0.2*N) 像素到 (0.9*N,0.9*N) 像素(具有不同的纵横比)?

我做了很多假设,因为代码很难掌握,而且似乎还没有文档。我对么 ?有没有一种简单的方法可以在不训练模型的情况下可视化使用的 anchor ?

最佳答案

这里有一些函数可用于在不训练模型的情况下生成和可视化 anchor 框坐标。我们在这里所做的只是调用在训练/推理期间在图中使用的相关操作。

首先,我们需要知道构成给定尺寸输入图像的目标检测层的特征图的分辨率(形状)是多少。

import tensorflow as tf 
from object_detection.anchor_generators.multiple_grid_anchor_generator import create_ssd_anchors
from object_detection.models.ssd_mobilenet_v2_feature_extractor_test import SsdMobilenetV2FeatureExtractorTest

def get_feature_map_shapes(image_height, image_width):
"""
:param image_height: height in pixels
:param image_width: width in pixels
:returns: list of tuples containing feature map resolutions
"""
feature_extractor = SsdMobilenetV2FeatureExtractorTest()._create_feature_extractor(
depth_multiplier=1,
pad_to_multiple=1,
)
image_batch_tensor = tf.zeros([1, image_height, image_width, 1])

return [tuple(feature_map.get_shape().as_list()[1:3])
for feature_map in feature_extractor.extract_features(image_batch_tensor)]

这将返回一个特征图形状列表,例如 [(19,19), (10,10), (5,5), (3,3), (2,2), (1,1)]您可以将其传递给第二个函数,该函数返回 anchor 框的坐标。
def get_feature_map_anchor_boxes(feature_map_shape_list, **anchor_kwargs):
"""
:param feature_map_shape_list: list of tuples containing feature map resolutions
:returns: dict with feature map shape tuple as key and list of [ymin, xmin, ymax, xmax] box co-ordinates
"""
anchor_generator = create_ssd_anchors(**anchor_kwargs)

anchor_box_lists = anchor_generator.generate(feature_map_shape_list)

feature_map_boxes = {}

with tf.Session() as sess:
for shape, box_list in zip(feature_map_shape_list, anchor_box_lists):
feature_map_boxes[shape] = sess.run(box_list.data['boxes'])

return feature_map_boxes

在您的示例中,您可以这样称呼它:
boxes = get_feature_map_boxes(
min_scale=0.2,
max_scale=0.9,
feature_map_shape_list=get_feature_map_shapes(300, 300)
)

您不需要指定纵横比,因为配置中的纵横比与 create_ssd_anchors 的默认值相同。 .

最后,我们在反射(reflect)给定层分辨率的网格上绘制 anchor 框。请注意,模型中的 anchor 框和预测框的坐标在 0 和 1 之间归一化。
def draw_boxes(boxes, figsize, nrows, ncols, grid=(0,0)):

fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=figsize)

for ax, box in zip(axes.flat, boxes):
ymin, xmin, ymax, xmax = box
ax.add_patch(patches.Rectangle((xmin, ymin), xmax-xmin, ymax-ymin,
fill=False, edgecolor='red', lw=2))

# add gridlines to represent feature map cells
ax.set_xticks(np.linspace(0, 1, grid[0] + 1), minor=True)
ax.set_yticks(np.linspace(0, 1, grid[1] + 1), minor=True)
ax.grid(True, which='minor', axis='both')

fig.tight_layout()

return fig

如果我们以具有 3x3 特征图的第四层为例
draw_boxes(feature_map_boxes[(3,3)], figsize=(12,16), nrows=9, ncols=6, grid=(3,3))
Anchor boxes for 3x3 feature map

在上图中,每行代表 3x3 特征图中的一个不同单元格,而每列代表一个特定的纵横比。

您最初的假设是正确的,例如,最高层(具有最低分辨率特征图)中宽高比为 1.0 的 anchor 框的高度/宽度将等于输入图像大小的 0.9,而最低层中的 anchor 框将具有高度/width 等于输入图像大小的 0.2。中间层的 anchor 大小在这些限制之间线性插值。

然而,关于 TensorFlow anchor 生成的一些微妙之处值得注意:
  • 请注意,在图像示例中,每个网格单元有 6 个 anchor ,但我们只指定了 5 个纵横比。这是因为为每一层添加了一个额外的 anchor ,其大小介于当前层的 anchor 大小和下一层的 anchor 大小之间。这可以通过使用 interpolated_scale_aspect_ratio 修改(或删除)上面的anchor_kwargs 中的参数,或者在您的配置中。
  • 默认情况下,在目标检测特征图的最低层(具有最高分辨率)中,预先指定的纵横比列表将被忽略,并仅替换为 3 个纵横比。这可以用 reduce_boxes_in_lowest_layer 覆盖 bool 参数。
  • 正如您正确指出的那样,默认情况下 base_anchor_height = base_anchor_width = 1 .但是,如果您的输入图像不是方形的并且在预处理期间被重新整形,那么具有方面 1.0 的“方形” anchor 实际上不会针对原始图像中方形的 anchor 定对象进行优化(尽管它当然可以学习预测这些训练期间的形状)。

  • 可以找到完整的要点 here .

    关于python - Tensorflow 检测 API 中的 SSD anchor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51742805/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com