tensorflow - Using height, width information stored in a TFRecords file to set shape of a Tensor -
i have converted directory of images , labels tfrecords file, feature maps include image_raw
, label
, height
, width
, depth
. function follows:
def convert_to_tfrecords(data_samples, filename): def _int64_feature(value): return tf.train.feature(int64_list=tf.train.int64list(value=[value])) def _bytes_feature(value): return tf.train.feature(bytes_list=tf.train.byteslist(value=[value])) writer = tf.python_io.tfrecordwriter(filename) fname, lb in data_samples: im = cv2.imread(fname, cv2.imread_unchanged) image_raw = im.tostring() feats = tf.train.features( feature = { 'image_raw': _bytes_feature(image_raw), 'label': _int64_feature(int(lb)), 'height': _int64_feature(im.shape[0]), 'width': _int64_feature(im.shape[1]), 'depth': _int64_feature(im.shape[2]) } ) example = tf.train.example(features=feats) writer.write(example.serializetostring()) writer.close()
now, read tfrecords file feed input pipeline. however, since image_raw
has been flattened, need reshape original [height, width, depth]
size. how can values of height
, width
, depth
tfrecords file? seems following code cannot work because height
tensor without values.
def read_and_decode(filename_queue): reader = tf.tfrecordreader() _, serialized_example = reader.read(filename_queue) feats = { 'image_raw': tf.fixedlenfeature([], tf.string), 'label': tf.fixedlenfeature([], tf.int64), 'height': tf.fixedlenfeature([], tf.int64), 'width': tf.fixedlenfeature([], tf.int64), 'depth': tf.fixedlenfeature([], tf.int64) } features = tf.parse_single_example(serialized_example, features=feats) image = tf.decode_raw(features['image_raw'], tf.uint8) label = tf.cast(features['label'], tf.int32) height = tf.cast(features['height'], tf.int32) width = tf.cast(features['width'], tf.int32) depth = tf.cast(features['depth'], tf.int32) image = tf.reshape(image, [height, width, depth]) # <== not work image = tf.cast(image, tf.float32) * (1. / 255) - 0.5 return image, label
when read tensorflow's official documents, found pass known size, saying [224,224,3]
. however, don't it, because information has been stored tfrecords file, , manually passing fixed size cannot ensure size consistent data stored in file.
so ideas?
the height
returned tf.parse_single_example
tensor, , way value call session.run()
on it, or similar. however, think that's overkill.
since tensorflow example protocol buffer (see documentation), don't have use tf.parse_single_example
read it. instead parse , read shapes want out directly.
you might consider filing feature request on tensorflow's github issues tracker --- agree api seems bit awkward use case.
Comments
Post a Comment