一、TFLite转换

1、运行环境

TF_2.3.0

2、转换器功能说明

  • 支持TF 1.X、TF 2.X版本的SavedModel、Keras、concrete function
  • 支持TF 1.X Frozen Graph tf.compat.v1.lite.TFLiteConverter
  • 支持量化感知训练(QAT)模型转换,待转换的模型格式Keras
  • 支持训练后训练转换:动态量化、全整量化、float16量化、16x8量化

QAT版本要求:TensorFlow Version 2.3.0,TensorFlow-Model-Optimization Version 0.4.1; 训练后量化16x8模式,实验性16-bit激活+8-bit权重量化,可能暂时还不支持部署;

参考链接

[1]. TFLite 8-bit量化规范参考

[2]. TFLite指南

[3]. TensorFlow 模型优化指南

3、转换器脚本说明

  1. ## 传参说明
  2. --SavedModel # SavedModel Path
  3. --KerasModel # Keras Model(.h5) Path
  4. --ConcreteFuncs # concrete function 目前还没使用过...
  5. --FrozenModel # Frozen Graph Model Path
  6. --post_training_quantization # 训练后量化模式,‘dynamic_range’、‘full_integer’、‘float16’、‘16x8’;默认False模式,执行Float32格式转换
  7. --QAT # 待转换的模型是否是QAT模型,默认False
  8. --input_shapes # 列表,输入张量维度;转换SavedModel时若需要指定输入向量维度,需要此参数;转换FrozenModel时,需要此参数;默认None
  9. --data_path # 全整量化模式下,representative_dataset path,参考数量100-1000
  10. --network_shape # 列表,模型维度
  11. --input_arrays # 输入张量结点名称,默认None,转换FrozenModel时需要
  12. --output_arrays # 输出张量结点名称,默认None,转换FrozenModel时需要
  13. --tflite_path # tflite模型文件名
  14. ## 函数说明
  15. # 转换函数
  16. def convert_func(self):
  17. # SavedModel
  18. if self.SavedModel:
  19. if not self.input_shapes:
  20. # 不支持指定输入向量维度
  21. converter = tf.lite.TFLiteConverter.from_saved_model(self.SavedModel)
  22. else:
  23. model = tf.saved_model.load(self.SavedModel)
  24. # DEFAULT_SERVING_SIGNATURE_DEF_KEY = 'serving_default'
  25. concrete_func = model.signatures[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
  26. concrete_func.inputs[0].set_shape([self.input_shapes[0], self.input_shapes[2],
  27. self.input_shapes[3], self.input_shapes[1]])
  28. converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func])
  29. # KerasModel
  30. if self.KerasModel:
  31. if not self.QAT:
  32. model = tf.keras.models.load_model(self.KerasModel)
  33. converter = tf.lite.TFLiteConverter.from_keras_model(model)
  34. else:
  35. # 转换QAT模型,需要添加tfmot.quantization.keras.quantize_scope(),用于解决QAT模型
  36. with tfmot.quantization.keras.quantize_scope():
  37. model = tf.keras.models.load_model(self.KerasModel)
  38. converter = tf.lite.TFLiteConverter.from_keras_model(model)
  39. # ConcreteFuncs
  40. if self.ConcreteFuncs:
  41. # 目前仅支持每次调用时仅接受一个concrete function
  42. converter = tf.lite.TFLiteConverter.from_concrete_functions([self.ConcreteFuncs])
  43. # FrozenModel
  44. if self.FrozenModel:
  45. # Converting a GraphDef from file.
  46. converter = tf.compat.v1.TFLiteConverter.from_frozen_graph(self.FrozenModel,
  47. self.input_arrays,
  48. self.output_arrays,
  49. self.input_shapes)
  50. # 量化处理
  51. def quan_process(self, converter):
  52. # representative_dataset数据预处理部分,需要与模型预处理方法一致
  53. def pre_process(self, img_path):

二、TFLite部署

1、环境配置

2、步骤

2.1 编写TFLite Inference C++代码

参考Tflitewrapper代码。TFLite Inference API参考网址,python版仅用于验证,TensorFlow源码例程TensorFlow-2.3.0/tensorflow/lite/examples/label_image

2.2 Bazel编译

  • Ubuntu本地编译
  • Arm64编译
  • Arm32编译

2.3 Adb push

  1. # Enter Phone
  2. adb root
  3. adb shell
  4. # push 手机端
  5. adb push xx.tflite /data/local/tmp
  6. adb push demo /data/local/tmp
  7. adb push libTfliteWrapper.so /data/local/tmp

2.4 Execution

  1. # 路径
  2. export path
  3. # 执行
  4. ./demo

2.5 adb pull

  1. # 将输出pull 本地
  2. adb pull xx path