본문 바로가기

Deep Learning/인공지능 개념 정리

Protocol Buffer 실습 2

320x100
320x100




역직렬화(Deserialization)를 통해 EXAMPLE.pb에서 데이터를 추출하는 방법에 대해 알아보자.


[ read.py ]

1
2
3
4
5
6
7
8
9
import EXAMPLE_pb2
 
handson = EXAMPLE_pb2.HandsOn()
 
with open('EXAMPLE.pb''rb'as f:
    serialized = f.read()
    handson.ParseFromString(serialized)
 
print(handson)
cs


  • Line 1
    : 마찬가지로 뼈대를 갖고 있는 EXAMPLE_pb2.py를 import 해줘야 한다.
      그래야 이 뼈대에 맞춰서 deserialized data를 재분배할 수 있기 때문이다.

  • Line 6
    : 직렬화된 형태로 저장된 데이터를 읽는다.

  • Line 7
    : 읽은 데이터를 handson 뼈대에 맞게 재분배해 handson 객체에 저장한다.

  • Line 9
    : 그 결과를 출력한다.








Protocol Buffer 실습 1, 2 를 통해 알아본 전체 흐름을 그려보면 다음과 같다.




여기서 놓치기 쉬운 점은

EXAMPLE.pb를 만들 때와 읽을 때 모두 EXAMPLE_pb2.py를 import 해줘야한다는 점이다. 읽을 때도 import 해줘야 한다.






※ 번외 

Tensorflow에선 pretrained model을 frozen_inference_graph.pb로 배포한다.

그러니 우리는 우리가 지금까지 알아본 방법대로

뼈대를 import한 뒤 deserialization을 통해 frozen_inference_graph.pb에 들어있는 데이터를 읽어주면 된다.

근데 문제는 우리는 import 할 뼈대를 갖고 있지 않다는 점이다. EXAMPLE_pb2.py에 해당하는 파일을 갖고있지 않다.


그래서 Tensorflow는 이럴 때 쓰라고 tf.GraphDef( )를 제공한다. tf.GraphDef( )가 뼈대 정보 제공 역할을 하는 것 같다.

import tensorflow 할 때 같이 import 되는 함수라 따로 import 해줄 필요는 없다.

tf.GraphDef( )의 역할은 EXAMPLE_pb2.HandsOn( )의 역할과 정확히 맞아 떨어진다.

 import EXAMPLE_pb2


 handson = EXAMPLE_pb2.HandsOn()


 with open('EXAMPLE.pb', 'rb') as f:

     serialized = f.read()

     handson.ParseFromString(serialized)


 print(handson)

 detection_graph = tf.Graph()

 with detection_graph.as_default():

     od_graph_def = tf.GraphDef()


     with tf.gifile.GFile(PATH_TO_FROZEN_GRAPH, 'rb') as fid:

         serialized_graph = fid.read()

         od_graph_def.ParseFromString(serialized_graph)


         tf.import_graph_def(od_graph_def, name = "")

 read.py

 object_detection_tutorial.ipynb 일부