2016-09-30 3 views
1

Ich verwende TensorFlow in Python und ich habe die Daten in TFRecords-Dateien mit tf.train.Example Protokollpuffer gespeichert. Ich versuche, die Felder in jedem Beispiel gespeichert zu extrahieren (im folgenden Codebeispiel diese sind höhen, Breite, Bild), ohne die Notwendigkeit, eine TensorFlow Sitzung auszuführen. Und durch Versuch und Irrtum fand ich den folgenden Code OK arbeiten:Extrahieren von Bildern aus Tfrecords-Dateien mit Protobuf ohne eine TensorFlow-Sitzung

import numpy as np 
import tensorflow as tf 

def _im_feature_to_im(example, key): 
    feature_ser = example.features.feature[key].bytes_list.SerializeToString() 
    feature_ser_clean = feature_ser[4:] 
    image = np.fromstring(feature_ser_clean, dtype=np.uint8).reshape((height, width)) 
    return image 

for serialized_example in tf.python_io.tf_record_iterator(tfrec_filename): 
    example = tf.train.Example() 
    example.ParseFromString(serialized_example) 
    # traverse the Example format to get data 
    height = example.features.feature['height'].int64_list.value[0] 
    width = example.features.feature['width'].int64_list.value[0] 
    image = _im_feature_to_im(example, 'image') 

So: int Felder sind leicht extrahiert. Aber meine Frage bezieht sich auf die Extraktion des Bildes: Warum muss ich 4 Bytes vom Anfang des Bytes-Arrays entfernen, um das Originalbild zu erhalten? Gibt es dort einen Header?

Antwort

2

Das ist der Schlüssel für Protokollpuffercodierung.

https://developers.google.com/protocol-buffers/docs/encoding

Sie können es ausdrucken und den Anweisungen auf der oben genannten Website, sie zu entschlüsseln folgen. Wahrscheinlich ist es eine Codierung von Tag = 1, Typ = 2, Länge = Höhe * Breite.

Hoffe, dass hilft!

Sherry

+0

Danke, das ist hilfreich. Es scheint, dass ich das erste Byte überspringen muss und dann alle Bytes mit MSB = 1 überspringe, bis ich ein Byte mit MSB = 0 erreiche und das ist das letzte, das übersprungen wird. Jetzt kann ich den Code ersetzen, anstatt hart codierte 4 Byte zu entfernen (was für andere Fälle von gespeicherten Informationen nicht korrekt ist). – user2736930

Verwandte Themen