Получить строку из tf.io.parse_single_sequence_example - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть файл tfrecord, содержащий изображения и ограничивающие рамки. Есть переменное количество ограничивающих рамок, связанных с каждым изображением. Я создаю свои SequenceExamples вроде

def image_example(image_string, obj_vectors):

    box_feature_list = []
    for vec in obj_vectors:
        box_features = tf.train.Feature(float_list=tf.train.FloatList(value=vec))
        box_feature_list.append(box_features)

    all_box_features = tf.train.FeatureList(feature=box_feature_list)
    box_dict = {
        'Box Vectors': all_box_features
    }
    boxes = tf.train.FeatureLists(feature_list=box_dict)
    image = tf.train.Features(feature={
        'image': _bytes_feature(image_string),
    })
    example = tf.train.SequenceExample(
        context=image,
        feature_lists=boxes
    )
    return example

Затем я читаю их с помощью

def _parse_image_function(example):
    # Create a dictionary describing the features.
    context_feature = {
        'image': tf.io.FixedLenFeature([], dtype=tf.string)
    }
    sequence_features = {
        'Box Vectors': tf.io.VarLenFeature(dtype=tf.float32)
    }
    context_data, sequence_data = tf.io.parse_single_sequence_example(serialized=example, 
                                    context_features=context_feature, sequence_features=sequence_features)
    print(context_data)
    image = context_data['image']
    print(image)
    #tf.io.decode_raw(image, tf.string)
    #print(image.numpy())
    image = tf.image.decode_jpeg(context_data['image'])    
    print(image)
    print(sequence_data['Box Vectors'])
    return context_data, sequence_data

Когда я печатаю context_data, он печатает {'image': <tf.Tensor 'ParseSingleSequenceExample/ParseSingleSequenceExample:0' shape=() dtype=string>}, а когда я печатаю context_data['image'], это печатает Tensor("ParseSingleSequenceExample/ParseSingleSequenceExample:0", shape=(), dtype=string). Я ожидал получить необработанную строку, когда выполнил context_data['image'], но не получаю.

Я использую _parse_image_function в качестве входных данных для dataset.map, как

dataset = tf.data.TFRecordDataset(FILENAME)
dataset = dataset.map(_parse_image_function)

Затем я могу получить необработанную строку изображения, выполнив

for x, y in dataset:
    vecs = y['Box Vectors']
    image = x['image']
    image = tf.reshape(image, [])
    #print(image)
    image = tf.image.decode_jpeg(image)
    vecs = tf.sparse.to_dense(vecs)

Но я хочу преобразовать мои данные в тензоры в моей функции карты _parse_image_function. Я хочу сделать это, чтобы я мог пакетировать свои данные, я собирался попытаться использовать dataset.padded_batch в сопоставленном наборе данных. Я собираюсь об этом неправильно?

1 Ответ

0 голосов
/ 03 апреля 2020

У меня это работает с

    def _parse_image_function(example):
        # Create a dictionary describing the features.
        context_feature = {
            'image': tf.io.FixedLenFeature([], dtype=tf.string)
        }
        sequence_features = {
            'Box Vectors': tf.io.VarLenFeature(dtype=tf.float32)
        }
        context_data, sequence_data = tf.io.parse_single_sequence_example(serialized=example, 
                                        context_features=context_feature, sequence_features=sequence_features)

        return context_data['image'], sequence_data['Box Vectors']

    def format_data(image, labels):
        vecs = tf.sparse.to_dense(labels)
        #print(vecs)
        image = tf.image.decode_jpeg(image)
        image = tf.image.convert_image_dtype(image, dtype=tf.float32) # this should also normalize pixels
        #print(image)
        return image, vecs

    def train():
        dataset = dataset.map(_parse_image_function)
        dataset = dataset.map(format_data)
        dataset = dataset.padded_batch(params.batch_size, padded_shapes=([None, None, 3], [None, None]))
        for epoch in range(params.epochs):
            for x, y in dataset:
                loss_value, grads = grad(model, x, y)
                optimizer.apply_gradients(zip(grads, model.trainable_variables))

Мне пришлось дважды звонить dataset.map. Мои изображения (1280, 1920, 3) и метки (1, 10)

...