Операции tf.image в тензор-переносе - PullRequest
0 голосов
/ 07 февраля 2020

Я работаю над конвейером предварительной обработки изображений с тензорным преобразованием. На предыдущих этапах конвейера я загружал файлы изображений (с 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 . Спасибо :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...