TFX StatisticsGen для данных изображений

Привет, я пытаюсь запустить TFX Pipeline просто как упражнение. Я использую 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 может также вычислять статистику для семантических доменов (например, изображений, текста). Чтобы включить вычисление статистики семантической области, передайте объект 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)

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


person Joshua Patterson    schedule 07.03.2020    source источник
comment
Обновление: я немного покопался. TFX StatisticsGen Docs опирается на tfx.data_validation, что побудило меня попробовать это; stats = tfdv.generate_statistics_from_tfrecord(data_location=tfrecords_filename), что приводит к тому же предупреждению и сбою Colab. Полагаю, мы пытаемся разобраться в корне проблемы.   -  person Joshua Patterson    schedule 08.03.2020
comment
Хммм хорошо, поэтому я нашел пример CIFAR 10, где tfrecord уже создан. Когда я использую его для создания StatisticsGen, я получаю такое же предупреждение, и мой Google Colab разбился. Может быть, Колаб просто завален выводом текста. Может, я смогу изменить уровень лога. Посмотрим, поможет ли это.   -  person Joshua Patterson    schedule 09.03.2020
comment
Удалось ли вам найти решение этой проблемы? У меня такое же сообщение об ошибке.   -  person BioGeek    schedule 19.03.2020
comment
Была аналогичная проблема, исправление заключалось в обновлении до tfx 21.2, в котором все работало в интерактивном режиме в записной книжке, как указано выше. Обновление до 21.2 также заставило кое-что работать с kubeflow (обязательно обновите файл докеров, я адаптировал этот пример аналогично приведенному выше, чтобы использовать ImportExampleGen github.com/tensorflow/tfx/blob/master/tfx/examples/)   -  person Darren Brien    schedule 29.03.2020
comment
Спасибо @DarrenBrien. Я попробую и вернусь к вам.   -  person Joshua Patterson    schedule 05.04.2020
comment
Так что, похоже, сейчас проблема с TFX и Colab. Я даже не могу запустить стандартный tfx components.ipynb. Я поднял проблему. Попробую еще раз, когда проблема будет решена.   -  person Joshua Patterson    schedule 08.04.2020
comment
Печальные времена @DarrenBrien. Даже с tfx==0.21.2 у меня все еще миллиард Warnings, тогда моя вкладка Colab перестает отвечать. Я собираюсь попытаться выяснить, как изменить уровень журнала, чтобы выходные данные ячейки не спамили мне предупреждениями.   -  person Joshua Patterson    schedule 10.04.2020


Ответы (2)


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

Привет народ,

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

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

Открыть в 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)

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

person Joshua Patterson    schedule 22.04.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) 
person Darren Brien    schedule 11.04.2020
comment
Спасибо, @DarrenBrien. Это сработало в том смысле, что я могу продолжить работу с записной книжкой, не перегружая вывод ячеек предупреждающими сообщениями. В идеале мы выясним, как правильно кодировать / декодировать данные изображения, чтобы предупреждение никогда не срабатывало. Я опубликовал проблему, касающуюся того, как правильно кодировать / декодировать данные изображения, чтобы StatisticsGen действительно работал . - person Joshua Patterson; 12.04.2020
comment
Для всех, кого интересует Запуск в Colab. Запустить все до ячеек StatisticeGen - person Joshua Patterson; 12.04.2020