Как реализовать и понять предварительную обработку и увеличение данных с помощью tenorflow_datasets (tfds)? - PullRequest
0 голосов
/ 22 апреля 2020

Я изучаю сегментацию и увеличение данных на основе этого учебного пособия TF 2.0 , в котором используются Oxford-IIIT Pets .

Для предварительной обработки / увеличения данных они предоставить набор функций в конкретный c конвейер:

# Import dataset
dataset, info = tfds.load('oxford_iiit_pet:3.*.*', with_info=True)

def normalize(input_image, input_mask):
  input_image = tf.cast(input_image, tf.float32) / 255.0
  input_mask -= 1
  return input_image, input_mask

@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))

  if tf.random.uniform(()) > 0.5:
    input_image = tf.image.flip_left_right(input_image)
    input_mask = tf.image.flip_left_right(input_mask)

  input_image, input_mask = normalize(input_image, input_mask)

  return input_image, input_mask

TRAIN_LENGTH = info.splits['train'].num_examples
BATCH_SIZE = 64
BUFFER_SIZE = 1000
STEPS_PER_EPOCH = TRAIN_LENGTH // BATCH_SIZE

train = dataset['train'].map(load_image_train, num_parallel_calls=tf.data.experimental.AUTOTUNE)

train_dataset = train.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE).repeat()
train_dataset = train_dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)

Этот код вызвал у меня несколько сомнений, учитывая синтаксис tf. Чтобы помешать мне просто выполнить ctrl C ctrl V и понять, как работает тензор потока, я хотел бы задать несколько вопросов:

1) В функции normalize можно изменить строку tf.cast(input_image, tf.float32) / 255.0 tf.image.convert_image_dtype(input_image, tf.float32)?

2) В функции normalize можно изменить мои значения segmentation_mask в формате tf.tensor без изменения на numpy? Я хочу работать только с двумя возможными масками (0 и 1), а не с (0, 1 и 2). Используя numpy, я сделал что-то вроде этого:

segmentation_mask_numpy = segmentation_mask.numpy()
segmentation_mask_numpy[(segmentation_mask_numpy == 2) | (segmentation_mask_numpy == 3)] = 0

Это можно сделать без преобразования numpy?

3) В функции load_image_train говорят, что эта функция делать увеличение данных, но как? С моей точки зрения, они меняют исходное изображение с переворотом, учитывая случайное число, и не предоставляют другое изображение в набор данных на основе исходного изображения. Итак, цель функции - изменить изображение, а не добавить в мой набор данных aug_image, сохраняя оригинал? Если я прав, как я могу изменить эту функцию, чтобы получить aug_image и сохранить свое исходное изображение в наборе данных?

4) В других вопросах, таких как Как применить увеличение данных в TensorFlow 2.0 после tfds .load () и TensorFlow 2.0 Keras: Как писать сводки изображений для TensorBoard , они использовали много последовательных вызовов .map() или .map().map().cache().batch().repeat(). Мой вопрос: есть ли такая необходимость? Есть более простой способ сделать это? Я пытался прочитать документацию tf, но безуспешно.

5) Вы порекомендовали работать с ImageDataGenerator от keras, как представлено здесь или этот подход tf лучше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...