在这种情况下,更改num_layers对您没有帮助。
SSD 有几个检测分支 - 每个分支都源自不同的特征图分辨率 例如 - 对于在 TF OD API 中找到的 mobilenet_v1_ssd,有 6 个分支。
分支 0 - 19x19
分支 1 - 10x10
分支 2 - 5x5
分支 3 - 3x3
分支 4 - 2x2
分支 5 - 1x1
所以参数 - num_layers 实际上会改变分支的数量,但不会改变每个像素的锚点数量。
如果您希望每个像素只有一个锚框,则必须更改几件事(读到最后:)):
- 纵横比- 通过更改纵横比的数量,您可以更改每层的锚点数量。所以:
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 和 2,您将看到每个分支每个像素有 1 个锚点,但分支 1-5。但是由于某种原因,第一个分支将有 3 个锚点......这是因为第一个分支默认获得三个锚点。您可以使用以下参数禁用它:
reduce_boxes_in_lowest_layer: false