Как подготовить данные изображения, хранящиеся в zip-файле, для обучения в Tensorflow 2? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть большой набор изображений, которые мне нужно подготовить для глубокого обучения с помощью сверточной нейронной сети с использованием Tensorflow 2 / Keras. Пакет из 61 изображений хранится в zip-файле с соответствующими им «масками» (которые являются просто сегментированной версией изображения). Так, например, zip-файл Batch-0-of-163.zip содержит:

'image-1.png', 'mask-1.png', 'image-2.png', 'mask-2.png' ... 'image-61.png', 'mask-61.png'

Есть ли способ создать tenorsflow.data.Dataset в Tensorflow 2, который будетгенерировать данные изображения и маски, когда они нужны графическому процессору для ввода в мой CNN? Я хочу использовать набор данных, чтобы воспользоваться преимуществами предоставляемых функций пакетной / предварительной выборки.

1 Ответ

1 голос
/ 23 октября 2019

Способ решения этой проблемы заключается в следующих шагах:

  • создание объекта набора данных, содержащего путь к каждому файлу
  • отображение функции python на каждый элементНабор данных для распаковки, загрузки данных и удаления разархивированной папки (которую, я полагаю, вам больше не нужно разархивировать)
  • вернитесь к коду тензорного потока для дальнейшей обработки

Вот пример того, как должен выглядеть код:

 from scipy import misc
 import os

 # ----------------------------
 # Parsing function with standard python:

 def zip_data_parser(zip_fname):
     os.system('unzip {0}'.format(zip_fname)) # unzip
     folder_name = zip_fname.rsplit('.zip')[0]

     # load data:
     x_stack = []
     y_stack = []
     for i in range(n_images):
         x_stack.append(misc.imread(folder_name + '/image-{0}.png'.format(i)))
         y_stack.append(misc.imread(folder_name + '/mask-{0}.png'.format(i)))
     x = np.array(x_stack)
     y = np.array(y_stack)

     os.system('rm -rf {0}'.format(folder_name)) # remove unzipped folder
     return x, y 

 # ----------------------------
 # Dataset pipeline:

 all_zip_paths = ['file1.zip', 'file2.zip', 'file3.zip'] # list of paths for each zip file
 train_data = tf.constant(all_zip_paths)
 train_data = tf.data.Dataset.from_tensor_slices(train_data)

 train_data = train_data.map(
            lambda filename: tf.py_func(  # Parse the record into tensors
                zip_data_parser,
                [filename],
                [tf.float32, tf.float32]), num_parallel_calls=num_threads)

 # un-batch first, then batch the data again to have dimension [batch_size, N, M, C]
 train_data = train_data.apply(tf.data.experimental.unbatch())
 train_data = train_data.batch(b_size, drop_remainder=True)

Конечно, вам может потребоваться привести x и y к np.float32, прежде чем возвращать их из zip_data_parser в объект Dataset. Я также предположил, что маски в моем примере уже закодированы горячим способом.

...