移动端深度学习部署:TFlite

TFlite是谷歌为移动端设计的轻量级推理库,它通过Flatbuffer序列化减少磁盘占用,支持模型量化、剪枝等优化,提升效率。文章介绍了TFlite的模型转换方法,包括训练后动态量化、float16和int8量化。同时,详述了在Android端如何调用TFlite模型进行推理,并提供了AndroidStudio中导入和使用TFlite模型的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.TFlite介绍

1TFlite概念

  • tflite是谷歌自己的一个轻量级推理库。主要用于移动端。
  • tflite使用的思路主要是从预训练的模型转换为tflite模型文件,拿到移动端部署。
  • tflite的源模型可以来自tensorflowsaved model或者frozen model,也可以来自keras

2TFlite优点

用Flatbuffer序列化模型文件,这种格式磁盘占用少,加载快

可以对模型进行量化,把float参数量化为uint8类型,模型文件更小、计算更快。

可以对模型进行剪枝、结构合并和蒸馏。

对NNAPI的支持。可调用安卓底层的接口,把异构的计算能力利用起来。

3TFlite量化

a.量化的好处        

  • 较小的存储大小:小模型在用户设备上占用的存储空间更少。例如,一个使用小模型的 Android 应用在用户的移动设备上会占用更少的存储空间。
  • 较小的下载大小:小模型下载到用户设备所需的时间和带宽较少。
  • 更少的内存用量:小模型在运行时使用的内存更少,从而释放内存供应用的其他部分使用,并可以转化为更好的性能和稳定性。

b.量化的过程

        tflite的量化并不是全程使用uint8计算。而是存储每层的最大和最小值,然后把这个区间线性分成 256 个离散值,于是此范围内的每个浮点数可以用八位 (二进制) 整数来表示,近似为离得最近的那个离散值。比如,最小值是 -3 而最大值是 6 的情形,0 字节表示 -3,255 表示 6,而 128 是 1.5。每个操作都先用整形计算,输出时重新转换为浮点型。下图是量化Relu的示意图。

Tensorflow官方量化文档

c.量化的实现

训练后动态量化

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
#converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]
tflite_model1 = converter.convert()
open("xxx.tflite", "wb").write(tflite_model1)

训练后float16量化

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.float16]
tflite_quant_model = converter.convert()
tflite_model1 = converter.convert()
open("xxx.tflite", "wb").write(tflite_model1)

训练后int8量化

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
def representative_dataset_gen():
  for _ in range(num_calibration_steps):
    # Get sample input data as a numpy array in a method of your choosing.
    yield [input]
converter.representative_dataset = representative_dataset_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8  # or tf.uint8
tflite_model1 = converter.convert()
open("xxx.tflite", "wb").write(tflite_model1)

注:float32和float16量化可以运行再GPU上,int8量化只能运行再CPU上

2.TFlite模型转换

1)在训练的时候就保存tflite模型

import tensorflow as tf
img = tf.placeholder(name="img", dtype=tf.float32, shape=(1, 64, 64, 3))
val = img + tf.constant([1., 2., 3.]) + tf.constant([1., 4., 4.])
out = tf.identity(val, name="out")
with tf.Session() as sess:
  tflite_model = tf.lite.toco_convert(sess.graph_def, [img], [out])
  open("converteds_model.tflite", "wb").write(tflite_model)

2)使用其他格式的TensorFlow模型转换成tflite模型

        首先要安装Bazel,参考:https://docs.bazel.build/versions/master/install-ubuntu.html ,只需要完成Installing using binary installer这一部分即可。然后克隆TensorFlow的源码:

git clone https://github.com/tensorflow/tensorflow.git

        接着编译转换工具,这个编译时间可能比较长:

cd tensorflow/
bazel build tensorflow/python/tools:freeze_graph
bazel build tensorflow/lite/toco:toco

        获得到转换工具之后,开始转换模型,以下操作是冻结图:

  • input_graph对应的是.pb文件;
  • input_checkpoint对应mobilenet_v1_1.0_224.ckpt.data-00000-of-00001,使用时去掉后缀名。
  • output_node_names这个可以在mobilenet_v1_1.0_224_info.txt中获取。

./freeze_graph --input_graph=/mobilenet_v1_1.0_224/mobilenet_v1_1.0_224_frozen.pb \
  --input_checkpoint=/mobilenet_v1_1.0_224/mobilenet_v1_1.0_224.ckpt \
  --input_binary=true \
  --output_graph=/tmp/frozen_mobilenet_v1_224.pb \
  --output_node_names=MobilenetV1/Predictions/Reshape_1

将冻结的图转换成tflite模型:

  • input_file是已经冻结的图;
  • output_file是转换后输出的路径;
  • output_arrays这个可以在mobilenet_v1_1.0_224_info.txt中获取;
  • input_shapes这个是预测数据的shape

./toco --input_file=/tmp/mobilenet_v1_1.0_224_frozen.pb \
  --input_format=TENSORFLOW_GRAPHDEF \
  --output_format=TFLITE \
  --output_file=/tmp/mobilenet_v1_1.0_224.tflite \
  --inference_type=FLOAT \
  --input_type=FLOAT \
  --input_arrays=input \
  --output_arrays=MobilenetV1/Predictions/Reshape_1 \
  --input_shapes=1,224,224,3

3)使用检查点进行模型转换

  • 将tensorflow模型保存成.pb文件

import tensorflow as tf
from tensorflow.python.framework import graph_util
from tensorflow.python.platform import gfile
 
