TFX StatisticsGen для данных изображения - PullRequest
1 голос
/ 07 марта 2020

Привет, я пытаюсь запустить конвейер TFX просто как упражнение. Я использую ImportExampleGen для загрузки TFRecords с диска. Каждый Example в TFRecord содержит JPG в виде строки байтов, высоты, ширины, глубины, руля и газа.

Я пытаюсь использовать StatisticsGen, но я получать это предупреждение; WARNING:root:Feature "image_raw" has bytes value "None" which cannot be decoded as a UTF-8 string. и сбой моего ноутбука Colab. Насколько я могу судить, все байтовые строки в TFRecord не повреждены.

Я не могу найти конкретные примеры по StatisticsGen и обработке данных изображения. В соответствии с документами Tensorflow Data Validation может работать с данными изображений.

В дополнение к вычислению набора статистических данных по умолчанию TFDV также может вычислять статистику для доменов semanti c. (например, изображения, текст). Чтобы включить вычисление статистики домена semanti c, передайте объект tfdv.StatsOptions с параметром enable_semantic_domain_stats, установленным в значение True, равным tfdv.generate_statistics_from_tfrecord.

Но я не уверен, как это согласуется с StatisticsGen .

Вот код, который создает ImportExampleGen, а затем StatisticsGen

from tfx.utils.dsl_utils import tfrecord_input
from tfx.components.example_gen.import_example_gen.component import ImportExampleGen
from  tfx.proto import example_gen_pb2

examples = tfrecord_input(_tf_record_dir)
# https://www.tensorflow.org/tfx/guide/examplegen#custom_inputoutput_split
# has a good explanation of splitting the data the 'output_config' param

# Input train split is _tf_record_dir/*'
# Output 2 splits: train:eval=8:2.
train_ratio = 8
eval_ratio  = 10-train_ratio
output = example_gen_pb2.Output(
             split_config=example_gen_pb2.SplitConfig(splits=[
                 example_gen_pb2.SplitConfig.Split(name='train',
                                                   hash_buckets=train_ratio),
                 example_gen_pb2.SplitConfig.Split(name='eval',
                                                   hash_buckets=eval_ratio)
             ]))
example_gen = ImportExampleGen(input=examples,
                               output_config=output)
context.run(example_gen)

statistics_gen = StatisticsGen(
    examples=example_gen.outputs['examples'])
context.run(statistics_gen)

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 22 апреля 2020

С git ответ на вопрос Спасибо Эван Розен

Привет, Фолкс,

Отображаемые предупреждения указывают на то, что StatisticsGen пытается относитесь к своим необработанным изображениям как к категориальным строковым элементам. Байты изображения декодируются очень хорошо. Проблема заключается в том, что при написании статистики (включая лучшие K примеров) выходной протокол ожидает допустимую строку UTF-8, но вместо этого получает необработанные байты изображения. Нет ничего плохого в ваших настройках из того, что я могу сказать, но это просто непреднамеренный побочный эффект предупреждения о благих намерениях, если у вас есть категорическая строковая функция, которую нельзя сериализовать. Мы попытаемся найти лучший вариант по умолчанию, который обрабатывает данные изображения более элегантно.

Тем временем, чтобы сообщить StatisticsGen, что эта функция действительно является непрозрачным BLOB-объектом, вы можете передать измененную пользователем схему, как описано в StatsGen документы. Чтобы сгенерировать эту схему, вы можете запустить StatisticsGen и SchemaGen один раз (для образца данных), а затем изменить предполагаемую схему, чтобы аннотировать эти функции изображения. Вот модифицированная версия colab из @ tall-jo sh:

Open In Colab

Дополнительные шаги немного многословны, но имеют куратор Схема часто является хорошей практикой по другим причинам. Вот ячейка, которую я добавил в блокнот:

from google.protobuf import text_format
from tensorflow.python.lib.io import file_io
from tensorflow_metadata.proto.v0 import schema_pb2

# Load autogenerated schema (using stats from small batch)

schema = tfx.utils.io_utils.SchemaReader().read(
    tfx.utils.io_utils.get_only_uri_in_dir(
        tfx.types.artifact_utils.get_single_uri(schema_gen.outputs['schema'].get())))

# Modify schema to indicate which string features are images.
# Ideally you would persist a golden version of this schema somewhere rather
# than regenerating it on every run.
for feature in schema.feature:
  if feature.name == 'image/raw':
    feature.image_domain.SetInParent()

# Write modified schema to local file
user_schema_dir ='/tmp/user-schema/'
tfx.utils.io_utils.write_pbtxt_file(
    os.path.join(user_schema_dir, 'schema.pbtxt'), schema)

# Create ImportNode to make modified schema available to other components
user_schema_importer = tfx.components.ImporterNode(
    instance_name='import_user_schema',
    source_uri=user_schema_dir,
    artifact_type=tfx.types.standard_artifacts.Schema)

# Run the user schema ImportNode
context.run(user_schema_importer)

Надеюсь, вы найдете этот обходной путь полезным. А пока мы рассмотрим лучший опыт по умолчанию для функций с изображениями.

1 голос
/ 11 апреля 2020

Прошло это и оказалось, что решение оказалось значительно проще, чем я думал ...

from tfx.orchestration.experimental.interactive.interactive_context import InteractiveContext
import logging
...
logger = logging.getLogger()
logger.setLevel(logging.CRITICAL)
...
context = InteractiveContext(pipeline_name='my_pipe')
...
c = StatisticsGen(...)
...
context.run(c) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...