AI

How to convert pt to tflite (yolov5 to tensorflow lite) tflite로 변환

관절분리 2023. 8. 21. 17:58
반응형

업데이트:
이걸로 해결

github.com/zldrobit/yolov5/blob/tf-android/models/tf.py

$ python models/tf.py --weights weights/best.pt --cfg models/yolov5s.yaml --img-size 320

 


 

yolov5로 학습된 모델을 1차적으로 Android에서 사용하고자 한다.

그럴러면 최종적으로 .pt 파일을 .tflite로 변환해야한다.

 

그게 한번에 되냐?

 

아쉽게도 pt -> onnx -> pb -> tflite 순으로 변환해야한다.

명령어 하나로 되었다면 얼마나 좋았을까..

 

그래서 그 과정에서 꽤 많은 삽질을 하게 되었다.

 

잠깐 언급하자면 tensorflow 버전과 onnx 버전의 호환성..

버전업되면서 바뀐것도 많고 알 수 없는 에러 또한 많다.

이 분야에선 너무 흔한 특징이라, 

 

이 글에선 삽질 과정은 간단하게만 언급하겠다.

 

- Win10에서 python 특정 모듈의 버전을 찾을 수 없다고 해서 conda에 python3.6을 설치하려니 설치가 안되었다, 

- 그래서 MacOS(카탈레나)에서 yolov5를 받아 export하려니 'google::protobuf' 관련 이유로 에러가 발생.

- 그래서 Ubuntu에서 yolov5를 받아 모듈을 설치하려니 torch 설치 실패..

 

그래서 최종적으로 google colab에서 작업하기로 결정!

 

tensorflow 2.4.0과

pip를 이용해 설치되는 모듈의 최신버전 onnx 1.6.0 onnx-tf 1.7.0으로 작업을 시작하니

pt -> onnx는 정상적으로 잘 변환 되었다.

그런데 onnx -> pb부분이 onnx-tf 버전에 따라 나오는 아웃풋 파일 양식이 달랐다.

onnx-tf 1.7.0의 경우 디렉토리가 생성되며 그 안에 saved_mode.pb가 만들어지며,

onnx-tf 1.6.0에선 지정된이름.pb 파일이 생성된다.

그에 따라 문제가 발생되거나 pb -> tflite를 위한 명령이나 코드가 달라진다.

 

아무튼 1.6.0이나 1.7.0이나 둘다 변환이 되질 않았다.

이걸로 정말 온갖 방법을 다 찾아보면서 시도했지만, 잘 해결되지 않았다.

onnx -> pb 부분에서 파일이 잘 만들어지긴 했는데 속이 이상해서 pb -> tflite가 안되는걸까? 등 

변환 과정이 많아 의심되는 부분이 한두개가 아니었다.

 

결론은,

tensorflow (2.4.0 -> 2.3.0) -> 1.15.0

onnx (1.7.0 <-> 1.6.0) -> 1.8.0

onnx-tf (1.7.0 <-> 1.6.0) -> 1.8.0

torch 1.7.0

을 세팅으로 변환에 성공했다.

 

onnx-tensorflow : github.com/onnx/onnx-tensorflow/tree/tf-1.x

 


 

 

그러고보니 onnx>=1.8.0이 떡하니 적혀있다. 왜 첨엔 안됐을까.. tensorflow 2.4였어서 그런가?? (이젠 다시 확인 귀찮..)

yolov5/requirements.txt

 

 

최종 파일 구조

 

 

최종 변환된 best.tflite 파일 확인 (netron.app/

model properities

 

model architecture

 

 

 


참 과정과 다르게 결과 코드는 간단하다...

 

...

 

먼저 yolov5로 학습된 best.pt 파일을 준비한다.

 

yolov5에서는 기본적으로 onnx로 변환하는 코드를 제공한다. (개꿀~)

# pt to onnx
$ python /content/yolov5/export.py --weights best.pt --img 640 --batch 1

 

onnx-tf를 이용해 pb파일을 만든다.

# onnx to pb
import onnx
from onnx_tf.backend import prepare

onnx_model = onnx.load("/content/best.onnx")  # load onnx model
tf_rep = prepare(onnx_model)  # prepare tf representation
tf_rep.export_graph("/content/output/best.pb")  # export the model

 

tf.lite를 이용해 .tflite 파일로 변환한다.

# pb to tflite
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

graph_def_file = "/content/output/best.pb"
input_arrays = ["images"]
output_arrays = ["output"]
tflite_file = "/content/output/best.tflite"

converter = tf.lite.TFLiteConverter.from_frozen_graph(graph_def_file, input_arrays, output_arrays)

tflite_model = converter.convert()

open(tflite_file, "wb").write(tflite_model)

 

끝!

 

 

 

 

출처 :  https://bekusib.tistory.com/210

반응형