Как работать с 3D-изображениями в Keras ImageDataGenerator flow_from_dataframe

Я хочу оценить числовые значения с помощью 3D-изображений, поэтому я хочу объединить 3D CNN с регрессией. Я работаю с данными 3D-изображения, хранящимися в виде файлов .raw с формой (200200200). Когда я пытаюсь использовать Keras ImageDataGenerator для подбора модели, возникает следующая ошибка:

UnidentifiedImageError: не удается идентифицировать файл изображения <объект _io.BytesIO по адресу 0x7f0b2a5bc400>

похоже, что PIL не может открыть данные 3D-изображения. Итак, как я могу предварительно обработать и загрузить изображения перед использованием функции flow_from_dataframe

      training_datagen = ImageDataGenerator()

train_generator = training_datagen.flow_from_dataframe(
        dataframe=df_train,
        directory="./patches",
        x_col="Images",
        y_col="Permeability",
        target_size=(200, 200,200),
        batch_size=33,
        class_mode='other',
        validate_filenames=False)

validation_datagen = ImageDataGenerator()

val_generator = validation_datagen.flow_from_dataframe(
        dataframe=df_validate,
        directory="./patches",
        x_col="Images",
        y_col="Permeability",
        target_size=(200, 200,200),
        class_mode='other',
        validate_filenames=False) 

1 ответ

tf.keras.preprocessing.image.ImageDataGenerator— это очень интегрированный API, который обеспечивает небольшую масштабируемость, особенно при работе с 3D-данными. Кроме того, в ближайшем будущем этот API будет объявлен устаревшим (см. документацию по API tf2.9).

Итак, мое предложение заключается в том, что вы должны использоватьtf.data.DatasetAPI для создания вашего конвейера данных, если вы можете получить Numpy arrayили тф tensorиз необработанных данных.

Вот 2 простых примера, первый from_tensor_slice

      import tensorflow as tf
import numpy as np

raw_data = [np.random.normal(size=[200,200,200]) for _ in range(20)]
def map_func(x):
    # if need preprocess data
    # write some logic here
    return x
train_data_pipeline = tf.data.Dataset.from_tensor_slices(raw_data[0:15])\
                                     .map(map_func)\
                                     .batch(5)
val_data_pipeline = tf.data.Dataset.from_tensor_slices(raw_data[15:])\
                                   .map(map_func)\
                                   .batch(5)
for item in train_data_pipeline:
    print(item.shape) 
    # (5,200, 200, 200)
    # (5,200, 200, 200)
    # (5,200, 200, 200)
for item in val_data_pipeline:
    print(item.shape)
    # (5,200, 200, 200)

второй from_generator

      import tensorflow as tf
import numpy as np

raw_data = [np.random.normal(size=[200,200,200]) for _ in range(20)]
def gen_func1():
    yield from raw_data[:15]
def gen_func2():
    yield from raw_data[15:]
def map_func(x):
    # if need preprocess data
    # write some logic here
    return x
train_data_pipeline = tf.data.Dataset.from_generator(gen_func1,
                                                     output_signature=(tf.TensorSpec(shape=[200,200,200],dtype=tf.float32)))\
                                     .map(map_func)\
                                     .batch(5)
val_data_pipeline = tf.data.Dataset.from_generator(gen_func2,
                                                   output_signature=(tf.TensorSpec(shape=[200,200,200],dtype=tf.float32)))\
                                   .map(map_func)\
                                   .batch(5)
for item in train_data_pipeline:
    print(item.shape) 
    # (5,200, 200, 200)
    # (5,200, 200, 200)
    # (5,200, 200, 200)
for item in val_data_pipeline:
    print(item.shape)
    # (5,200, 200, 200)

Многие встроенные функции, такие как batch, shuffle, take, random, можно использовать для настройки конвейера данных. Самый импортный из них map, что позволяет предварительно обрабатывать данные онлайн.

Другие вопросы по тегам