Я работаю над конвейером предварительной обработки изображений с тензорным преобразованием. На предыдущих этапах конвейера я загружал файлы изображений (с tf.io.gfile.GFile ) в виде байтовых массивов. Теперь я хочу обработать байтовый массив с помощью tf.image операций.
import tensorflow as tf
import tensorflow_transform as tfx
...
def preprocessing_fn(inputs: dict) -> dict:
# inputs
size = 448
channels = 3
x = inputs['image']
y = inputs['label']
print('x: {}'.format(x))
print('y: {}'.format(y))
# create labels in model assets
tfx.vocabulary(y, vocab_filename='labels')
# load and normalize image
# x is a byte array (as string)
img_full = tf.image.decode_image(x, channels=channels)
img_norm = tf.image.convert_image_dtype(img_full, tf.float32)
img_resize = tf.image.resize(img_norm, [size, size])
x = img_resize
y = tf.cast(y.decode('utf-8'), dtype=tf.string)
# output
outputs = {'x': x,
'y': y}
return outputs
...
transformed_dataset, transform_fn = (
(downloaded_dataset, INPUT_SCHEMA)
| '{}_AnalyseAndTransform'.format(step) >> tfx_beam.AnalyzeAndTransformDataset(preprocessing_fn)
)
Однако существует несоответствие форм, которое я не могу выяснить, как разрешить.
ValueError: Shape must be rank 0 but is rank 1 for 'DecodeJpeg' (op: 'DecodeJpeg') with input shapes: [?].
x: Tensor("inputs/inputs/image_copy:0", shape=(None,), dtype=string)
y: Tensor("inputs/inputs/label_copy:0", shape=(None,), dtype=string)
tf.reshape () , as_bytes () , x [0] все не могут преобразовать x в допустимая строка для операций с изображениями. Запуск его на apache -beam с beam.Map () не вызывает никаких проблем, потому что байтовый массив - это простая строка вместо пакетного тензора без фигуры. Есть ли какие-либо преобразования, которые мне не хватает, или моя схема неверна?
INPUT_SCHEMA = dataset_metadata.DatasetMetadata(schema_utils.schema_from_feature_spec({
'image': tf.io.FixedLenFeature(shape=[], dtype=tf.string),
'label': tf.io.FixedLenFeature(shape=[], dtype=tf.string),
}))
Я не нашел ни одного примера операций tf.image в AnalyzeAndTransformDataset . Я не уверен, работает ли он таким образом. Я благодарен за каждую идею, так как это моя первая предварительная обработка изображений на tfx . Спасибо :)