rgb_to_grayscale avec tensorflow 2.3, obtenir "les dimensions doivent être égales à l'erreur"

2020-08-01 python tensorflow

Je suis un noob tensorflow, désolé. Je suis ce tutoriel: https://www.tensorflow.org/tutorials/images/segmentation

Je souhaite appliquer un prétraitement aux images de l'ensemble de données, et rgb_to_grayscale échoue avec l'erreur ci-dessous. Mon filtre médian fonctionne, mais pas rbg_to_grayscale.

J'apprécierais vraiment tout conseil que vous pourriez avoir.

@tf.function
def load_image_train(datapoint):
  input_image = tf.image.resize(datapoint['image'], (128, 128))
  input_mask = tf.image.resize(datapoint['segmentation_mask'], (128, 128))  

  print(type(input_image))
  print(input_image.shape)

  input_image = tf.image.rgb_to_grayscale(input_image)
  input_mask = tf.image.rgb_to_grayscale(input_mask)

  input_image = tfa.image.median_filter2d(input_image)
  input_mask = tfa.image.median_filter2d(input_mask)

sortie d'impression:

<class 'tensorflow.python.framework.ops.Tensor'>
(128, 128, 3)

Erreur reçue:

    tutorial.py:36 load_image_train  *
        input_mask = tf.image.rgb_to_grayscale(input_mask)
    /home/dmattie/environments/imgproc/lib/python3.7/site-packages/tensorflow/python/util/dispatch.py:201 wrapper  **
        return target(*args, **kwargs)
    /home/dmattie/environments/imgproc/lib/python3.7/site-packages/tensorflow/python/ops/image_ops_impl.py:2136 rgb_to_grayscale
        gray_float = math_ops.tensordot(flt_image, rgb_weights, [-1, -1])
    /home/dmattie/environments/imgproc/lib/python3.7/site-packages/tensorflow/python/util/dispatch.py:201 wrapper
        return target(*args, **kwargs)
    /home/dmattie/environments/imgproc/lib/python3.7/site-packages/tensorflow/python/ops/math_ops.py:4519 tensordot
        ab_matmul = matmul(a_reshape, b_reshape)
    /home/dmattie/environments/imgproc/lib/python3.7/site-packages/tensorflow/python/util/dispatch.py:201 wrapper
        return target(*args, **kwargs)
    /home/dmattie/environments/imgproc/lib/python3.7/site-packages/tensorflow/python/ops/math_ops.py:3255 matmul
        a, b, transpose_a=transpose_a, transpose_b=transpose_b, name=name)
    /home/dmattie/environments/imgproc/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py:5642 mat_mul
        name=name)
    /home/dmattie/environments/imgproc/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py:744 _apply_op_helper
        attrs=attr_protos, op_def=op_def)
    /home/dmattie/environments/imgproc/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py:593 _create_op_internal
        compute_device)
    /home/dmattie/environments/imgproc/lib/python3.7/site-packages/tensorflow/python/framework/ops.py:3485 _create_op_internal
        op_def=op_def)
    /home/dmattie/environments/imgproc/lib/python3.7/site-packages/tensorflow/python/framework/ops.py:1975 __init__
        control_input_ops, op_def)
    /home/dmattie/environments/imgproc/lib/python3.7/site-packages/tensorflow/python/framework/ops.py:1815 _create_c_op
        raise ValueError(str(e))

    ValueError: Dimensions must be equal, but are 1 and 3 for '{{node rgb_to_grayscale_1/Tensordot/MatMul}} = MatMul[T=DT_FLOAT, transpose_a=false, transpose_b=false](rgb_to_grayscale_1/Tensordot/Reshape, rgb_to_grayscale_1/Tensordot/Reshape_1)' with input shapes: [16384,1], [3,1].

Answers

La forme de input_mask est (128,128,1) sorte que lorsqu'il est aplati, il n'y a qu'une seule valeur dans le dernier axe. Cela le rend incompatible avec tf.image.rgb_to_grayscale qui nécessite trois valeurs RVB dans le dernier axe. Vous ne devriez pas interpréter le masque comme une image, mais si vous voulez vraiment pouvoir appliquer l'échelle de gris aux valeurs du masque (je ne vois aucune raison de le faire), vous pouvez le diffuser:

input_mask = tf.broadcast_to(input_mask, (128,128,3))

Related