0

如何实现一个单次检测器,每个特征图单元只有一个锚框?我使用了 ssd mobilenet coco 2018 v1 并且我已经更改了配置文件中的锚生成器部分,即 ssd 锚生成器中的 num layers = 1。这样会好吗??

https://github.com/tensorflow/models/blob/master/research/object_detection/samples/configs/ssd_mobilenet_v1_coco.config

anchor_generator { ssd_anchor_generator { num_layers: 6 min_scale: 0.2 max_scale: 0.95 aspect_ratios: 1.0 aspect_ratios: 2.0 aspect_ratios: 0.5 aspect_ratios: 3.0 aspect_ratios: 0.3333

4

1 回答 1

0

在这种情况下,更改num_layers对您没有帮助。
SSD 有几个检测分支 - 每个分支都源自不同的特征图分辨率 例如 - 对于在 TF OD API 中找到的 mobilenet_v1_ssd,有 6 个分支。
分支 0 - 19x19
分支 1 - 10x10
分支 2 - 5x5
分支 3 - 3x3
分支 4 - 2x2
分支 5 - 1x1

所以参数 - num_layers 实际上会改变分支的数量,但不会改变每个像素的锚点数量。

如果您希望每个像素只有一个锚框,则必须更改几件事(读到最后:)):

  1. 纵横比- 通过更改纵横比的数量,您可以更改每层的锚点数量。所以:
    anchor_generator {
      ssd_anchor_generator {
        num_layers: 6
        min_scale: 0.2
        max_scale: 0.95
        aspect_ratios: 1.0
        aspect_ratios: 2.0
        aspect_ratios: 0.5
        aspect_ratios: 3.0
        aspect_ratios: 0.3333
      }
    }

因此,例如,通过删除 1.0,您将几乎只剩下一个锚。2. 为什么差不多?SSD(https://arxiv.org/abs/1512.02325),见论文,添加另一个锚框,其比例为当前分支尺度到下一个分支尺度之间的几何平均值。因此,对于分支 1-5,实际上每个像素有 2 个锚点。为了禁用它,您应该将名为interpolated_scale_aspect_ratio的参数更改为 0。 您可以通过将此参数添加到配置文件来实现(参见 ssd 锚的 protobuf - https://github.com/tensorflow/models/blob/ 2ad3e213838f71e92af198d917ac5574c9d60294/research/object_detection/protos/ssd_anchor_generator.proto)所以在anchor_generator下添加:
在此处输入图像描述

interpolated_scale_aspect_ratio: 0
  1. 如果您遵循 1 和 2,您将看到每个分支每个像素有 1 个锚点,但分支 1-5。但是由于某种原因,第一个分支将有 3 个锚点......这是因为第一个分支默认获得三个锚点。您可以使用以下参数禁用它:
    在此处输入图像描述
reduce_boxes_in_lowest_layer: false
于 2021-05-24T09:20:21.023 回答