본문 바로가기

Deep Learning/인공지능 개념 정리

Protocol Buffer 실습 1

320x100
320x100




protocol buffer를 사용해 객체를 .pb 파일로 저장하는 과정까지 이번 글을 통해 알아보겠다.


구글에서 이렇게 써! 라고 지정해서 배포한 거라 앞으로의 과정에 대해


'왜 이걸 쓰는 거지?' 내지는 '왜 이렇게 하는 거지?' 와 같은 의문은 안 갖는 것이 좋다. 



1. 객체의 뼈대 생성


먼저 저장하고자 하는 객체의 뼈대에 대한 정보를 갖는 EXAMPLE.proto를 protocol buffer 폴더를 새로 만들어 안에 저장해주자.


[  EXAMPLE.proto ]

1
2
3
4
5
6
7
syntax = "proto3";
 
message HandsOn{
  string name = 1;
  string type = 2;
  float value = 3;
}
cs


HandsOn객체는 string형 2개, float형 1개의 데이터를 갖는다.




2. EXAMPLE.proto 컴파일



Tensorflow Object Detection API 다운로드 및 환경설정에서 다운받은 protoc을 이용해 


EXAMPLE.proto -> EXAMPLE_pb2.py 로 컴파일 해준다.





3. 객체에 데이터 입력 후 직렬화를 통한 저장


컴파일을 하면


EXAMPLE.proto의 정보들이 파이썬 환경에서 사용될 수 있도록 변형되어 EXAMPLE_pb2.py에 저장되기 때문에


EXAMPLE_pb2.py를 import 해서 사용해주면된다.


즉, EXAMPLE_pb2.py에는 EXAMPLE.proto에서 설정한 HandsOn 객체에 대한 뼈대가 저장되어 있는 것이다.


[  write.py ]

1
2
3
4
5
6
7
8
9
10
import EXAMPLE_pb2
 
handson = EXAMPLE_pb2.HandsOn()
handson.name = 'tensorflow object detection api'
handson.type = 'practice'
handson.value = 20190702
serialized = handson.SerializeToString()
 
with open('EXAMPLE.pb''wb'as f:
    f.write(serialized)
cs


  • Line 3
    : HandsOn 객체를 생성해서 뼈대를 불러온다.

  • Line 4 ~ 6
    : 객체에 데이터를 저장한다.

  • Line 7
    : 데이터가 저장된 객체를 직렬화한다.


  • Line 9 ~ 10
    : 직렬화된 데이터를 EXAMPLE.pb로 저장한다.











지금까지의 과정을 그림으로 그려보면 다음과 같다.





최종적으로 만들어진 


EXAMPLE.pb를 handson 객체의 데이터를 필요로 하는 사람에게 전달해주면


상대방은 이를 Deserialization을 통해 데이터를 얻어낼 수 있다.





※ 번외


Tensorflow Object Detection API에서는 pretrained model 사용을 위해 frozen_inference_graph.pb를 사용하는데


그 이유가 바로 지금까지 살펴본 것처럼 frozen_inference_graph.pb에 pretrained model의 모든 정보가 담겨있기 때문이다.






< 참고 사이트 >


https://codedragon.tistory.com/4825


https://oversky.tistory.com/53


https://m.blog.naver.com/PostView.nhn?blogId=yoohee2018&logNo=220724696138&proxyReferer=https%3A%2F%2Fwww.google.com%2F


https://shin6666.tistory.com/entry/%EC%A7%81%EB%A0%AC%ED%99%94serialization


http://woowabros.github.io/experience/2017/10/17/java-serialize.html


https://bcho.tistory.com/tag/protocol%20buffer


https://www.datadoghq.com/blog/engineering/protobuf-parsing-in-python/