Как работать с 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.Dataset
API для создания вашего конвейера данных, если вы можете получить 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
, что позволяет предварительно обрабатывать данные онлайн.