9

我正在尝试检测不同形状图像(不是正方形)中的对象。我使用了 faster_rcnn_inception_v2 模型,在那里我可以使用图像调整器来保持图像的纵横比并且输出令人满意。

image_resizer {
  keep_aspect_ratio_resizer {
    min_dimension: 100
    max_dimension: 600
  }
}

现在为了获得更快的性能,我想使用 ssd_inception_v2 或 ssd_inception_v2 模型对其进行训练。示例配置使用固定的形状调整大小,如下所示,

image_resizer {
  fixed_shape_resizer {
    height: 300
    width: 300
  }
}

但问题是由于固定的调整大小,我得到了非常差的检测结果。我尝试将其更改为 keep_aspect_ratio_resizer,如之前在 faster_rcnn_inception_v2 中所述。我收到以下错误,

InvalidArgumentError(参见上文的回溯):ConcatOp:输入的尺寸应匹配:shape[0] = [1,100,500,3] 与 shape 1 = [1,100,439,3]

如何在 SSD 模型中进行配置以调整图像大小并保持纵横比?

4

1 回答 1

15

SSD 和更快的 R-CNN 的工作方式截然不同,因此,即使 F-RCNN 没有这样的限制,对于 SSD,您需要始终具有相同大小的输入图像(实际上您需要特征图始终具有相同大小,但确保它的最佳方法是始终使用相同的输入大小)。这是因为它以完全连接的层结束,您需要知道特征图的大小;而对于 F-RCNN,只有卷积(适用于任何输入大小)直到 ROI 池化层(仅不需要固定的图像大小)。

所以你需要为 SSD 使用一个固定的形状调整器。在最好的情况下,您的数据始终具有相同的width/height比率。在这种情况下,只需使用fixed_shape_resizer具有相同比率的 a 即可。否则,您将不得不(w, h)自己或多或少地任意选择图像大小(某种数据的平均值就可以了)。从那时起,您有多种选择:

  • 只需让 TF 使用调整器重新调整输入(w, h),无需预处理。问题是图像会变形,这可能(或不会,取决于您的数据和您尝试检测的对象)是一个问题。

  • 裁剪所有图像以具有与 具有相同纵横比的子图像(w, h)。问题:您将丢失部分图像或必须对每张图像进行更多推断。

  • 填充所有图像(带有黑色像素或随机白噪声)以获得与(w, h). 您必须在输出边界框上进行一些坐标转换(您将获得的坐标将在增强图像中,您必须通过将它们乘以两个轴上的 old_size/new_size 来转换为初始坐标)。问题是某些对象会比其他对象更小(相对于完整图像大小),这可能是也可能不是问题,具体取决于您的数据和您要检测的内容。

于 2018-01-08T13:36:49.850 回答