我有大尺寸的图像(6000x4000)。我想训练FasterRCNN来检测相当小的物体(在150个像素之间)。因此,出于记忆目的,我将图像裁剪为1000x1000。训练还可以。当我在1000x1000上测试模型时,结果非常好。当我在6000x4000的图像上测试模型时,结果非常糟糕......
我想这是区域提案步骤,但我不知道我做错了什么(keep_aspect_ratio_resizer max_dimension修复为12000)......
感谢您的帮助!
答案 0 :(得分:2)
您需要继续训练图像和图像,以便在大致相同的维度上进行测试。如果您使用随机调整大小作为数据扩充,则可以大致改变测试图像。
处理此问题的最佳方法是将大图像裁剪为与训练中使用的相同维度的图像,然后对作物使用非最大抑制来合并预测。
这样,如果要检测的最小物体大小为50px,则可以获得大小约为500px的训练图像。
答案 1 :(得分:1)
在我看来,您正在训练的图像具有与您正在测试的不同的宽高比(正方形与非正方形) - 这可能导致质量显着下降。
虽然说实话,我有点惊讶,结果可能真的坏,如果你只是在视觉上评估,也许你还必须调低可视化的分数阈值。 / p>
答案 2 :(得分:0)
我想知道你的min_dimension在你的情况下应该大于4000,否则图像将缩小。
object_detection->核 - > preprocessor.py
def _compute_new_dynamic_size(image, min_dimension, max_dimension):
"""Compute new dynamic shape for resize_to_range method."""
image_shape = tf.shape(image)
orig_height = tf.to_float(image_shape[0])
orig_width = tf.to_float(image_shape[1])
orig_min_dim = tf.minimum(orig_height, orig_width)
# Calculates the larger of the possible sizes
min_dimension = tf.constant(min_dimension, dtype=tf.float32)
large_scale_factor = min_dimension / orig_min_dim
# Scaling orig_(height|width) by large_scale_factor will make the smaller
# dimension equal to min_dimension, save for floating point rounding errors.
# For reasonably-sized images, taking the nearest integer will reliably
# eliminate this error.
large_height = tf.to_int32(tf.round(orig_height * large_scale_factor))
large_width = tf.to_int32(tf.round(orig_width * large_scale_factor))
large_size = tf.stack([large_height, large_width])
if max_dimension:
# Calculates the smaller of the possible sizes, use that if the larger
# is too big.
orig_max_dim = tf.maximum(orig_height, orig_width)
max_dimension = tf.constant(max_dimension, dtype=tf.float32)
small_scale_factor = max_dimension / orig_max_dim
# Scaling orig_(height|width) by small_scale_factor will make the larger
# dimension equal to max_dimension, save for floating point rounding
# errors. For reasonably-sized images, taking the nearest integer will
# reliably eliminate this error.
small_height = tf.to_int32(tf.round(orig_height * small_scale_factor))
small_width = tf.to_int32(tf.round(orig_width * small_scale_factor))
small_size = tf.stack([small_height, small_width])
new_size = tf.cond(
tf.to_float(tf.reduce_max(large_size)) > max_dimension,
lambda: small_size, lambda: large_size)
else:
new_size = large_size
return new_size