if __name__ == "__main__":
    a = tf.Variable(tf.constant(5.,shape=[1]),name="a")
    b = tf.Variable(tf.constant(6.,shape=[1]),name="b")
    c = a + b
    init = tf.initialize_all_variables()
    sess = tf.Session()
    sess.run(init)
    #导出当前计算图的GraphDef部分
    graph_def = tf.get_default_graph().as_graph_def()
    #保存指定的节点,并将节点值保存为常数
    output_graph_def = graph_util.convert_variables_to_constants(sess,graph_def,['add'])
    #将计算图写入到模型文件中
    model_f = tf.gfile.GFile("model.pb","wb")
    model_f.write(output_graph_def.SerializeToString())

  • 模型文件的读取

Bash
 sess = tf.Session()
    #将保存的模型文件解析为GraphDef
    model_f = gfile.FastGFile("model.pb",'rb')
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(model_f.read())
    c = tf.import_graph_def(graph_def,return_elements=["add:0"])
    print(sess.run(c))
    #[array([ 11.], dtype=float32)]

  • pb文件转tflite

Python
import tensorflow as tf
 
in_path=r'D:\tmp_mobilenet_v1_100_224_classification_3\output_graph.pb'
out_path=r'D:\tmp_mobilenet_v1_100_224_classification_3\output_graph.tflite'
 
input_tensor_name=['Placeholder']
input_tensor_shape={'Placeholder':[1,224,224,3]}
 
class_tensor_name=['final_result']
 
convertr=tf.lite.TFLiteConverter.from_frozen_graph(in_path,input_arrays=input_tensor_name
                                                   ,output_arrays=class_tensor_name
                                                   ,input_shapes=input_tensor_shape)
 
# convertr=tf.lite.TFLiteConverter.from_saved_model(saved_model_dir=in_path,input_arrays=[input_tensor_name],output_arrays=[class_tensor_name])
tflite_model=convertr.convert()
 
with open(out_path,'wb') as f:
    f.write(tflite_model)

3.Android端调用TFlite模型文件

1Android studio中调用TFlite模型实现推理的流程

  • 定义一个interpreter
  • 初始化interpreter(加载tflite模型)
  • 在Android中加载图片到buffer中
  • 用解释器执行图形(推理)
  • 将推理的结果在app中进行显示

2)在Android Studio中导入TFLite模型步骤

  • 新建或打开现有Android项目工程。
  • 通过菜单项 File > New > Other > TensorFlow Lite Model 打开TFLite模型导入对话框。
  • 选择后缀名为.tflite的模型文件。模型文件可以从网上下载或自行训练。
  • 导入的.tflite模型文件位于工程的 ml/ 文件夹下面。

模型主要包括如下三种信息:

  • 模型:包括模型名称、描述、版本、作者等等。
  • 张量:输入和输出张量。比如图片需要预先处理成合适的尺寸,才能进行推理。

06-20
### TensorFlow Lite 使用指南与教程 TensorFlow Lite 是一种轻量级解决方案,专为在移动设备和嵌入式系统上运行机器学习模型而设计。以下是关于 TensorFlow Lite 的使用指南和教程的详细信息: #### 1. TensorFlow Lite 官方入门指南 官方提供了详细的入门教程,帮助开发者了解 TensorFlow Lite 的基本使用流程[^1]。访问 TensorFlow Lite 的官方文档,可以找到以下资源: - **入门教程**:涵盖了 TensorFlow Lite 的基本概念、模型转换和推理过程。 - **快速入门**:针对 Android 和 iOS 开发者分别提供了快速上手指南。 - **微控制器支持**:介绍了如何在微控制器上部署 TensorFlow Lite 模型。 #### 2. TensorflowLite-bin 项目结构与启动文件介绍 对于需要直接使用 TensorFlow Lite 二进制文件的开发者,`TensorflowLite-bin` 项目提供了一个清晰的目录结构和脚本支持[^2]: - **目录结构**: - `LICENSE`: 许可证文件。 - `README.md`: 项目的基本信息和使用方法。 - `install_script.sh`: 快速部署和运行 TensorFlow Lite 模型的安装脚本。 - `releases/`: 预构建的 TensorFlow Lite 二进制文件。 - `scripts/`: 构建 TensorFlow Lite 的脚本。 - `src/`: TensorFlow Lite 运行时的源代码。 - **启动文件**: - `interpreter.py`: TensorFlow Lite 解释器的核心实现,用于加载和运行模型。 #### 3. TensorFlow Lite 在 Android 上的应用实践 对于 Android 开发者,TensorFlow Lite 提供了专门的教程,指导如何将模型集成到应用中[^3]: - **图像处理示例**:将 Android 控件中的图像转换为模型所需的格式(如 224 × 224 像素的三通道图像),并进行归一化处理。 - **代码示例**: ```java // 加载 TensorFlow Lite 模型 try (Interpreter tflite = new Interpreter(loadModelFile())) { // 准备输入数据 float[][][] input = preprocessImage(image); // 运行推理 float[][] output = new float[1][NUM_CLASSES]; tflite.run(input, output); // 处理输出结果 processOutput(output); } ``` - **依赖项添加**: 在 `build.gradle` 文件中添加以下依赖项: ```gradle implementation 'org.tensorflow:tensorflow-lite:2.15.0' ``` #### 4. TensorFlow Lite 示例应用 官方提供了多个示例应用,涵盖图像分类、对象检测、语音识别等领域。通过这些示例,开发者可以快速了解如何在实际场景中使用 TensorFlow Lite。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIGC Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值