Tensorflow:从 TFRecords 文件中提取图像和标签
Tensorflow: Extracting image and label from TFRecords file
我有一个 TFRecords 文件,其中包含带有标签、名称、大小等的图像。我的目标是将标签和图像提取为 numpy 数组。
我执行以下操作来加载文件:
def extract_fn(data_record):
features = {
# Extract features using the keys set during creation
"image/class/label": tf.FixedLenFeature([], tf.int64),
"image/encoded": tf.VarLenFeature(tf.string),
}
sample = tf.parse_single_example(data_record, features)
#sample = tf.cast(sample["image/encoded"], tf.float32)
return sample
filename = "path\train-00-of-10"
dataset = tf.data.TFRecordDataset(filename)
dataset = dataset.map(extract_fn)
iterator = dataset.make_one_shot_iterator()
next_element = iterator.get_next()
with tf.Session() as sess:
while True:
data_record = sess.run(next_element)
print(data_record)
图片保存为字符串。如何将图像转换为 float32
?我试过 sample = tf.cast(sample["image/encoded"], tf.float32)
没有用。我希望 data_record
成为一个列表,其中包含作为 numpy 数组的图像和作为 np.int32
数字的标签。我该怎么做?
现在 data_record
看起来像这样:
{'image/encoded': SparseTensorValue(indices=array([[0]]), values=array([b'\xff\xd8\ ... 8G\xff\xd9'], dtype=object), dense_shape=array([1])), 'image/class/label': 394}
我不知道如何处理它。我将不胜感激任何帮助
编辑
如果我在 extract_fn()
中打印 sample
和 sample['image/encoded']
,我会得到以下结果:
print(sample) =
{'image/encoded': <tensorflow.python.framework.sparse_tensor.SparseTensor object at 0x7fe41ec15978>, 'image/class/label': <tf.Tensor 'ParseSingleExample/ParseSingleExample:3' shape=() dtype=int64>}
print(sample['image/encoded'] =
SparseTensor(indices=Tensor("ParseSingleExample/ParseSingleExample:0", shape=(?, 1), dtype=int64), values=Tensor("ParseSingleExample/ParseSingleExample:1", shape=(?,), dtype=string), dense_shape=Tensor("ParseSingleExample/ParseSingleExample:2", shape=(1,), dtype=int64))
好像图像是稀疏张量,tf.image.decode_image
报错。将图像提取为 tf.float32
张量的正确方法是什么?
我相信您存储的图像编码为 JPEG 或 PNG 或其他格式。所以,在阅读的时候,你必须解码它们:
def extract_fn(data_record):
features = {
# Extract features using the keys set during creation
"image/class/label": tf.FixedLenFeature([], tf.int64),
"image/encoded": tf.VarLenFeature(tf.string),
}
sample = tf.parse_single_example(data_record, features)
image = tf.image.decode_image(sample['image/encoded'], dtype=tf.float32)
label = sample['image/class/label']
return image, label
...
with tf.Session() as sess:
while True:
image, label = sess.run(next_element)
image = image.reshape(IMAGE_SHAPE)
更新:
似乎您将数据作为稀疏张量中的单个单元格值获取。尝试将其转换回密集并在解码前后进行检查:
def extract_fn(data_record):
features = {
# Extract features using the keys set during creation
"image/class/label": tf.FixedLenFeature([], tf.int64),
"image/encoded": tf.VarLenFeature(tf.string),
}
sample = tf.parse_single_example(data_record, features)
label = sample['image/class/label']
dense = tf.sparse_tensor_to_dense(sample['image/encoded'])
# Comment it if you got an error and inspect just dense:
image = tf.image.decode_image(dense, dtype=tf.float32)
return dense, image, label
如果我没看错,你只需要 numpy.fromstring
img_str = (example.features.feature['image_raw'].bytes_list.value)
image = np.fromstring(img_str, dtype=np.float32)
或者如果你需要tensorflow函数,你需要在你的parse函数中添加tf.decode_raw
,我认为最好将图像和标签分开
def extract_fn(data_record):
features = {
# Extract features using the keys set during creation
"image/class/label": tf.FixedLenFeature([], tf.int64),
"image/encoded": tf.VarLenFeature(tf.string),
}
sample = tf.parse_single_example(data_record, features)
image = tf.decode_raw(sample['image/encoded'], tf.float32)
label = sample['image/class/label']
return image, label
我有一个 TFRecords 文件,其中包含带有标签、名称、大小等的图像。我的目标是将标签和图像提取为 numpy 数组。
我执行以下操作来加载文件:
def extract_fn(data_record):
features = {
# Extract features using the keys set during creation
"image/class/label": tf.FixedLenFeature([], tf.int64),
"image/encoded": tf.VarLenFeature(tf.string),
}
sample = tf.parse_single_example(data_record, features)
#sample = tf.cast(sample["image/encoded"], tf.float32)
return sample
filename = "path\train-00-of-10"
dataset = tf.data.TFRecordDataset(filename)
dataset = dataset.map(extract_fn)
iterator = dataset.make_one_shot_iterator()
next_element = iterator.get_next()
with tf.Session() as sess:
while True:
data_record = sess.run(next_element)
print(data_record)
图片保存为字符串。如何将图像转换为 float32
?我试过 sample = tf.cast(sample["image/encoded"], tf.float32)
没有用。我希望 data_record
成为一个列表,其中包含作为 numpy 数组的图像和作为 np.int32
数字的标签。我该怎么做?
现在 data_record
看起来像这样:
{'image/encoded': SparseTensorValue(indices=array([[0]]), values=array([b'\xff\xd8\ ... 8G\xff\xd9'], dtype=object), dense_shape=array([1])), 'image/class/label': 394}
我不知道如何处理它。我将不胜感激任何帮助
编辑
如果我在 extract_fn()
中打印 sample
和 sample['image/encoded']
,我会得到以下结果:
print(sample) =
{'image/encoded': <tensorflow.python.framework.sparse_tensor.SparseTensor object at 0x7fe41ec15978>, 'image/class/label': <tf.Tensor 'ParseSingleExample/ParseSingleExample:3' shape=() dtype=int64>}
print(sample['image/encoded'] =
SparseTensor(indices=Tensor("ParseSingleExample/ParseSingleExample:0", shape=(?, 1), dtype=int64), values=Tensor("ParseSingleExample/ParseSingleExample:1", shape=(?,), dtype=string), dense_shape=Tensor("ParseSingleExample/ParseSingleExample:2", shape=(1,), dtype=int64))
好像图像是稀疏张量,tf.image.decode_image
报错。将图像提取为 tf.float32
张量的正确方法是什么?
我相信您存储的图像编码为 JPEG 或 PNG 或其他格式。所以,在阅读的时候,你必须解码它们:
def extract_fn(data_record):
features = {
# Extract features using the keys set during creation
"image/class/label": tf.FixedLenFeature([], tf.int64),
"image/encoded": tf.VarLenFeature(tf.string),
}
sample = tf.parse_single_example(data_record, features)
image = tf.image.decode_image(sample['image/encoded'], dtype=tf.float32)
label = sample['image/class/label']
return image, label
...
with tf.Session() as sess:
while True:
image, label = sess.run(next_element)
image = image.reshape(IMAGE_SHAPE)
更新: 似乎您将数据作为稀疏张量中的单个单元格值获取。尝试将其转换回密集并在解码前后进行检查:
def extract_fn(data_record):
features = {
# Extract features using the keys set during creation
"image/class/label": tf.FixedLenFeature([], tf.int64),
"image/encoded": tf.VarLenFeature(tf.string),
}
sample = tf.parse_single_example(data_record, features)
label = sample['image/class/label']
dense = tf.sparse_tensor_to_dense(sample['image/encoded'])
# Comment it if you got an error and inspect just dense:
image = tf.image.decode_image(dense, dtype=tf.float32)
return dense, image, label
如果我没看错,你只需要 numpy.fromstring
img_str = (example.features.feature['image_raw'].bytes_list.value)
image = np.fromstring(img_str, dtype=np.float32)
或者如果你需要tensorflow函数,你需要在你的parse函数中添加tf.decode_raw
,我认为最好将图像和标签分开
def extract_fn(data_record):
features = {
# Extract features using the keys set during creation
"image/class/label": tf.FixedLenFeature([], tf.int64),
"image/encoded": tf.VarLenFeature(tf.string),
}
sample = tf.parse_single_example(data_record, features)
image = tf.decode_raw(sample['image/encoded'], tf.float32)
label = sample['image/class/label']
return image, label