如何将 .png 文件转换为 TFrecord tensorflow 格式?
How to convert a .png file to TFrecord tensorflow format?
我有 .png 格式的图像及其 .csv 格式的标签。我想将它们转换为 tfrecords 格式。我对张量流很陌生。如果有人能指出我需要知道的所有事情以及如何做到这一点。会很棒的。
我已经在网上搜索过了。但是有些已经过时了,有些已经很先进了。
编辑:我的图像存储在一个目录中。
谢谢
您必须将图像转换为 tf.train.Example
才能将其写入 tfrecord
文件。
这是一个简单的示例,说明如何执行此操作。
查看 csv
文件:
代码:
# The following functions can be used to convert a value to a type compatible
# with tf.train.Example.
def _bytes_feature(value):
"""Returns a bytes_list from a string / byte."""
if isinstance(value, type(tf.constant(0))):
value = value.numpy() # BytesList won't unpack a string from an EagerTensor.
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
def _float_feature(value):
"""Returns a float_list from a float / double."""
return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))
def _int64_feature(value):
"""Returns an int64_list from a bool / enum / int / uint."""
return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
def image_example(image_string, label):
image_shape = tf.image.decode_png(image_string).shape
feature = {
'height': _int64_feature(image_shape[0]),
'width': _int64_feature(image_shape[1]),
'depth': _int64_feature(image_shape[2]),
'label': _int64_feature(label),
'image_raw': _bytes_feature(image_string),
}
return tf.train.Example(features=tf.train.Features(feature=feature))
image_example
函数return单个图像的tf.train.Example
对象。
您必须遍历数据框以创建每个图像的 tf.train.Example
对象并使用 tf.io.TFRecordWriter
写入对象。
代码:
record_file = 'images.tfrecords'
image_labels = {
'cat': 0,
'bridge': 1,
}
with tf.io.TFRecordWriter(record_file) as writer:
for row in df.index:
full_path = 'data/img/new/' + df['filename'][row]
label = image_labels[df['label'][row]]
image_string = tf.io.read_file(full_path)
tf_example = image_example(image_string, label)
writer.write(tf_example.SerializeToString())
有关 Reading/Writing TFRecord 文件的完整教程,请参阅 this。
如果您有多个标签,您可以在 image_example
内的特征字典中创建多个特征。
代码:
def image_example(image_string, label_color, label_type):
image_shape = tf.image.decode_png(image_string).shape
feature = {
'height': _int64_feature(image_shape[0]),
'width': _int64_feature(image_shape[1]),
'depth': _int64_feature(image_shape[2]),
'label_color': _int64_feature(label_color),
'label_type': _int64_feature(label_type),
'image_raw': _bytes_feature(image_string),
}
return tf.train.Example(features=tf.train.Features(feature=feature))
我有 .png 格式的图像及其 .csv 格式的标签。我想将它们转换为 tfrecords 格式。我对张量流很陌生。如果有人能指出我需要知道的所有事情以及如何做到这一点。会很棒的。
我已经在网上搜索过了。但是有些已经过时了,有些已经很先进了。
编辑:我的图像存储在一个目录中。
谢谢
您必须将图像转换为 tf.train.Example
才能将其写入 tfrecord
文件。
这是一个简单的示例,说明如何执行此操作。
查看 csv
文件:
代码:
# The following functions can be used to convert a value to a type compatible
# with tf.train.Example.
def _bytes_feature(value):
"""Returns a bytes_list from a string / byte."""
if isinstance(value, type(tf.constant(0))):
value = value.numpy() # BytesList won't unpack a string from an EagerTensor.
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
def _float_feature(value):
"""Returns a float_list from a float / double."""
return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))
def _int64_feature(value):
"""Returns an int64_list from a bool / enum / int / uint."""
return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
def image_example(image_string, label):
image_shape = tf.image.decode_png(image_string).shape
feature = {
'height': _int64_feature(image_shape[0]),
'width': _int64_feature(image_shape[1]),
'depth': _int64_feature(image_shape[2]),
'label': _int64_feature(label),
'image_raw': _bytes_feature(image_string),
}
return tf.train.Example(features=tf.train.Features(feature=feature))
image_example
函数return单个图像的tf.train.Example
对象。
您必须遍历数据框以创建每个图像的 tf.train.Example
对象并使用 tf.io.TFRecordWriter
写入对象。
代码:
record_file = 'images.tfrecords'
image_labels = {
'cat': 0,
'bridge': 1,
}
with tf.io.TFRecordWriter(record_file) as writer:
for row in df.index:
full_path = 'data/img/new/' + df['filename'][row]
label = image_labels[df['label'][row]]
image_string = tf.io.read_file(full_path)
tf_example = image_example(image_string, label)
writer.write(tf_example.SerializeToString())
有关 Reading/Writing TFRecord 文件的完整教程,请参阅 this。
如果您有多个标签,您可以在 image_example
内的特征字典中创建多个特征。
代码:
def image_example(image_string, label_color, label_type):
image_shape = tf.image.decode_png(image_string).shape
feature = {
'height': _int64_feature(image_shape[0]),
'width': _int64_feature(image_shape[1]),
'depth': _int64_feature(image_shape[2]),
'label_color': _int64_feature(label_color),
'label_type': _int64_feature(label_type),
'image_raw': _bytes_feature(image_string),
}
return tf.train.Example(features=tf.train.Features(feature=feature))