# LiteRT 开发者工作流程

Source: [https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html](https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html)

您可以通过从开源社区下载现有的 LiteRT 模型来使用它。或者，您可以使用特定工具将 TensorFlow 或 Keras 模型转换为 LiteRT 格式。转换后，可以在设备上运行推理并为 LiteRT 模型开发定制的应用程序。

注释： 如果您使用来自 Qualcomm AI Hub 或其他来源的 LiteRT 模型，则可以跳过 LiteRT 开发者工作流中描述的任务。

在 Qualcomm 特定硬件上执行 LiteRT 模型涉及以下任务。

## 将 TensorFlow 模型转换为 LiteRT 模型

Source: [https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html](https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html)

您可以将 TensorFlow 模型转换为 LiteRT 模型，并对设备上推理对其进行优化。关于 LiteRT 模型转换的更多详细信息，请参阅 [Model conversion overview](https://ai.google.dev/edge/litert/models/convert)。

LiteRT 模型转换支持将模型转换为以下格式：

- 32 位浮点精度
- 16 位浮点精度
- UINT8/INT8 精度（量化模型）

### 使用现有的 LiteRT 模型

Source: [https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html](https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html)

可以使用 LiteRT 部署来自开源社区的现有LiteRT模型。

Qualcomm AI Hub 发布针对 Qualcomm Linux 开发套件优化的 LiteRT 模型。关于 Qualcomm 的 LiteRT 模型，请参阅 [Qualcomm AI Hub](https://aihub.qualcomm.com/)。

如需从 Qualcomm AI Hub 下载优化后的模型，可执行以下操作：

1. 前往 [AI Hub Model Zoo](https://aihub.qualcomm.com/iot/models)。
2. 在左侧窗格中，通过选择芯片组来筛选可用型号。
3. 选择一个模型。
4. 在下一页，选择 TorchScript &gt; TFLite 路径。
5. 点击 Download model。

注释： 下载的模型已经过预优化，可直接部署。

Figure : 在 Qualcomm AI Hub 上优化的 LiteRT 模型
            
            ![](data:image/png;base64,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)

### 将 TensorFlow 或 Keras 模型转换为 LiteRT 格式

Source: [https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html](https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html)

TensorFlow 框架提供 Python API 和命令行界面 (CLI) 工具，用于将 TensorFlow 或 Keras 模型转换为 LiteRT 格式。

Table : TensorFlow 模型转换方法

| 转换方法 | 说明 |
| --- | --- |
| Python API | 将模型转换、优化和量化为 LiteRT 格式 |
| CLI 工具 | 将模型转换为 LiteRT 格式，但仅适用于基本模型转换 |

注释： TensorFlow 到 LiteRT Python API 提供了更大的灵活性，可进行模型转换、优化和量化以满足您的要求。

### 使用 Python API 进行转换和量化

Source: [https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html](https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html)

TensorFlow 提供以下 API 将 TensorFlow SavedModel 或 Keras 模型转换为 LiteRT 模型。

Table : 用于转换模型的 TensorFlow Python API

| API | 说明 |
| --- | --- |
| tf.lite.TFLiteConverter.from\_saved\_model()（推荐） | 转换 TensorFlow SavedModel |
| tf.lite.TFLiteConverter.from\_keras\_model() | 转换 Keras 模型 |

### 转换 TensorFlow SavedModel（推荐）

以下示例展示了如何将以 saved\_model 格式保存的 TensorFlow 模型转换为 LiteRT 模型：

    import tensorflow as tf
    
    # Convert the model
    saved_model_dir = "/path/to/tf/model/in/saved_model/format"
    converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
    tflite_model = converter.convert()
    
    # Save the model
    with open("model.tflite", "wb") as f:
        f.write(tflite_model)
    Copy to clipboard

注释： 转换后的 LiteRT 模型未进行量化，其数据为 32 位浮点精度。

### 转换 Keras 模型

以下示例展示了如何将 Keras 模型转换为 LiteRT 模型：

    import tensorflow as tf
    
    # Create a model using high-level tf.keras.* APIs
    model = tf.keras.models.Sequential([
        tf.keras.layers.Dense(units=1, input_shape=[1]),
        tf.keras.layers.Dense(units=16, activation='relu'),
        tf.keras.layers.Dense(units=1)
    ])
    
    # compile the model
    model.compile(optimizer='sgd', loss='mean_squared_error')
    
    # train the model
    model.fit(x=[-1, 0, 1], y=[-3, -1, 1], epochs=5)
    
    # Convert the model to LiteRT
    converter = tf.lite.TFLiteConverter.from_keras_model(model)
    tflite_model = converter.convert()
    
    # Save the model
    with open('model.tflite', 'wb') as f:
        f.write(tflite_model)
    Copy to clipboard

注释： 转换后的 LiteRT 模型未进行量化，其数据为 32 位浮点精度。

### 量化模型

将模型转换为 LiteRT 格式后，您可以对其进行量化。神经网络模型中的量化涉及以下步骤：

1. 量化权重和偏差：这些已经是训练模型的一部分，无需额外信息即可进行量化。因此，权重和偏置的量化是一个静态步骤。
2. 量化激活层：激活层输出的范围取决于前向传播期间的输入图像。因此，需要一组样本输入（称为校准或代表性数据集）来量化这些层并确定最小/最大范围

为了将TensorFlow浮点模型处理为量化的 LiteRT 模型，LiteRT 提供了训练后量化技术。有关详细信息，参见[训练后量化](https://ai.google.dev/edge/litert/models/post_training_quantization)。

### 训练后量化

LiteRT 支持两种类型的训练后量化：

- 训练后动态范围量化
- 训练后全整数量化

### 训练后动态范围量化

在训练后动态范围量化中，权重和偏差从浮点精度静态量化为定点整数 8 位精度。激活层范围保持 32 位浮点精度。

为了减少推理过程中的延迟，动态范围运算符执行以下操作：

- 根据激活的范围将其量化为定点整数 8 位精度
- 使用 8 位权重和激活执行计算

注释： 由于仅量化了权重，因此该步骤不需要额外的校准数据。

以下脚本将 TensorFlow 模型转换并量化为 LiteRT 模型：

    import tensorflow as tf
    from tensorflow import keras
      
    converter = tf.lite.TFLiteConverter.from_saved_model(exp_model_path)
    converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS]
    converter.optimizations = [tf.lite.Optimize.DEFAULT]
      
    tflite_model = converter.convert()
    save_name = 'quantized_model.tflite'
     
    print('Saving Dynamic Quantized LiteRT model ..................')
      
    with open(save_name, 'wb') as f:
        f.write(tflite_model)
    Copy to clipboard

### 训练后全整数量化

在全整数量化中，使用代表性数据集对模型内的激活层进行量化。

以下脚本将 TensorFlow 模型转换并量化为 LiteRT 模型。该脚本生成了一个全整数量化模型，更适合定点整数硬件，例如 Qualcomm Linux 开发套件上的 Hexagon Tensor Processor。

    import tensorflow as tf
      
    def representative_dataset():
        for data in dataset:
            yield {
                "image": data.image,
                "bias": data.bias,
            }
    saved_model_dir = "/path/to/saved/model"
      
    # prepare converter by loading model in saved_model format.
    converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
    converter.optimizations = [tf.lite.Optimize.DEFAULT]
    
    # Set representative dataset used for quantization.
    converter.representative_dataset = representative_dataset
    
    # For full-integer quantization, set target_spec supported_ops to TFLITE_BUILTINS_INT8.
    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
    
    # Convert model
    tflite_quant_model = converter.convert()
    save_name = 'quantized_model_int8.tflite'
     
    print('Saving Quantized LiteRT model ..................')
      
    with open(save_name, 'wb') as f:
        f.write(tflite_model)
    Copy to clipboard

注释： 将转换器 `target_spec` 中的 `supported_ops` 设置为 `tf.lite.OpsSet.TFLITE_BUILTINS_INT8`。

### 使用离线转换工具 (CLI) 进行转换

Source: [https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html](https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html)

tflite\_convert TensorFlow Lite 转换器工具被包含在 TensorFlow pip 包中，可在 TensorFlow 版本 2.x 及以上版本中离线使用。

Tflite\_convert 工具在 CLI 中接受以下输入：

    tflite_convert --help
    
    optional arguments:
      -h, --help            show this help message and exit
      --output_file OUTPUT_FILE
                            Full filepath of the output file.
      --saved_model_dir SAVED_MODEL_DIR
                            Full path of the directory containing the SavedModel.
      --keras_model_file KERAS_MODEL_FILE
                            Full filepath of HDF5 file containing tf.Keras model.
      --saved_model_tag_set SAVED_MODEL_TAG_SET
                            Comma-separated set of tags identifying the MetaGraphDef within the SavedModel to analyze. All tags must be present. To pass in an empty
                            tag set, pass in "". (default "serve")
      --saved_model_signature_key SAVED_MODEL_SIGNATURE_KEY
                            Key identifying the SignatureDef containing inputs and outputs. (default DEFAULT_SERVING_SIGNATURE_DEF_KEY)
      --enable_v1_converter
                            Enables the TensorFlow V1 converter in 2.0
    Copy to clipboard

### 转换 SavedModel

要使用 tflite\_convert工具转换以 saved\_model 格式的典型 TensorFlow 模型，运行以下命令：

    tflite_convert \    --saved_model_dir=/tmp/mobilenet_saved_model \    --output_file=/tmp/mobilenet.tflite \  --saved_model_tag_set=serve \
             --saved_model_signature_key="serving_default"
    Copy to clipboard

### 转换 Keras H5 模型

要使用 tflite\_convert 工具转换 Keras 模型，运行以下命令：

    tflite_convert \
      --keras_model_file=/tmp/mobilenet_keras_model.h5 \
      --output_file=/tmp/mobilenet.tflite
    Copy to clipboard

注释： tflite\_convert 工具仅适用于基本用途。关于训练后整数量化，建议使用Python API。

## 创建应用程序并运行推理

Source: [https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html](https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html)

可以使用 LiteRT C++ API创建应用程序、加载LiteRT 模型并使用 delegate 在硬件上执行该模型。

通常，使用 C++ API 创建的应用程序运行 LiteRT 模型涉及以下步骤：

Figure : 创建应用程序并运行 LiteRT 模型的工作流程
            
            <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export tensorflow-lite-model-application-flow.svg tensorflow-lite-model-application-flow -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="12.2639in" height="1.1944in" viewbox="0 0 883.001 85.9968" xml:space="preserve" color-interpolation-filters="sRGB" class="st8"><v:documentproperties v:langid="1033">	<v:userdefs>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-1 .st1 { fill: #f7f8fa; stroke: #f7f8fa; stroke-linecap: butt; stroke-width: 0.999996 }
.svg-1 .st2 { fill: none; stroke: #3253dc; stroke-linecap: butt; stroke-width: 0.999996 }
.svg-1 .st3 { fill: #000000; font-family: Microsoft YaHei; font-size: 0.833336em }
.svg-1 .st4 { font-family: Arial; font-size: 1em }
.svg-1 .st5 { font-size: 1em }
.svg-1 .st6 { marker-end: url("#mrkr4-30"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.999996 }
.svg-1 .st7 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.28409015231517 }
.svg-1 .st8 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="mrkr4-30" class="st7" v:arrowtype="4" v:arrowsize="2" v:setback="0" refx="-0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-3.5200093767791,-3.5200093767791) "></use>	</marker></defs><g v:mid="4" v:index="2" v:groupcontext="foregroundPage">	<title>tensorflow-lite-model-application-flow</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="19" v:shadowoffsetx="8.99997" v:shadowoffsety="-8.99997"></v:pageproperties>	<v:layer v:name="Connector" v:index="0"></v:layer>	<g id="shape1-1" v:mid="1" v:groupcontext="shape" transform="translate(18,-18)">		<title>shape13-1</title>		<rect x="0" y="35.997" width="846.997" height="49.9998" class="st1"></rect>	</g>	<g id="shape2-3" v:mid="2" v:groupcontext="shape" transform="translate(19.5,-19.75)">		<title>shape3-3</title>		<desc>Load a LiteRT model</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7469" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.497" width="141.999" height="46.4998" class="st2"></rect>		<text x="33.49" y="65.79" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>加载<tspan class="st4"> </tspan><tspan class="st4">LiteRT </tspan>模型</text>		</g>	<g id="shape3-8" v:mid="3" v:groupcontext="shape" transform="translate(194.999,-19.75)">		<title>shape5-6</title>		<desc>Create a LiteRT interpreter</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7469" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.497" width="141.999" height="46.4998" class="st2"></rect>		<text x="33.49" y="65.79" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>创建<tspan class="st4"> </tspan><tspan class="st4">LiteRT </tspan>解释</text>		</g>	<g id="shape4-13" v:mid="4" v:groupcontext="shape" transform="translate(370.499,-19.75)">		<title>shape6-9</title>		<desc>Prepare a model with a chosen delegate</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7469" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.497" width="141.999" height="46.4998" class="st2"></rect>		<text x="25.42" y="59.71" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>使用选定的<tspan class="st4"> </tspan><tspan class="st4">delegate<v:lf></v:lf></tspan><tspan x="36" dy="1.216em" class="st5">来准备一个模型</tspan></text>		</g>	<g id="shape5-19" v:mid="5" v:groupcontext="shape" transform="translate(545.998,-19.75)">		<title>shape7-13</title>		<desc>Prepare input/output buffers</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7469" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.497" width="141.999" height="46.4998" class="st2"></rect>		<text x="28.86" y="65.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>准备输入/输出缓存</text>		</g>	<g id="shape6-22" v:mid="6" v:groupcontext="shape" transform="translate(721.497,-19.75)">		<title>shape8-16</title>		<desc>Run a model</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7469" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.497" width="141.999" height="46.4998" class="st2"></rect>		<text x="51" y="65.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>运行模型</text>		</g>	<g id="shape7-25" v:mid="7" v:groupcontext="shape" v:layermember="0" transform="translate(161.499,-42.9999)">		<title>Dynamic connector</title>		<path d="M0 86 L26.46 86 L33.5 86" class="st6"></path>	</g>	<g id="shape8-31" v:mid="8" v:groupcontext="shape" v:layermember="0" transform="translate(336.999,-42.9999)">		<title>Dynamic connector.10</title>		<path d="M0 86 L26.46 86 L33.5 86" class="st6"></path>	</g>	<g id="shape9-36" v:mid="9" v:groupcontext="shape" v:layermember="0" transform="translate(512.498,-42.9999)">		<title>Dynamic connector.11</title>		<path d="M0 86 L26.46 86 L33.5 86" class="st6"></path>	</g>	<g id="shape10-41" v:mid="10" v:groupcontext="shape" v:layermember="0" transform="translate(687.998,-42.9999)">		<title>Dynamic connector.12</title>		<path d="M0 86 L26.46 86 L33.5 86" class="st6"></path>	</g></g>
</svg>

### 加载 LiteRT 模型

Source: [https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html](https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html)

LiteRT 模型是一个 FlatBuffers 文件，其中包含关于模型运算符以及任何相关权重和偏差的信息。

FlatBuffers 文件包括以下内容：

- 张量（每个算子的输入和输出）
- 缓存（权重和偏差）
- 创建执行图的算子

LiteRT 框架提供了执行以下内容的 API：

- 加载 LiteRT 模型文件
- 将 FlatBuffers 文件的所有内容解压至内存中

可以使用以下 API 加载 LiteRT 模型进行推理：

    include <cstdio>
    include <iostream>
    include "tensorflow/lite/interpreter.h"
    include "tensorflow/lite/kernels/register.h"
    include "tensorflow/lite/model.h"
    include "tensorflow/lite/optional_debug_tools.h"
      
    std::unique_ptr<tflite::FlatBufferModel> model;
    
    model = tflite::FlatBufferModel::BuildFromFile(model_name.c_str());
    if (!model) {
      std::cerr << "Failed to mmap model " << model_name << std::endl;
      exit(-1);
    }
    Copy to clipboard

### 创建 LiteRT 解释器

Source: [https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html](https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html)

使用 TensorFlow C/C++ API，可编译一个解析器来运行模型。

解析器界面可帮助您执行以下操作：

- 在选定的 delegate 上配置模型执行方法。
- 分配前向传播所需的内存。

以下示例代码演示了如何创建解析器。可配置解析器实例以使用特定的 delegate 并执行前向传播。

    //Build the interpreter with the InterpreterBuilder.
    //Note: all Interpreters should be built with the InterpreterBuilder,
    // which allocates memory for the Interpreter and does various set up
    // tasks so that the Interpreter can read the provided model.
      
    tflite::ops::builtin::BuiltinOpResolver resolver;
    tflite::InterpreterBuilder builder(*model, resolver);
    std::unique_ptr<tflite::Interpreter> interpreter;
    builder(&interpreter);
    if (!interpreter) {
       std::cerr << "Failed to construct interpreter on provided tflite model" << std::endl;
    }
    if (interpreter->AllocateTensors() != kTfLiteOk) {
       std::cerr <<  "Failed to allocate tensors!" << std::endl;
       exit(-1);
    }
    Copy to clipboard

### 用选定的 delegate 准备一个模型

Source: [https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html](https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html)

创建解析器并分配运行模型所需的内存后，使用选定的 delegate 准备模型。此步骤根据之前加载的模型创建执行图，并使用底层库在 delegate 硬件上执行推理。

以下示例代码创建 XNNPACK Delegate，用于在 Arm CPU 上运行 LiteRT 模型。通过调用 `TfLiteXNNPackDelegateCreate(…)` API 创建 delegate。您还可以使用 delegate 选项 API 自定义 delegate。

    TfLiteDelegate *delegate = NULL;
    TfLiteXNNPackDelegateOptions xnnpack_options =
    TfLiteXNNPackDelegateOptionsDefault();
    xnnpack_options.num_threads = num_threads;
      
    TfLiteDelegate* xnnpack_delegate =
    TfLiteXNNPackDelegateCreate(&xnnpack_options);
    if (interpreter->ModifyGraphWithDelegate(xnnpack_delegate) != kTfLiteOk) {
      // Report error and fall back to another delegate, or the default backend
    }
    Copy to clipboard

### 准备输入/输出缓冲区

Source: [https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html](https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html)

构建独立的 LiteRT 应用程序时，必须为执行 LiteRT 模型的 pipeline 准备输入数据（例如摄像头帧）。

例如，在以下情况下，预处理操作对于确保推理正确完成非常重要：

- 将输入图像调整为模型期望的分辨率
- 归一化
- 均值减法

### 运行模型

Source: [https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html](https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html)

您必须使用 `Invoke()` API 调用 delegate，以便对模型运行推理。在调用此 API 之前，创建适当的输入/输出缓冲区并将其提供给解析器。

推理完成后，您可以解析由解释器缓存的输出，生成推理结果。

使用 delegate 执行模型的 `Invoke()` API 示例如下：

    // Run Inference 
    interpreter->Invoke()
    Copy to clipboard

推理完成后，您可以在解释器的输出缓冲区中找到LiteRT `Invoke()` API 的输出张量。要对这些输出执行进一步的后处理，可以从解析器中进行解析。

有关综合示例，请参见 [TensorFlow GitHub 存储库](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/examples/label_image)中的 label\_image 示例。

关于更多信息，请参阅 [LiteRT 文档](https://ai.google.dev/edge/litert)。

## 开发定制的应用程序

Source: [https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html](https://docs.qualcomm.com/doc/80-70017-54SC/topic/tensorflow-lite-developer-workflow.html)

IM SDK提供了基于qtimltflite GStreamer 、用于执行 LiteRT 模型推理的插件，以便提升开发者体验。

有关更多信息，请参见以下内容：

- [IM SDK](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-50/overview.html) 文档
- [qtimltflite](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-50/qtimltflite.html) 插件文档
- [开发您自己的应用程序](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-15B/develop-your-own-application.html)

Last Published: Jan 24, 2025

[Previous Topic
LiteRT 架构](https://docs.qualcomm.com/bundle/publicresource/80-70017-54SC/topics/arch.md) [Next Topic
示例程序](https://docs.qualcomm.com/bundle/publicresource/80-70017-54SC/topics/sample-applications.md)