Я использую TensorFlows DeepLab и хочу проверить, правильно ли были преобразованы мои данные в tfrecords. Я использовал предопределенный код download_and_convert_ade20k.sh
и ниже, чтобы декодировать его обратно:
import tensorflow as tf
feature_desc = {
'image/encoded': tf.io.FixedLenFeature((), tf.string, default_value=''),
'image/filename': tf.io.FixedLenFeature((), tf.string, default_value=''),
'image/format': tf.io.FixedLenFeature((), tf.string, default_value='jpeg'),
'image/height': tf.io.FixedLenFeature((), tf.int64, default_value=0),
'image/width': tf.io.FixedLenFeature((), tf.int64, default_value=0),
'image/segmentation/class/encoded': tf.io.FixedLenFeature((), tf.string, default_value=''),
'image/segmentation/class/format': tf.io.FixedLenFeature((), tf.string, default_value='png'),
}
def _parse_image_function(example_proto):
return tf.io.parse_single_example(example_proto, feature_desc)
raw_image_dataset = tf.data.TFRecordDataset('ADE20K/tfrecord/train-00000-of-00004.tfrecord')
parsed_image_dataset = raw_image_dataset.map(_parse_image_function)
for image_features in parsed_image_dataset:
img = tf.io.decode_raw(image_features['image/encoded'], tf.uint8).numpy()
seg = tf.io.decode_raw(image_features['image/segmentation/class/encoded'], tf.uint8).numpy()
У меня две проблемы. Сначала я не знаю тип данных изображений до того, как они были закодированы. Я предполагаю tf.uint8
, потому что это единственный работающий, который также выводит значения от 0 до 255. С другой стороны, полученное изображение находится в 1D (как и ожидалось), но недостаточно длинном, чтобы преобразовать его в исходную форму. Декодированное изображение имеет длину 48836, тогда как исходная высота и ширина (512, 612), что в сумме равняется 313344 пикселям.