Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用tf.io.decode\u图像解码批图像_Python_Image Processing_Batch Processing_Tensorflow2.0_Tfrecord - Fatal编程技术网

Python 无法使用tf.io.decode\u图像解码批图像

Python 无法使用tf.io.decode\u图像解码批图像,python,image-processing,batch-processing,tensorflow2.0,tfrecord,Python,Image Processing,Batch Processing,Tensorflow2.0,Tfrecord,我正在尝试面部关键点回归。我成功地创建了TFRecord文件,其中包含编码的图像和标签(标签是面部关键点) 然后,我开始将数据(图像和关键点)加载到内存中(遵循此处的指南)。我想先批量处理所有图像,然后按照指南中的描述对图像进行解码。然而,这不起作用。如果我的理解是正确的,我只能在单个图像上使用tf.image.decode_image(),而不能在批处理中使用。我的理解正确吗?如果是,我如何解码一批图像 提前谢谢你 抄送 代码如下: ds=tf.data.TFRecordDataset(TFR

我正在尝试面部关键点回归。我成功地创建了TFRecord文件,其中包含编码的图像和标签(标签是面部关键点)

然后,我开始将数据(图像和关键点)加载到内存中(遵循此处的指南)。我想先批量处理所有图像,然后按照指南中的描述对图像进行解码。然而,这不起作用。如果我的理解是正确的,我只能在单个图像上使用tf.image.decode_image(),而不能在批处理中使用。我的理解正确吗?如果是,我如何解码一批图像

提前谢谢你

抄送

代码如下:

ds=tf.data.TFRecordDataset(TFR\u文件名)
ds=ds.重复(历元)
ds=ds.shuffle(缓冲区大小+批大小)
ds=ds.批次(批次大小)
最后,我尝试使用tf.image.decode_image()对图像进行解码
feature_description={'height':tf.io.FixedLenFeature([],tf.int64),
“宽度”:tf.io.FixedLenFeature([],tf.int64),
“深度”:tf.io.FixedLenFeature([],tf.int64),
“kpts”:tf.io.FixedLenFeature([136],tf.float32),
“image_raw”:tf.io.FixedLenFeature([],tf.string),
}
对于ds.take(1)中的记录:
record=tf.io.parse_示例(记录、功能描述)
decoded_image=tf.io.decode_image(记录['image_raw'],数据类型=tf.float32)
这会引发以下ValueError:

---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
1用于ds中的记录。取(1):
2记录=tf.io.parse_示例(记录、特征描述)
---->3解码图像=tf.io.decode图像(记录['image\u raw',数据类型=tf.float32)
3帧
/解码图像中的tensorflow-2.0.0/python3.6/tensorflow\u core/python/ops/image\u ops\u impl.py(内容、通道、数据类型、名称、展开动画)
2315以及带有EXIF数据的JPEG图像(从\xff\xd8\xff\xe1开始)。
2316回流控制流量操作条件(
->2317是\u jpeg(内容),\u jpeg,检查\u png,name='cond\u jpeg')
2318
2319
/新函数中的tensorflow-2.0.0/python3.6/tensorflow_core/python/util/deprecation.py(*args,**kwargs)
505“在未来版本中”如果日期不是其他日期(“在%s“%date”之后),
506(说明)
-->507返回函数(*args,**kwargs)
508
509 doc=\u添加\u不推荐的\u参数\u通知\u到\u docstring(
/tensorflow-2.0.0/python3.6/tensorflow\u core/python/ops/control\u flow\u ops.py以cond表示(pred、true\u fn、false\u fn、strict、name、fn1、fn2)
1199带有操作名称和范围(名称,“cond”,[pred]):
1200如果上下文。急切地执行_():
->1201如果pred:
1202结果=true_fn()
1203其他:
/tensorflow-2.0.0/python3.6/tensorflow\u core/python/framework/ops.py in\uuuuuuu bool\uuuu(self)
874
875 def_uuuubool_uuuu(自):
-->876返回布尔(self.\u numpy())
877
878非零__
ValueError:包含多个元素的数组的真值不明确。请使用a.any()或a.all()

事实上,
解码图像
仅适用于单个图像。在批处理之前,您仍应在数据集中进行解码,以获得合理的性能

类似这样的内容(代码未经测试,可能需要一些调整):


谢谢Dan,我用堆栈跟踪更新了这个问题。我认为抛出这个错误是因为tf.io.decode_image()需要一个标量作为输入。所以我需要在不进行批处理的情况下逐个提取每个记录/图像,然后解码这些图像,然后再批处理它们。我遵循的教程(链接到它在我的问题中)基于tf.1,作者认为解码图像之前的批处理可以提高性能,这是有意义的。如果可以在tf.1中解码一批图像,我认为它不会在tf.2中被删除。此外,文档对此没有任何说明。事实上,
解码图像
仅适用于单个图像。您仍然应该在批处理之前,通过在数据集中执行解码来获得合理的性能。类似这样的代码(未测试的代码,可能需要一些调整):``ds=tf.data.TFRecordDataset(TFR\u文件名)def parse\u and_decode(记录):record=tf.io.parse\u示例(记录,功能描述)record['image']=tf.io.decode\u image(记录['image\u raw'],dtype=tf.float32)返回记录ds=ds.map(解析和解码)ds=ds.repeat(EPOCHS)ds=ds.shuffle(缓冲区大小+批处理大小).“``我更新了答案,因为注释框不格式化代码。
ds = tf.data.TFRecordDataset(TFR_FILENAME)

def parse_and_decode(record):
  record = tf.io.parse_example(record, feature_description)
  record['image'] = tf.io.decode_image(record['image_raw'], dtype=tf.float32)
  return record

ds = ds.map(parse_and_decode)

ds = ds.repeat(EPOCHS)

ds = ds.shuffle(BUFFER_SIZE + BATCH_SIZE)
...