2016-09-30 6 views
1

私はPythonでTensorFlowを使用していますが、tf.train.Exampleプロトコルバッファを含むTFRecordsファイルにデータを保存しています。 (これらは画像ある次のコード例では)IはTensorFlowセッションを実行する必要なしに、各実施例に格納されたフィールドを抽出しようとしています。そして、試行錯誤によって、私は次のコードが正常に動作することが分かっ:TensorFlowセッションを実行せずにprotobufでtfrecordsファイルから画像を抽出する

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') 

ので: int型のフィールドが容易に抽出されています。 しかし、私の質問は、画像の抽出に関するものです:元の画像を取得するためにバイト配列の先頭から4バイトを削除する必要があるのはなぜですか?そこにいくつかのヘッダーがありますか?

答えて

2

これは、プロトコルバッファエンコーディングの鍵です。

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

あなたはそれをプリントアウトすることができますし、それをデコードするには、上記のWebサイトで指示に従ってください。ほとんどの場合、tag = 1、type = 2、length = height * widthのエンコーディングです。

希望に役立ちます!

シェリー

+0

ありがとうございます。私は最初のバイトをスキップして、MSB = 0のバイトに達するまでMSB = 1のすべてのバイトをスキップし続ける必要があり、それはスキップされる最後のバイトです。今では、ハードコードされた4バイトを削除する代わりに、コードを置き換えることができます(これは、保存された情報の他のケースでは正しくありません)。 – user2736930

関連する問題