我正在尝试检测不同形状图像中的对象(不是正方形)。我使用了faster_rcnn_inception_v2模型,我可以使用图像缩放器来保持图像的宽高比,输出效果令人满意。
image_resizer {
keep_aspect_ratio_resizer {
min_dimension: 100
max_dimension: 600
}
}
现在为了更快的性能,我想使用ssd_inception_v2或ssd_inception_v2模型进行训练。 sample configuration使用固定形状调整大小,如下所示
image_resizer {
fixed_shape_resizer {
height: 300
width: 300
}
}
但问题是由于固定的调整大小,我的检测结果很差。我尝试将它更改为keep_aspect_ratio_resizer,如之前在faster_rcnn_inception_v2中所述。我收到以下错误,
InvalidArgumentError(参见上面的回溯):ConcatOp:Dimensions 输入应匹配:shape [0] = [1,100,500,3] vs. shape 1 = [1,100,439,3]
如何在SSD模型中进行配置以调整保持宽高比的图像大小?
答案 0 :(得分:4)
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转换为初始坐标在两个轴上)。问题是某些对象会缩小(相对于完整图像大小)比其他对象更小,这可能会也可能不会成为问题,具体取决于您的数据以及您尝试检测的内容。