Est-il possible de Recadrer/Redimensionner les images par lot ?
Je suis en utilisant Tensorflow dataset API comme ci-dessous:
dataset = dataset.shuffle().repeat().batch(batch_size, drop_remainder=True)
Je veux, dans le lot de toutes les images doivent avoir la même taille. Cependant à travers les lots, il peut avoir des tailles différentes.
Par exemple, le 1er lot a toutes les images de la forme (batch_size, 300, 300, 3). Prochain lot peut avoir des images de la forme (batch_size, 224, 224, 3). Un lot peut avoir des images de la forme (batch_size, 400, 400, 3).
Fondamentalement, je veux avoir dymanically en forme de lots, cependant toutes les images dans le lot statique des formes.
Si nous ne faisons que suivre:
dataset = dataset.shuffle().repeat().batch(batch_size, drop_remainder=True).map(lambda x, y: map_fn(x, y))
Le ci-dessus .map() s'applique à chaque lot séparément ou plus de l'ensemble du jeu de données ?
Si ci-dessus .map() ne s'applique pas à chaque lot séparément, comment pouvons-nous faire cela ? Pouvons-nous définir le tout itérateur après dataset.lot () s'appliquent de la tf.image.crop_and_resize() sur chaque image par lot, et ensuite utiliser un jeu de données.concatener() pour combiner tous transformés lots ?
Je suis de la création du jeu de données comme ci-dessous:
# Dataset creation (read image data from files of COCO dataset)
dataset = tf.data.Dataset.list_files(self._file_pattern, shuffle=False)
dataset = dataset.shard(dataset_num_shards, dataset_shard_index)
dataset = dataset.shuffle(tf.cast(256 / dataset_num_shards, tf.int64))
dataset = dataset.interleave(map_func=tf.data.TFRecordDataset(filename).prefetch(1), cycle_length=32, block_length=1, num_parallel_calls=tf.data.experimental.AUTOTUNE)
dataset = dataset.map(tf_example_decoder.TfExampleDecoder().decode, num_parallel_calls=64)
dataset = dataset.shuffle(64).repeat()
# Parse each image for preprocessing
dataset = dataset.map(lambda data, _: _parse_example(data), num_parallel_calls=64)
dataset = dataset.batch(batch_size=batch_size, drop_remainder=True)
# Below code suggested by you to resize images to fixed shape in each batch
def resize_data(images, labels):
tf.print('Original shape -->', tf.shape(images))
SIZE = (300, 300)
return tf.image.resize(images, SIZE), labels
dataset = dataset.map(resize_data)
dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)
tf.estimator.Estimator(...).train(
input_fn=dataset,
steps=steps,
hooks=train_hooks)
INVALID_ARGUMENT: Cannot add tensor to the batch: number of elements does not match. Shapes are: [tensor]: [640,426,3], [batch]: [480,640,3]
Même si j'ai donné la TAILLE de l' = (300, 300) en tf.image.redimensionner des images, TAILLE), des lots de TAILLE a = (480, 640). Et comme l'image suivante a différente TAILLE = (640, 426), il n'a pas l'ajouter au lot. Cela signifie que d'une certaine manière, il n'est pas en mesure d'appliquer .map() la fonction de chaque lot. Toute aide/idée ?