Tensorflow image_dataset_from_directory для входного набора данных и выходного набора данных

#python #tensorflow #image-processing #keras #autoencoder

#python #tensorflow #обработка изображений #keras #автоэнкодер

Вопрос:

Я пытаюсь изучить автоматическое кодирование изображений, но я не могу использовать входные и выходные изображения для обучения модели

пример: папка входных изображений: «… / Pictures /Input»
папка выходных изображений: «… / Pictures /Output»

 #get input images from data_dir_input
ds_input = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir_input,
    seed=123,
    image_size=(img_height, img_width),
    label_mode=None,
    batch_size=batch_size)

#get output images from data_dir_output
ds_output = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir_output,
    seed=123,
    image_size=(img_height, img_width),
    label_mode=None,
    batch_size=batch_size)

# --------- model init etc --------------
# ...


model.fit(x=ds_input, y=ds_output, batch_size=32, epochs=50)

  

Но я получаю сообщение об ошибке, в котором говорится следующее:

`y` argument is not supported when using dataset as input

Как я могу использовать свои собственные входные изображения и выходные изображения при обучении модели?

Ответ №1:

Вы могли бы использовать tf.data.Dataset для большей гибкости. Из того, что я прочитал, image_dataset_from_directory не поддерживает никаких пользовательских меток, кроме целого числа.

Попробуйте это:

 import os
import tensorflow as tf
os.chdir(r'c:/users/user/Pictures')
from glob2 import glob

x_files = glob('inputs/*.jpg')
y_files = glob('targets/*.jpg')

files_ds = tf.data.Dataset.from_tensor_slices((x_files, y_files))

def process_img(file_path):
    img = tf.io.read_file(file_path)
    img = tf.image.decode_jpeg(img, channels=3)
    img = tf.image.convert_image_dtype(img, tf.float32)
    img = tf.image.resize(img, size=(28, 28))
    return img

files_ds = files_ds.map(lambda x, y: (process_img(x), process_img(y))).batch(1)

original, target = next(iter(files_ds))
  
 <tf.Tensor: shape=(1, 28, 28, 3), dtype=float32, numpy=
array([[[[0.357423  , 0.3325731 , 0.20412168],
         [0.36274514, 0.21940777, 0.17623049],
         [0.34821934, 0.13921566, 0.06858743],
         ...,
         [0.25486213, 0.27446997, 0.2520612 ],
         [0.04925931, 0.26666668, 0.07619007],
         [0.48167226, 0.5287311 , 0.520888  ]]]
  

Тогда вам не нужно будет передавать y в fit() вызов. Вы сможете использовать его как таковой:

 model.fit(ds, epochs=5)
  

Комментарии:

1. Спасибо за ответ, но мои входные и выходные каталоги разные, поэтому я не могу передавать одинаковые изображения для обоих

2. Хорошо, я отредактировал свой ответ с учетом этого ограничения. Тогда вам просто нужно получить список совпадающих файлов для x и y. Просто замените os.listdir() списком файлов, который имеет смысл для вашей задачи. Убедитесь, что он правильно упорядочен с соответствующим y .

3. Когда я использую новый блок кода, я получаю эту ошибку OP_REQUIRES failed at whole_file_read_ops.cc:116 : Not found: NewRandomAccessFile failed to Create/Open: 000128_17.png : The system cannot find the file specified (кстати, я изменил decode_jpeg на decode_png)

4. Вероятно, это потому, что у '000128_17.png' нет имени папки. Вместо этого я привел вам пример с glob2.glob , который позаботится об этом

5. Это сработало, спасибо, могу ли я увеличить этот набор данных, например, изменить масштаб, повернуть и т.д.? image_dataset_from_directory было несколько применений для увеличения, но мне также интересен этот метод