Tensorflow 用于图像数据的TFX StatisticsGen

Tensorflow 用于图像数据的TFX StatisticsGen,tensorflow,tfx,Tensorflow,Tfx,嗨,我正试图让一个TFX管道作为一个练习来运行,真的。我正在使用ImportExampleGen从磁盘加载TFRecords。TFRecord中的每个示例都包含一个jpg,格式为字节字符串、高度、宽度、深度、转向和油门标签 我正在尝试使用StatisticsGen,但我收到了此警告; 警告:root:Feature“image_raw”的字节值为“None”,无法解码为UTF-8字符串。并使我的Colab笔记本崩溃。据我所知,TFR记录中的所有字节字符串图像都没有损坏 我找不到有关Statist

嗨,我正试图让一个TFX管道作为一个练习来运行,真的。我正在使用
ImportExampleGen
从磁盘加载
TFRecords
TFRecord
中的每个
示例
都包含一个jpg,格式为字节字符串、高度、宽度、深度、转向和油门标签

我正在尝试使用
StatisticsGen
,但我收到了此警告;
警告:root:Feature“image_raw”的字节值为“None”,无法解码为UTF-8字符串。
并使我的Colab笔记本崩溃。据我所知,TFR记录中的所有字节字符串图像都没有损坏

我找不到有关
StatisticsGen
和处理图像数据的具体例子。根据Tensorflow数据验证可以处理图像数据

除了计算一组默认的数据统计信息外,TFDV还可以计算语义域(例如图像、文本)的统计信息。要启用语义域统计信息的计算,请将enable_semantic_domain_stats设置为True的tfdv.StatsOptions对象传递给tfdv.generate_statistics_from_tfrecord

但我不确定这与
StatisticsGen
有什么关系

下面是实例化
ImportExampleGen
的代码,然后是
StatisticsGen

从tfx.utils.dsl\u utils导入tfrecord\u输入
从tfx.components.example\u gen.import\u example\u gen.component import ImportExampleGen
从tfx.proto导入示例\u gen\u pb2
示例=tfrecord\u输入(\u tf\u record\u dir)
# https://www.tensorflow.org/tfx/guide/examplegen#custom_inputoutput_split
#对“output_config”参数拆分数据有很好的解释
#输入列车拆分为_tf_record_dir/*'
#输出2个分段:序列:eval=8:2。
列车传动比=8
评估比率=10列评估比率
输出=示例_gen_pb2.output(
split\u config=example\u gen\u pb2.SplitConfig(splits=[
示例\u gen\u pb2.SplitConfig.Split(name='train',
hash_buckets=序列比率),
示例\u gen\u pb2.SplitConfig.Split(name='eval',
散列存储桶=评估比率)
]))
示例_gen=ImportExampleGen(输入=示例,
输出(配置=输出)
context.run(示例\u gen)
统计学(
示例=示例生成输出['examples'])
context.run(统计信息\u gen)

提前感谢。

对此进行了探索,发现解决方案比我想象的要简单得多

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) 
从 谢谢

大家好

您看到的警告表明,StatisticsGen正试图将原始图像功能视为分类字符串功能。图像字节被解码得很好。问题是,在编写统计数据(包括前K个示例)时,输出协议需要一个UTF-8有效字符串,但会获取原始图像字节。据我所知,您的设置没有问题,但这只是一个善意警告的意外副作用,如果您有无法序列化的分类字符串功能。我们将研究如何找到一个更好的默认值,以更优雅地处理图像数据

同时,为了告诉StatisticsGen这个特性实际上是一个不透明的blob,您可以按照StatsGen文档中的描述传入一个用户修改的模式。要生成此模式,可以运行一次StatisticsGen和SchemaGen(对数据样本),然后修改推断的模式以注释该图像特征。以下是@tall josh的colab的修改版本:

额外的步骤有点冗长,但是出于其他原因,拥有一个精心策划的模式通常是一个好的实践。这是我添加到笔记本中的单元格:

从google.protobuf导入文本\u格式
从tensorflow.python.lib.io导入文件
从tensorflow_metadata.proto.v0导入模式_pb2
#加载自动生成的架构(使用小批量的统计信息)
schema=tfx.utils.io_utils.SchemaAreder().read(
tfx.utils.io_utils.get_only_uri_in_dir(
tfx.types.artifact\u utils.get\u single\u uri(schema\u gen.outputs['schema'].get()))
#修改架构以指示哪些字符串特征是图像。
#理想情况下,您应该在某个地方保留此模式的黄金版本,而不是
#而不是在每次跑步时都重新生成它。
对于schema.feature中的功能:
如果feature.name=='image/raw':
feature.image\u domain.SetInParent()
#将修改后的架构写入本地文件
user_schema_dir='/tmp/user schema/'
tfx.utils.io_utils.write_pbtxt_文件(
join(user\u schema\u dir,'schema.pbtxt'),schema)
#创建ImportNode以使修改后的架构可用于其他组件
用户\架构\导入器=tfx.components.ImporterNode(
实例\u name='import\u user\u schema',
source\u uri=user\u schema\u dir,
工件类型=tfx.types.standard_工件.Schema)
#运行用户架构ImportNode
运行(用户\架构\导入器)

希望您发现此解决方法很有用。与此同时,我们将为图像值功能提供更好的默认体验。

更新:我一直在做一些挖掘工作。这种倾向引导我尝试这一点
stats=tfdv。从\u tfrecord(data\u location=tfrecords\u filename)
生成\u statistics\u,这会导致相同的警告和Colab崩溃。我想是接近问题的根源了。嗯,好的,所以我找到了一个CIFAR 10,其中已经创建了tfrecord。当我用它创建一个StatisticsGen时,我得到了同样的警告,我的Google Colab崩溃了。也许只是Colab被文本输出淹没了。也许我可以更改日志级别。看看这是否有帮助。你能找到这个问题的解决方案吗?我有相同的错误消息。有一个类似的问题,修复程序是更新到tfx 21.2,使事情在笔记本中交互工作,如上所述。更新到21.2还可以在kubeflow上运行(请确保更新您的dockerfile,我已经修改了这个类似的示例)