# TensorFlow Lite developer workflow

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

You can use an existing TensorFlow Lite model by downloading it from the open-source
        community. Alternatively, you can convert a TensorFlow or Keras model to the TensorFlow Lite
        format using specific tools. You can then run inference on a device and develop a custom
        application for the TensorFlow Lite model.

Note: If you are using TensorFlow Lite models from Qualcomm AI Hub or
            other sources, you may skip the tasks described in the TensorFlow Lite developer
            workflow.

Executing a TensorFlow Lite model on Qualcomm-specific hardware involves the following
            tasks.

## Convert a TensorFlow model to a TensorFlow Lite model

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

You can convert TensorFlow models to TensorFlow Lite models and optimize them for
        on-device inference purposes. For more details on TensorFlow Lite model conversion, see
            [Model conversion overview](https://www.tensorflow.org/lite/models/convert).

TensorFlow Lite model conversion supports converting models to the following formats:

- 32‑bit floating-point precision
- 16‑bit floating-point precision
- UINT8/INT8 precision (quantizing models)

### Use an existing TensorFlow Lite model

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

You can deploy an existing TensorFlow Lite model available in the open-source
        community using TensorFlow Lite Runtime.

Qualcomm AI Hub publishes TensorFlow Lite models optimized to run on the Qualcomm Linux
            Development Kit. For TensorFlow Lite models from Qualcomm, see [Qualcomm AI
                Hub](https://aihub.qualcomm.com/).

To download an optimized model from Qualcomm AI Hub, do the following:

1. Go to [AI Hub Model Zoo](https://aihub.qualcomm.com/iot/models).
2. To filter the available models by chipset, select a chipset in the left pane.
3. Select a model.
4. On the next page, select the TorchScript
                &gt;
                TFLite path.
5. Click Download model.

Note: The downloaded model is pre-optimized and ready for
            deployment.

Figure : Optimized TensorFlow Lite model on Qualcomm AI Hub
            
            ![](data:image/png;base64,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)

### Convert a TensorFlow or Keras model to the TensorFlow Lite format

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

The TensorFlow framework provides Python APIs and a command-line interface (CLI) tool
        to convert a TensorFlow or Keras model to the TensorFlow Lite format.

Table : TensorFlow model conversion methods

| Conversion method | Description |
| --- | --- |
| Python APIs | Converts, optimizes, and quantizes models to the TensorFlow Lite<br>                            format |
| CLI tool | Converts models to the TensorFlow Lite format, but it is suitable for<br>                            basic model conversion only |

Note: TensorFlow to TensorFlow Lite Python APIs offer more flexibility
            to convert, optimize, and quantize models to suit your requirements.

### Convert and quantize using Python APIs

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

TensorFlow offers the following APIs to convert a TensorFlow SavedModel or a Keras
        model to a TensorFlow Lite model:

Table : TensorFlow Python APIs to convert models

| API | Description |
| --- | --- |
| tf.lite.TFLiteConverter.from\_saved\_model() (recommended) | Converts a TensorFlow SavedModel |
| tf.lite.TFLiteConverter.from\_keras\_model() | Converts a Keras model |

### Convert a TensorFlow SavedModel (recommended)

The following example shows how to convert a TensorFlow model saved in the
                saved\_model format to a TensorFlow Lite model:

    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

Note: The converted TensorFlow Lite model is not quantized and its
                data is in 32‑bit floating-point precision.

### Convert a Keras model

The following example shows how to convert a Keras model to a TensorFlow Lite
                model:

    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 TFLite
    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

Note: The converted TensorFlow Lite model is not quantized and its
                data is in 32‑bit floating-point precision.

### Quantize models

After converting a model to the TensorFlow Lite format, you can quantize it.
                Quantization in neural network models involves the following steps:

1. Quantize weights and biases: Weights and biases are already part of the trained
                    model and can be quantized without additional information. Hence, quantizing
                    weights and biases is a static step.
2. Quantize activation layers: Ranges for the activation layer output depend on the
                    input image during forward propagation. Therefore, a set of sample inputs are
                    required to quantize these layers and identify the minimum/maximum ranges. Such
                    sample inputs are called calibration/representative data set.

To quantize a TensorFlow floating-point model to a quantized TensorFlow Lite model,
                the TensorFlow Lite model provides posttraining quantization techniques. For more
                information, see [Posttraining quantization](https://www.tensorflow.org/lite/performance/post_training_quantization).

### Posttraining quantization

TensorFlow Lite supports two types of posttraining quantizations:

- Posttraining dynamic range quantization
- Posttraining full-integer quantization

### Posttraining dynamic range quantization

In posttraining dynamic range quantization, weights and biases are quantized
                statically from floating-point precision to fixed-point integer 8‑bit precision. The
                activation layer ranges remain in 32‑bit floating-point precision.

To reduce latencies during inference, dynamic-range operators do the following:

- Quantize activations based on their ranges to fixed-point integer 8‑bit
                    precision
- Perform a computation with 8‑bit weights and activations

Note: No additional calibration data is needed in this step
                because only weights are quantized.

The following script converts and quantizes a TensorFlow model to a TensorFlow Lite
                model:

    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 TFLite model ..................')
      
    with open(save_name, 'wb') as f:
        f.write(tflite_model)
    Copy to clipboard

### Posttraining full-integer quantization

In full-integer quantization, a representative data set is used to perform
                quantization for activation layers within the model.

The following script converts and quantizes a TensorFlow model to a TensorFlow Lite
                model. It generates a full-integer quantized model that is more suitable for a
                fixed-point integer hardware such as the Hexagon Tensor Processor on the Qualcomm
                Linux Development Kit.

    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 TFLite model ..................')
      
    with open(save_name, 'wb') as f:
        f.write(tflite_model)
    Copy to clipboard

Note: `supported_ops` in converter
                    `target_spec` is set to
                    `tf.lite.OpsSet.TFLITE_BUILTINS_INT8`.

### Convert using offline converter tool (CLI)

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

The tflite\_convert TensorFlow Lite converter tool comes with the TensorFlow pip
        package and can be used offline for TensorFlow versions 2.x and later.

The tflite\_convert tool accepts the following input in the 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

### Convert a SavedModel

To convert a typical TensorFlow model contained in the saved\_model format using the
                tflite\_convert tool, run the following command:

    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

### Convert a Keras H5 model

To convert a Keras model using the tflite\_convert tool, run the following
                command:

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

Note: The tflite\_convert tool is for basic purposes only. Python
                APIs are recommended for posttraining integer quantization.

## Create an application and run inference

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

You can use the TensorFlow Lite C++ APIs to create an application, load a TensorFlow
        Lite model, and execute the model on hardware using delegates.

A typical application created using C++ APIs to run a TensorFlow Lite model involves the
            following steps:

Figure : Workflow to create an application and run a TensorFlow Lite model
            
            <?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 Page-1 -->
<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.19444in" viewbox="0 0 883 86" xml:space="preserve" color-interpolation-filters="sRGB" class="st7"><v:documentproperties v:langid="1033" v:viewmarkup="false">	<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-width: 1 }
.svg-1 .st2 { fill: none; stroke: #3253dc; stroke-width: 1 }
.svg-1 .st3 { fill: #000000; font-family: Arial; font-size: 0.833336em }
.svg-1 .st4 { font-size: 1em }
.svg-1 .st5 { marker-end: url("#mrkr4-26"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st6 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.28409090909091 }
.svg-1 .st7 { 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-26" class="st6" v:arrowtype="4" v:arrowsize="2" v:setback="7.04" refx="-7.04" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-3.52,-3.52) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<v:userdefs>		<v:ud v:nameu="msvThemeOrder" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="19" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<v:layer v:name="Callout" v:index="0"></v:layer>	<v:layer v:name="Connector" v:index="1"></v:layer>	<g id="shape13-1" v:mid="13" v:groupcontext="shape" transform="translate(18,-18)">		<title></title>		<rect x="0" y="36" width="847" height="50" class="st1"></rect>	</g>	<g id="shape3-3" v:mid="3" v:groupcontext="shape" transform="translate(19.5,-19.75)">		<title></title>		<desc>Load a TensorFlow Lite model</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="62.75" width="142" height="46.5"></v:textrect>		<rect x="0" y="39.5" width="142" height="46.5" class="st2"></rect>		<text x="18.75" y="59.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Load a TensorFlow Lite <tspan x="57.38" dy="1.2em" class="st4">model</tspan></text>		</g>	<g id="shape5-7" v:mid="5" v:groupcontext="shape" transform="translate(195,-19.75)">		<title></title>		<desc>Create a TensorFlow Lite interpreter</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="62.75" width="142" height="46.5"></v:textrect>		<rect x="0" y="39.5" width="142" height="46.5" class="st2"></rect>		<text x="14.86" y="59.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Create a TensorFlow Lite <tspan x="48.21" dy="1.2em" class="st4">interpreter</tspan></text>		</g>	<g id="shape6-11" v:mid="6" v:groupcontext="shape" transform="translate(370.5,-19.75)">		<title></title>		<desc>Prepare a model with a chosen delegate</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="62.75" width="142" height="46.5"></v:textrect>		<rect x="0" y="39.5" width="142" height="46.5" class="st2"></rect>		<text x="19.58" y="59.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Prepare a model with a <tspan x="34.3" dy="1.2em" class="st4">chosen delegate</tspan></text>		</g>	<g id="shape7-15" v:mid="7" v:groupcontext="shape" transform="translate(546,-19.75)">		<title></title>		<desc>Prepare input/output buffers</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="62.75" width="142" height="46.5"></v:textrect>		<rect x="0" y="39.5" width="142" height="46.5" class="st2"></rect>		<text x="9.01" y="65.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Prepare input/output buffers</text>		</g>	<g id="shape8-18" v:mid="8" v:groupcontext="shape" transform="translate(721.5,-19.75)">		<title></title>		<desc>Run a model</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="62.75" width="142" height="46.5"></v:textrect>		<rect x="0" y="39.5" width="142" height="46.5" class="st2"></rect>		<text x="42.65" y="65.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Run a model</text>		</g>	<g id="shape9-21" v:mid="9" v:groupcontext="shape" v:layermember="1" transform="translate(161.5,-34)">		<title></title>		<path d="M0 77 L26.46 77" class="st5"></path>	</g>	<g id="shape10-27" v:mid="10" v:groupcontext="shape" v:layermember="1" transform="translate(337,-34)">		<title></title>		<path d="M0 77 L26.46 77" class="st5"></path>	</g>	<g id="shape11-32" v:mid="11" v:groupcontext="shape" v:layermember="1" transform="translate(512.5,-34)">		<title></title>		<path d="M0 77 L26.46 77" class="st5"></path>	</g>	<g id="shape12-37" v:mid="12" v:groupcontext="shape" v:layermember="1" transform="translate(688,-34)">		<title></title>		<path d="M0 77 L26.46 77" class="st5"></path>	</g></g>
</svg>

### Load a TensorFlow Lite model

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

A TensorFlow Lite model is a FlatBuffers file that contains information on model
        operators and any associated weights and biases.

The contents of the FlatBuffers file include the following:

- Tensors (input and outputs of each op)
- Buffers (weights and biases)
- Ops that create an execution graph

The TensorFlow Lite framework provides APIs to do the following:

- Load a TensorFlow Lite model file
- Unpack all the content of the FlatBuffers file onto the memory

You can use the following API to load a TensorFlow Lite model for inference:

    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

### Create a TensorFlow Lite interpreter

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

Using the TensorFlow C/C++ APIs, you can build an interpreter to run the
        model.

The interpreter interface allows you to do the following:

- Configure model execution on a chosen delegate.
- Allocate the memory needed to perform forward propagation.

The following example code demonstrates how you can create an interpreter. You can
            configure the interpreter instance to use a specific delegate and perform forward
            propagation.

    //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

### Prepare a model with a chosen delegate

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

After creating an interpreter and allocating the necessary memory to run the model,
        prepare the model with a chosen delegate. This step creates an execution graph from the
        model loaded before and uses the underlying library to perform inference on the delegate
        hardware.

The following example code creates the XNNPACK delegate for running a TensorFlow Lite
            model on the Arm CPU. The delegate is created by calling the
                `TfLiteXNNPackDelegateCreate(…)` API. You can also customize the
            delegate with the Delegate Options API.

    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

### Prepare input/output buffers

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

When building a standalone TensorFlow Lite application, the pipeline to execute
        TensorFlow Lite models requires preparing input data; for example, camera
        frames.

Preprocessing operations, in the following cases for example, are important to ensure
            that inference is done correctly:

- Resizing the input image to a resolution that the model expects
- Normalization
- Mean subtraction

### Run a model

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

To run inference on a model, invoke a delegate using the `Invoke()`
        API. Before invoking this API, create the appropriate input/output buffers and provide them
        to the interpreter.

After inference is complete, you can parse the output from the interpreter output buffers
            to get inference results.

An example of the `Invoke()` API executing a model using a delegate is as
            follows:

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

After inference is completed, output tensors from the TensorFlow Lite
                `Invoke()` API are present in the output buffers of the interpreter.
            To perform further postprocessing on these outputs, you can parse them from the
            interpreter.

For a comprehensive example, see the label\_image example in the [TensorFlow GitHub repository](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/examples/label_image).

For more information, see [TensorFlow Lite Guide](https://www.tensorflow.org/lite/guide).

## Develop a custom application

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

To improve the developer experience, the IM SDK provides the qtimltflite
        GStreamer-based plug-in, which performs TensorFlow Lite model inference.

For more details, see the following:

- [IM SDK](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-50/overview.html) documentation
- [qtimltflite](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-50/qtimltflite.html) plug-in documentation
- [Develop Your Own Application](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-15B/develop-own-app.html)

Last Published: Oct 09, 2024

[Previous Topic
Architecture](https://docs.qualcomm.com/bundle/publicresource/80-70015-54/topics/arch.md) [Next Topic
Sample applications](https://docs.qualcomm.com/bundle/publicresource/80-70015-54/topics/sample-applications.md)