Tensorflow 检测 API 中的 SSD 锚点

2024-01-11

我想训练一个SSD https://arxiv.org/pdf/1512.02325.pdf检测器在 N × N 图像的自定义数据集上。所以我深入研究Tensorflow 对象检测 API https://github.com/tensorflow/models/tree/master/research/object_detection并在COCO上基于MobileNet v2找到了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锚点生成器原型 https://github.com/tensorflow/models/blob/master/research/object_detection/protos/ssd_anchor_generator.proto因此我的假设是否正确:base_anchor_height=base_anchor_width=1 ?

如果是的话,我假设人们通过阅读获得的结果锚点多个网格锚点生成器 https://github.com/tensorflow/models/blob/master/research/object_detection/anchor_generators/multiple_grid_anchor_generator.py(如果图像是 300x300 的正方形)是: 大小范围为 0.2300=6060 像素至 0.9300=270270 像素(具有不同的长宽比) ?

因此,如果想通过固定字段来训练 NxN 图像:

fixed_shape_resizer {
  height: N
  width: N
}

他将使用相同的配置文件锚点,范围从 (0.2N,0.2N) 像素到 (0.9N,0.9N) 像素(具有不同的长宽比)?

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


以下是一些可用于生成和可视化锚框坐标而无需训练模型的函数。我们在这里所做的就是调用训练/推理期间图中使用的相关操作。

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

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)]您可以将其传递给第二个函数,该函数返回锚框的坐标。

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.

最后,我们将锚框绘制在反映给定层分辨率的网格上。请注意,模型中的锚框和预测框的坐标在 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))

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

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

然而,关于 TensorFlow 锚点生成,有一些微妙之处值得注意:

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

完整的要点可以找到here https://gist.github.com/david-macleod/60cb2b00616562b9b613bea618f9956b.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tensorflow 检测 API 中的 SSD 锚点 的相关文章

随机推荐

  • 如何在迁移触发器中设置 Cognito 组

    我目前正在使用 Cognito 触发器 用户迁移 构建从 AWS 用户池到另一个用户池的迁移解决方案 我想在迁移期间设置一个组 但我无法执行此操作 因为在整个上下文完成之前尚未创建用户 我该如何解决这个问题 我不想创建 PostAuth l
  • 如何在 ASP.NET Core 2.0 中实现 machineKey

    在 ASP NET 非核心 中 我通常会在 web config 中添加一个 machineKey 以便我可以在本地计算机而不是服务器上执行一些功能 以便数据库 回调操作将使用相同的密钥 例如
  • 查找仅在 R 中的一行中出现的变量

    使用 BASE R 我想知道如何回答以下问题 有没有什么价值X or Y仅发生在一行中而不发生在其他行中 如果是 请出示我的期望的输出 below f lt data frame id c rep AA 4 rep BB 2 rep CC
  • (Symfony 4) 如何从 PHP 代码中访问 Liip Imagine 包?

    我希望能够上传一个文件 并从中创建 3 个缩略图 并将所有内容存储在 S3 服务器上 我的 liip LiipImagineBundle 设置如下 liip 想象 configure resolvers resolvers setup th
  • CMake 中的 Makefile 等效项

    我刚刚开始使用CMake 已经不到一周了 我已经编写了一个 Makefile 并且正在尝试在 CMake 中编写其等效项 我不知道应该在 CMake 中为给定 Makefile 中的每个语句使用哪些命令 我该如何开始 有什么地方可以找到这方
  • Django 结合 __unaccent 和 __search 查找

    所以我正在尝试使用 unaccent and search在同一模型过滤器中 但这样做时收到错误 我正在尝试使用术语 Pokemon 与术语 Pok mon 匹配来创建一个过滤器 注意 Game objects filter title u
  • JPA 2.1 中的 @ConstructorResult 映射无法与 Hibernate 4.3.5.Final 一起正常工作

    我尝试将本机查询映射到非实体类 我有以下实体 Entity Table name Groups SqlResultSetMapping name groupList classes ConstructorResult targetClass
  • 使用节点实现重新填充堆栈

    在我把它全部取下来打印出来后 我很难重新填充堆栈 我正在使用节点实现 所以我认为这个事实让我感到困惑 任何建议将不胜感激 谢谢 这是我原来的 stack print Function to print Gumball info field
  • 使用隐式/显式转换运算符是否违反单一职责模式而支持 DRY?

    我需要在这两个类之间进行转换 并且想要保持 DRY 但不违反单一职责模式 public class Person public string Name get set public int ID get set public class P
  • 模块内部的参考控制器

    我在模块内定义了一个控制器 angular module myModule controller MyCtrl function scope scope property myproperty 部分内容包含在主 html 中 如下所示 di
  • 詹金斯第一次访问时非常慢

    清晨第一次访问詹金斯非常慢 如果我们重新启动 Jenkins 服务器 也会发生这种情况 因此第一个访问 jenkins 的开发人员有时需要等待长达 3 分钟 我们认为这是构建负载的问题 因此 我们将所有构建工作转移给詹金斯奴隶 但问题并没有
  • 与多个项目共享 nlog 配置以及正确的线程安全方式来全部写入同一日志文件?

    我的程序由一个 EXE 和 6 个 DLL 组成 当然每个人都引用每个人 我目前有一个粗略的静态日志记录类 Logger 它位于它自己的 DLL Logger dll 中 我将其添加为每个的引用我的项目并使用 但我没有重新发明轮子 而是希望
  • 从 Angular 表达式访问窗口

    根据开发者指南 http docs angularjs org guide expression我应该能够从 Angular 表达式内部访问浏览器窗口 window 与 JavaScript 不同 JavaScript 的名称默认为全局窗口
  • 使用 PDO 准备和绑定语句的条件查询

    我正在将所有查询从 mysql 转换为 PDO 在这个过程中我发现了一个条件查询 如下所示 if isset parameters searchTerm where And title LIKE parameters searchTerm
  • 如何以编程方式从开始到结束缓慢滚动 UIScrollView

    我有一个水平 UIScrollview 显示大约 10 张图像 我知道我们必须使用scrollRectToVisible 方法以编程方式移动滚动视图 但我正在寻找的是从滚动视图的开始到结束缓慢滚动滚动视图 1 秒内 5 个像素 我看过一些页
  • 将数组定义为类的属性时出现语法错误

    public aSettings array BindHost gt 127 0 0 1 Port gt 9123 MaxFileSize gt 5 1024 1024 unexpected here UploadedURL gt http
  • System.out.println(object) 的输出

    我想知道当我执行以下操作时 输出到底是什么 class Data int a 5 class Main public static void main String args data dObj new data System out pr
  • VS2010 中的 JavaScript Intellisense 速度极慢且占用内存

    我在 VS2010 中的 Intellisense 中遇到两个问题 我们的项目非常大 它由数百个 js 文件组成 其中包含数十万行代码 使用 VS2010 只需 5 10 分钟后 内存使用量就可以轻松攀升到 1GB 以上 这会导致速度显着减
  • HAProxy 关闭长期存在的 TCP 连接,忽略 TCP keepalive

    我已经配置了 HAProxy 1 5 4 但我也尝试了 1 5 14 以在 TCP 模式下平衡两台在 5672 端口上公开 AMQP 协议 WSO2 消息代理 的服务器 客户端通过 HAProxy 创建并使用与 AMQP 服务器的永久连接
  • Tensorflow 检测 API 中的 SSD 锚点

    我想训练一个SSD https arxiv org pdf 1512 02325 pdf检测器在 N N 图像的自定义数据集上 所以我深入研究Tensorflow 对象检测 API https github com tensorflow m