使用'keep_aspect_ratio_resizer'的Tensorflow对象检测API SSD模型

Ult*_*let 3 object-detection tensorflow object-detection-api

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

image_resizer {
  keep_aspect_ratio_resizer {
    min_dimension: 100
    max_dimension: 600
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,为了提高性能,我想使用ssd_inception_v2或ssd_inception_v2模型进行训练。的示例配置的用途固定形状调整大小如下,

image_resizer {
  fixed_shape_resizer {
    height: 300
    width: 300
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

gde*_*lab 6

SSD和速度更快的R-CNN彼此之间的工作方式大不相同,因此,即使F-RCNN没有这种限制,对于SSD,您也需要始终具有相同大小的输入图像(实际上,您需要功能图始终具有相同的大小) ,但最好的方法是始终使用相同的输入大小)。这是因为它以完全连接的图层结束,您需要了解其要素地图的大小。而对于F-RCNN,只有卷积(在任何输入大小上都有效)到ROI合并层(它不需要固定图像大小)。

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

  • 只需让TF (w, h)使用调整大小器来调整输入的形状,而无需进行预处理。问题是图像会变形,这可能是(或不是,取决于您的数据和要检测的对象)问题。

  • 将所有图像裁切为具有与相同的宽高比的子图像(w, h)。问题:您将丢失部分图像,或者必须对每个图像进行更多推断。

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

  • 完全连接的层基本上是要素与权重矩阵之间的矩阵乘法。该权重矩阵的形状必须为((n_features_input,n_outputs)),因此在构建网络时必须知道n_features_input`。而卷积将输入特征乘以矩阵中每个位置的相同(较小)矩阵,因此您不需要知道输入大小,但是输出大小将取决于它。它的工作原理有所不同,如果您想了解更多有关该知识的知识,则应该参加课程 (2认同)
  • 无论如何,由于 SSD 不如 F-RCNN,性能会下降,也许这不是导致问题的重塑 (2认同)