# Export the model

## Export an ONNX model

This section describes how to export an ONNX model from PyTorch and TensorFlow.

### Export an ONNX model from PyTorch

[PyTorch](https://pytorch.org/) is a deep learning framework that provides dynamic computation graphs. In the following code, you import the necessary libraries and load a pre-trained ResNet-18 model. You then set the model to evaluation mode and define an example input tensor. Finally, you use the `torch.onnx.export` function to export the model to the ONNX format. You can replace `"model.onnx"` with the desired output file path.

Do the following to export a PyTorch model to ONNX format:

import torch
    import torchvision.models as models
    
    # Load a pre-trained PyTorch model
    model = models.resnet18(pretrained=True)
    
    # Set the model to evaluation mode
    model.cpu().eval()
    
    # Define example input tensor
    input_tensor = torch.randn(1, 3, 224, 224).cpu()  # Replace with your own input shape
    
    # Export the model to ONNX format
    torch.onnx.export(model, input_tensor, "model.onnx", verbose=True, opset_version=13)
    Copy to clipboard

### Export an ONNX model from TensorFlow

[TensorFlow](https://www.tensorflow.org/) is another deep learning framework that provides both static and dynamic computation graphs. In the following code, you import the necessary libraries and load a pre-trained ResNet-50 model using Keras. You then convert the TensorFlow model to the ONNX format using the `tf2onnx.convert.from_keras` function. Finally, you save the ONNX model to a file using the `tf2onnx.save_model` function.

Here’s how you can export a TensorFlow model to ONNX format:

import tensorflow as tf
    from tensorflow.keras.applications import ResNet50
    import tf2onnx
    
    # Load a pre-trained TensorFlow model
    model = ResNet50(weights='imagenet')
    
    # onnx_model = tf2onnx.convert.from_keras(model)
    input_tensor_spec = (tf.TensorSpec((None, 224, 224, 3), tf.float32, name="input"),)
    
    # Convert the TensorFlow model to ONNX format
    # Save the ONNX model to a file
    model_proto, _ = tf2onnx.convert.from_keras(model, input_signature=input_tensor_spec, opset_version=13, output_path="model.onnx")
    Copy to clipboard

If you have a saved TensorFlow model or saved checkpoint path of TensorFlow model, you can load the model using Keras with TensorFlow or you can directly use the following commands from `tf2onnx` libraries.

# You have path to your saved TensorFlow model
    python -m tf2onnx.convert --saved-model tensorflow-model-path --opset 11 --output model.onnx
    
    # For checkpoint format:
    python -m tf2onnx.convert --checkpoint  tensorflow-model-meta-file-path --output model.onnx --inputs input0:0,input1:0 --outputs output0:0
    
    # For graphdef format:
    python -m tf2onnx.convert --graphdef  tensorflow-model-graphdef-file --output model.onnx --inputs input:0,input:0 --outputs output0:0
    Copy to clipboard

You can refer this [notebook from tf2onnx](https://github.com/onnx/tensorflow-onnx/blob/main/tutorials/ConvertingSSDMobilenetToONNX.ipynb)

#### Loading the ONNX model

After exporting the model from your preferred framework to ONNX, you can load it for inference using the `onnx` package. Here’s an example:

import onnx
    import onnx.checker
    
    # Load the ONNX model
    model = onnx.load("path/to/exported_model.onnx")
    
    try:
        onnx.checker.check_model(model)
    except:
    
        onnx.checker.check_model_path("path/to/exported_model.onnx")
    Copy to clipboard

## Operator and Datatype support

### Operator support

In this section we will discuss the operator support available for the device across various frameworks.

To determine the list of operators supported by the device for various frameworks, you can execute the following command

Example command to generate operators supported for onnx
    
    /opt/qti-aic/exec/qaic-exec -operators-supported=onnx
    Copy to clipboard

This command generates a file `OnnxSupportedOperators.txt`, which is a comprehensive list of available operators.

-operators-supported supports only onnx, tensorflow, pytorch.
    Copy to clipboard

`onnx` is the preferred format to compile the model for the device.

#### Unsupported operators

You might encounter errors related to unsupported operations while compiling the model for the device.

For instance, certain operations like einsum present in the model file might not be directly supported by the device.

Use the [model preparator](https://docs.qualcomm.com/doc/80-99100-3/topic/index_Export-the-model.html#reference-to-model-preparator-tool) tool can be employed to modify the model and substitute these unsupported operations with their corresponding mathematical equivalent subgraphs.

### Datatype support

#### FP32 (single precision floating point)

Execute models in FP32 for use cases where accuracy is critical
and computational efficiency is not a primary concern. It is essential
to note that FP32 models tend to have larger sizes and can exhibit
lower throughput performance. FP32 execution is supported but not
recommended. Don’t use the `-convert-to-fp16` flag with `qaic-exec`
(compiler CLI) during compilation.

#### FP16 (half precision floating point)

FP16 strikes a balance between accuracy and efficiency, making it
suitable for most deep learning workloads.

If a model is originally trained in FP32 format, you can
down-convert it to FP16 during the compilation process using the
`-convert-to-fp16` flag. However, certain scenarios can involve
constants beyond the FP16 range. In such cases, it is recommended to
clip values to the FP16 range (as demonstrated in the `fix_onnx_fp16`
function in the natural language processing (NLP) tutorials in the [Cloud-ai-sdk
repository](https://github.com/quic/cloud-ai-sdk)).

#### FP8 (8-bit floating point)

Models in the FP8 format are supported through [Qualcomm Efficient-Transformers](https://github.com/quic/efficient-transformers).

#### Shared micro-exponents (narrow precision format)

See the [shared micro-exponent spec](https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf) for details on microscaling. Currently, MXFP6 is supported by the compiler.

Models compiled in MXFP6 format store FP32/FP16 weights using a 6-bit
format. This format significantly reduces model sizes due to the
compact representation. Use this format for
models that require high data bandwidth, such as large language models
(LLMs).

The Cloud AI 100 stores MatMul weights in the MXFP6 format while keeping the rest of
the weights in FP16 format. Computation/activations on the neural signal processor (NSP) still
occur in FP16.

LLMs experience up to twice the throughput with minimal accuracy loss with
MXFP6 format. Within a constant memory footprint, MXFP6 can support a larger model.

You can compile FP32 models into MXFP6 format using the compiler flag
`-mxfp6-matmul`. FP16 execution should use both `-convert-to-fp16`
and `-mxfp6-matmul` flags for the `qaic-exec` compiler CLI.

#### INT8 (8-bit integer)

The Cloud AI 100 supports INT8 quantized models, especially relevant
for natural language processing (NLP) and computer vision (CV) tasks.

The following quantization methods are available:

- Quantization schema for weights and activations: Both symmetric and asymmetric.
- Quantization calibration: Options include KLMinimization, KLMinimizationV2, MSE, SQNR, and
percentile (with percentile calibration values: 99.9, 99.99, 99.999,
99.9999).

The SDKs provide tools to run a profile-guided quantization (PGQ) sweep, allowing you to identify the
optimal quantization parameters for your specific requirements.

#### INT4 (4-bit integer)

Activation-aware weight quantization (AWQ) and generative pre-trained quantized (GPTQ) models with 4-bit weights are supported
through [Qualcomm Efficient-Transformers](https://github.com/quic/efficient-transformers).

#### BF16 (BFloat16)

If a model is trained in BF16 (bfloat16), ensure that the weights are
scaled down using an appropriate scaling factor. This prevents
intermediate activations from overflowing into `fp16`. Qualcomm can
provide a script to identify the scaling factors to scale down the
weights of the models.

## Introduction to the Model Preparator Tool

The QAic Model Preparator is an *optional* tool that automates
generating Optimal AIC Friendly models for usage. The tool applies various
optimizations and cleaning techniques for generation of the model.
You can use this tool if the exported model fails compilation.

The tool supports ONNX and TensorFlow models. The tool checks the
model, applies shape inference, cleans the model, applies various
optimization, handles the pre-processing and post-processing nodes in the
graph, and generates models as per the configurations in a YAML file.

### Model preparator overview

Review the Model Export page for details on exporting the model from
one framework to another framework, the most preferred and tested
framework on MP is Onnx.

For detailed usage of the tool, refer to this
[link](https://docs.qualcomm.com/bundle/publicresource/topics/80-PT790-993B/network-preparation.html#network-preparation_Introduction_modelprep).

![cloud-ai-mkdocs/images/mp.png](data:image/png;base64,UklGRoZzAABXRUJQVlA4WAoAAAAQAAAA+gUAUgMAQUxQSL8EAAABHMdtIzkSK/+0252/Z0RMgNTqrGWqLf7HkFjeQU6NJw67U2WSGVYO8/V7EIn1Yz65duMBSdUnMb9IkGc0zdbRnKdyeWKbMXbkXNu2OMq7vtvN0rmUpEKq7XDnB2yHTYn1tr4llO5uOSmpCO7umqTCYWbdvxeJJ997MjMPfBEhCZIkR4o80JpCvfQU3BlQIP7+o4gILg2K+uGxV4hEqUTw0w/PnxCYZ/znv/Gf//7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++//7Bmoh2O9SkurlRfLGxPxGdLLw91c3HWPXR5KTYLXXa5mHMvh4CZrbjYUzYsa3e5+HPbQVm7wzrktEMy22U9cm1AFlKsSyqExy6zPl2GY0tdjbhL0dhl1qnLYGzikFaGJmIxu1sr3TYWC7NehbFYTDMxLNanmT4spjSjsBjrlv/++++///7777///vv/nxlq9Gt2YbyBOOWp1Rbyc3ZYsI8S/OcCMNf/Lm9WM/+9AMrFOyiP55IvKNUtCrbTztHkDuxsylsR5pQLSvSfemWwHctZAr81pZb3M26Thd8o/yVSLiLCe6tTL0J8ieSLIN/qpItQn0UE+4iM//z333///ffff/+N/4z/WpXlOJJKOiEQI8vR45V0QiBGlmNGLemEQIwsR4pd0gmBGFn2Q0DSCYEYWbbCQdIJIRy6rJXLok4IxIiyASaSTqhkgCPnLos6IRQjybb3SDohGCPIjieJOiEYI8dmV4k6IRwjxj6HiTohICPFFreJOiEkI8Tu5ok6ISgjwsYWyjqhwJ2fsFGSuMuDPCs2+dLNKfdBBNeFa4z//Pfff//9999///3333///ffff//9999///3333///ffff//9999///3333///ffff//9999///3333///ffff9R1ddHc9PkTAvOw3pVMZ6D/ysZ//hv/+e+///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//++++///7777///vvvv//+Y+Lo2wiP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)

usage: Sample Config Details are For Single model:

MODEL:
        INFO:
            MODEL_TYPE: EFFICIENTDET
            INPUT_INFO:
            - - input:0
              - - 1
                - 512
                - 512
                - 3
            DYNAMIC_INFO:
            - - input:0
              - - batch_size
                - 512
                - 512
                - 3
            EXPORT_TYPE: ONNX
            OPSET: 13
            MODEL_PATH: efficientdet-d0.pb
            NAME: Sample Model
            DESCRIPTION: SSD MobileNet V1 Opset 10 Object Detection Model
            VALIDATE: False
            AIC_DEVICE_ID: 0
            WORKSPACE: WORKSPACE
            VERBOSE: INFO
            INPUT_LIST_FILE: None
            CUSTOM_OP_INFO_FILEPATH: None
    
    PRE_POST_HANDLE:
        NMS_PARAMS:
            MAX_OUTPUT_SIZE_PER_CLASS: 100
            MAX_TOTAL_SIZE: 100
            IOU_THRESHOLD: 0.65
            SCORE_THRESHOLD: 0.25
            CLIP_BOXES: False
            PAD_PER_CLASS: False
    
        PRE_PLUGIN: True
        TRANSFORMER_PACKED_MODEL: False
        COMPRESSED_MASK: False
        POST_PLUGIN: SMARTNMS
        ANCHOR_BIN_FILE: None
    
    ATTRIBUTES: None
    Copy to clipboard

Usage on Multi Model Config:

MODELS:
      MODEL:
          INFO:
              MODEL_TYPE: CLASSIFICATION
              INPUT_INFO:
              - - model_1_input
                - - 1
                  - 100
              DYNAMIC_INFO:
              - - model_1_input
                - - batch
                  - 100
              EXPORT_TYPE: ONNX
              OPSET: 13
              MODEL_PATH: model_1.onnx
              NAME: Model_1
              DESCRIPTION: Sample model-1
              VALIDATE: True
              AIC_DEVICE_ID: 0
              WORKSPACE: ./workspace
              VERBOSE: INFO
              INPUT_LIST_FILE: None
              CUSTOM_OP_INFO_FILEPATH: None
    
      PRE_POST_HANDLE:
          NMS_PARAMS:
              MAX_OUTPUT_SIZE_PER_CLASS: 100
              MAX_TOTAL_SIZE: 500
              IOU_THRESHOLD: 0.5
              SCORE_THRESHOLD: 0.01
              CLIP_BOXES: False
              PAD_PER_CLASS: False
    
          PRE_PLUGIN: True
          TRANSFORMER_PACKED_MODEL: False
          COMPRESSED_MASK: False
          POST_PLUGIN: NONE
          ANCHOR_BIN_FILE: None
    
      ATTRIBUTES: None

      MODEL:
        INFO:
            MODEL_TYPE: CLASSIFICATION
            INPUT_INFO:
            - - model_2_input
              - - 1
                - 10
            DYNAMIC_INFO:
            - - model_2_input
              - - batch
                - 10
            EXPORT_TYPE: ONNX
            OPSET: 13
            MODEL_PATH: model_2.onnx
            NAME: Model_2
            DESCRIPTION: Sample model-2
            VALIDATE: True
            AIC_DEVICE_ID: 0
            WORKSPACE: ./workspace
            VERBOSE: INFO
            INPUT_LIST_FILE: None
            CUSTOM_OP_INFO_FILEPATH: None
    
      PRE_POST_HANDLE:
          NMS_PARAMS:
              MAX_OUTPUT_SIZE_PER_CLASS: 100
              MAX_TOTAL_SIZE: 500
              IOU_THRESHOLD: 0.5
              SCORE_THRESHOLD: 0.01
              CLIP_BOXES: False
              PAD_PER_CLASS: False
    
          PRE_PLUGIN: True
          TRANSFORMER_PACKED_MODEL: False
          COMPRESSED_MASK: False
          POST_PLUGIN: NONE
          ANCHOR_BIN_FILE: None
    
      ATTRIBUTES: None
    Copy to clipboard

CHAINING\_INFO: EDGES: - - Model\_1::model\_1\_output -
Model\_2::model\_2\_input

WORKSPACE: ./workspace_chaining/
    EXPORT_TYPE: ONNX
    OPSET: 13
    AIC_DEVICE_ID: 0
    Copy to clipboard

qaic-preparator options

Config Options: –config CONFIG Path to config file –silent Run in
silent mode

For more details checkout the help menu in the tool: “*python3qaic-model- preparator.py –help* “ Tool location in the SDK:
“*/opt/qti-aic/tools/qaic- pytools* “

### Sample details on Model Configuration Settings file

#### Model preparator configurations

- **MODEL**

    - **DESCRIPTION** : Model Description
    - **MODEL\_TYPE** : Provide the Model Category it belongs to
    - **MODEL\_PATH** : Provide path to the downloaded original model
file
    - **INPUT\_INFO** : Provide Dictionary of Input names and its
corresponding shapes.
    - **DYNAMIC** : Provide Dynamic Info to generate dynamic models
    - **EXPORT\_TYPE** : ONNX or TENSORFLOW
    - **VALIDATE** : Validate the prepared model outputs with native
framwork. (Ex: QAic FP16 vs OnnxRuntime FP32)
    - **WORKSPACE** : Provide the workspace directory to save the log
files and final prepared model.
- **PRE\_POST\_HANDLE**

    - **ANCHOR\_BIN\_FILE** : Path to Anchor bin files or None.
    - **POST\_PLUGIN** : None by Default, If Object Detection Models,
Provide “Smart-nms” or “QDetect” to either generate split model or
full model.
    - **PRE\_PLUGIN** : Handle pre plugin, This will be either
keep/remove the pre processing from the graph.
    - **NMS\_PARAMS** : This fields are specific to Object Detection
models, and are helpful while creating full model based on QDetect
nodes.
    - **MAX\_OUTPUT\_SIZE\_PER\_CLASS** : A scalar integer representing
the maximum number of boxes to be selected by non-max suppression
per class
    - **MAX\_TOTAL\_SIZE** : A integer representing maximum number of
boxes retained over all classes. Note that setting this value to a
large number may result in OOM error depending on the system
workload.
    - **IOU\_THRESHOLD** : A float representing the threshold for
deciding whether boxes overlap too much with respect to IOU.
    - **SCORE\_THRESHOLD** : A float representing the threshold for
deciding when to remove boxes based on score.
    - **CLIP\_BOXES** : If true, the coordinates of output nmsed boxes
will be clipped to [0, 1]. If false, output the box coordinates as
it is. Defaults to true.
    - **PAD\_PER\_CLASS** : If false, the output nmsed boxes, scores and
classes are padded/clipped to max\_total\_size.

### Optimizations around pre and post processing handling in preparator

- **PRE\_PLUGIN**

    - The **PRE\_PLUGIN** field in the config is a boolean flag
indicating the application of pre-processing optimizations if any.
For example: In most of the computer vision models from the
TensorFlow network we have seen that the preprocessing and post
processing is part of the model graph making it dynamic in nature.
    - Since we are working mostly on static models (due to AOT), this
will cause issues in the model compilation. Making the PRE\_PLUGIN
*True* will help in handling such pre-processing in the model
graph and making it AIC friendly.
    - The preprocessing which is part of the model is handled and
details regarding the same is tapped onto the log files.
    - The TF Optimizer looks for control-flow operators inside the model
and replaces them with the appropriate/relevant operators.Major
Optimizations include:
    - Switch-Merge Optimizer:

        - This arises due to the “tf.while\_loop()” and “tf.cond()” APIs.
The “prediction” flag of the switch operator is evaluated, and
the corresponding path is selected for the model. A switch
operator whose prediction flag is not constant cannot be
optimized.
    - Loop Unrolling:

        - This arises due to the “tf.while\_loop()” APIs. The loop is
unrolled to make a Directed Acyclic Graph (DAG) based on the
number of loop iterations. It cannot be applied in cases where
the number of loop iterations is not fixed or there is a nested
loop.
    - TensorArray Optimizations:

        - This includes all tensor-array operators like (TensorArray,
TensorArrayWrite, TensorArrayRead, TensorArrayGather,
TensorArrayScatter, and so on). This optimization replaces
tensor-array operators with relevant known and supported
operators.
        - For most of the NLP models, we have tokenization encodings of
the inputs which we do in the host and pass the tokenized
inputs to the model.

![cloud-ai-mkdocs/images/model_modify.png](data:image/png;base64,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)
- **POST\_PLUGIN**

    - This field is mostly applicable to the Object Detection CV models,
at QAic we have two options to run the ABP + NMS. *Smart-NMS* and
*QDetect*.
    - SMART-NMS is a software application to help run the post
processing part of the Object Detection (OD) models on host.
Enabling this in the config will help add SMART-NMS to the model.
Here we have intelligent way of identifying the post processing of
the model if any and generating SMART-NMS specific model.
    - QDetect is a known custom operator from QAic to enabling running
the post processing of the OD models on the device. Enabling this
in the config, will help generate add QDetect to the model.
    - For NLP networks, the post-processing is decoding the tokens
generated from model. Here we can use HuggingFace *generation*
utils to do the post processing on the host.

### Tutorial: convert and execute a YoloV5 model with QAic

The following tutorial demonstrates the end-to-end usage of the model
preparator tool and the QAic Execution. This process begins with a
trained source framework model, that you convert and build into an
optimization model, which is then executed on a
QAic backend.

The tutorial uses YoloV5 as the source framework model.

The steps of the tutorial are as follows:

- Tutorial setup: Download the original model
- Model conversion: Generate the optimized Model using model preparator
APIs
- Executing example model: Run the model on QAic backend.
- Plot model outputs to a sample image

#### Tutorial setup

The tutorial assumes general setup instructions have been followed at
Setup.

import os
    cwd = os.getcwd()
    
    # Steps to generate the models from ultralytics repo.
    !rm -rf yolov5
    
    # Clone the Ultralytics repo.
    !git clone --branch v6.0 --depth 1 https://github.com/ultralytics/yolov5.git
    
    # Install the requirements
    %cd yolov5
    !git checkout v6.0
    
    !pip3 install seaborn
    # Export the Original yolo models.
    !python3 -W ignore export.py --weights ./yolov5s.pt --include onnx --opset 13
    
    # Copy the original model to the relevant paths in sdk
    !cp yolov5s.onnx /opt/qti-aic/tools/qaic-pytools
    %cd ..
    !rm -rf yolov5/
    Copy to clipboard

#### Model conversion

After the model assets have been acquired the model can be converted to
optimized QAic model, and subsequently built for use by an application.
In the below example we will be generating the optimized QDetect model
as explained in the above pre/post processing section.

# Path to the installed SDK apps tools
    %cd /opt/qti-aic/tools/qaic-pytools
    
    # Run the preparator plugin with the relevant config file
    !python -W ignore qaic-model-preparator.py --config /opt/qti-aic/tools/qaic-pytools/model_configs/samples/preparator/public/yolov5_ultralytics_model_info_qdetect.yaml --silent
    
    # More details on various configs can be found here: /opt/qti-aic/tools/qaic-pytools/model_configs/samples/preparator/public
    Copy to clipboard

#### QAic backend execution

Compile the model binary using the *qaic-exec* and execute it using the
*qaic- runner* with the following commands:

!rm -rf yolo-binaries-qdetect
    
    !/opt/qti-aic/exec/qaic-exec -m=/opt/qti-aic/tools/qaic-pytools/WORKSPACE/yolov5s_preparator_aic100.onnx \
    -aic-hw -onnx-define-symbol=batch_size,1 -aic-binary-dir=yolo-binaries-qdetect -convert-to-fp16 -compile-only
    Copy to clipboard

!/opt/qti-aic/exec/qaic-runner -t yolo-binaries-qdetect -a 1 -d 0 --time 15
    Copy to clipboard

#### Plot model outputs to a sample image

Once we have the performance numbers, we will setup some model artifacts
based on sample real image, Pre-Process, convert it to *raw* generate
model outputs based on *qaic-runner*. Then using the generated outputs,
we will plot it on the input images and get the final bounding boxes.

# Imports
    import os
    import time
    import cv2
    import numpy as np
    import torch
    from PIL import Image
    
    def letterbox_image(image, size):
        iw, ih = image.size
        w, h = size
        scale = min(w / iw, h / ih)
        nw = int(iw * scale)
        nh = int(ih * scale)
    
        image = image.resize((nw, nh), Image.BICUBIC)
        new_image = Image.new("RGB", size, (128, 128, 128))
        pad_left = (w - nw) // 2
        pad_top = (h - nh) // 2
        new_image.paste(image, (pad_left, pad_top))
        return new_image, scale, pad_left, pad_top
    
    def preprocessImg(image_path, input_h, input_w):
    
        image_src = Image.open(image_path)
        resized, scale, pad_left, pad_top = letterbox_image(image_src, (input_w, input_h))
        img_in = np.transpose(resized, (2, 0, 1)).astype(np.float32)  # HWC -> CHW
        img_in = np.expand_dims(img_in, axis=0)
        img_in /= 255.0
        return img_in, np.array(image_src, dtype=np.uint8), scale, pad_left, pad_top
    Copy to clipboard

# Download the sample image and pre-process
    !rm -rf *.jpg
    !wget -c https://ultralytics.com/images/zidane.jpg
    img_preproc, img_orig, scale, pad_left, pad_top = preprocessImg("zidane.jpg", 640, 640)
    img_preproc.tofile("input.raw")
    Copy to clipboard

# Generate the outputs
    !/opt/qti-aic/exec/qaic-runner -t yolo-binaries-qdetect -i input.raw --write-output-dir yolo-output-qdetect -d 0
    Copy to clipboard

# Model artifacts to post process and plot the outputs on the image
    def scale_coords(
        coords, img_orig_h, img_orig_w, scale, pad_left, pad_top, xy_swap=True
    ):
        # Rescale coords (xyxy) from preprocessed img to original img resolution
    
        if xy_swap:
            coords[:, :, [0, 2]] -= pad_top  # y padding
            coords[:, :, [1, 3]] -= pad_left  # x padding
        else:
            coords[:, :, [0, 2]] -= pad_left  # x padding
            coords[:, :, [1, 3]] -= pad_top  # y padding
        coords[:, :, :4] /= scale
    
        # Clip bounding xyxy bounding boxes to image shape (height, width)
        if xy_swap:
            coords[:, :, 0] = coords[:, :, 0].clip(0, img_orig_h - 1)  # y1
            coords[:, :, 1] = coords[:, :, 1].clip(0, img_orig_w - 1)  # x1
            coords[:, :, 2] = coords[:, :, 2].clip(0, img_orig_h - 1)  # y2
            coords[:, :, 3] = coords[:, :, 3].clip(0, img_orig_w - 1)  # x2
        else:
            coords[:, :, 0] = coords[:, :, 0].clip(0, img_orig_w - 1)  # x1
            coords[:, :, 1] = coords[:, :, 1].clip(0, img_orig_h - 1)  # y1
            coords[:, :, 2] = coords[:, :, 2].clip(0, img_orig_w - 1)  # x2
            coords[:, :, 3] = coords[:, :, 3].clip(0, img_orig_h - 1)  # y2
        return coords

    class_names = [
        "person",
        "bicycle",
        "car",
        "motorcycle",
        "airplane",
        "bus",
        "train",
        "truck",
        "boat",
        "traffic light",
        "fire hydrant",
        "stop sign",
        "parking meter",
        "bench",
        "bird",
        "cat",
        "dog",
        "horse",
        "sheep",
        "cow",
        "elephant",
        "bear",
        "zebra",
        "giraffe",
        "backpack",
        "umbrella",
        "handbag",
        "tie",
        "suitcase",
        "frisbee",
        "skis",
        "snowboard",
        "sports ball",
        "kite",
        "baseball bat",
        "baseball glove",
        "skateboard",
        "surfboard",
        "tennis racket",
        "bottle",
        "wine glass",
        "cup",
        "fork",
        "knife",
        "spoon",
        "bowl",
        "banana",
        "apple",
        "sandwich",
        "orange",
        "broccoli",
        "carrot",
        "hot dog",
        "pizza",
        "donut",
        "cake",
        "chair",
        "couch",
        "potted plant",
        "bed",
        "dining table",
        "toilet",
        "tv",
        "laptop",
        "mouse",
        "remote",
        "keyboard",
        "cell phone",
        "microwave",
        "oven",
        "toaster",
        "sink",
        "refrigerator",
        "book",
        "clock",
        "vase",
        "scissors",
        "teddy bear",
        "hair drier",
        "toothbrush",
    ]

    def drawBoxes(
        detections,
        img_orig,
        scale=1.0,
        pad_left=0,
        pad_top=0,
        xy_swap=True,
        filter_score=0.2,
        line_thickness=None,
        text_bg_alpha=0.0,
    ):
        detection_boxes = detections[0]  # [1, N, 4]
        detection_scores = detections[1]  # [1, N]
        detection_classes = detections[2]  # [1, N]
        num_detections = detections[3]  # [1]
    
        img_orig_h, img_orig_w = img_orig.shape[:2]
    
        detection_boxes = scale_coords(
            detection_boxes, img_orig_h, img_orig_w, scale, pad_left, pad_top, xy_swap
        )
    
        tl = line_thickness or round(0.002 * (img_orig_w + img_orig_h) / 2) + 1
    
        assert (
            detection_boxes.shape[0] == 1
        ), "Currently plotting for single batch size only."
        for i in range(num_detections[0]):
            box = detection_boxes[0][i]
            score = detection_scores[0][i]
            cls = detection_classes[0][i]
            if score < filter_score:
                continue
            if xy_swap:
                y1, x1, y2, x2 = map(int, box)
            else:
                x1, y1, x2, y2 = map(int, box)
            np.random.seed(int(cls) + 2020)
            color = [np.random.randint(0, 255), 0, np.random.randint(0, 255)]
            cv2.rectangle(
                img_orig,
                (x1, y1),
                (x2, y2),
                color,
                thickness=max(int((img_orig_h + img_orig_w) / 600), 1),
                lineType=cv2.LINE_AA,
            )
            label = "%s %.2f" % (class_names[int(cls)], score)
            t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=1)[0]
            c2 = x1 + t_size[0] + 3, y1 - t_size[1] - 5
            if text_bg_alpha == 0.0:
                cv2.rectangle(img_orig, (x1 - 1, y1), c2, color, cv2.FILLED, cv2.LINE_AA)
            else:
                alphaReserve = text_bg_alpha
                BChannel, GChannel, RChannel = color
                xMin, yMin = int(x1 - 1), int(y1 - t_size[1] - 3)
                xMax, yMax = int(x1 + t_size[0]), int(y1)
                img_orig[yMin:yMax, xMin:xMax, 0] = img_orig[
                    yMin:yMax, xMin:xMax, 0
                ] * alphaReserve + BChannel * (1 - alphaReserve)
                img_orig[yMin:yMax, xMin:xMax, 1] = img_orig[
                    yMin:yMax, xMin:xMax, 1
                ] * alphaReserve + GChannel * (1 - alphaReserve)
                img_orig[yMin:yMax, xMin:xMax, 2] = img_orig[
                    yMin:yMax, xMin:xMax, 2
                ] * alphaReserve + RChannel * (1 - alphaReserve)
            cv2.putText(
                img_orig,
                label,
                (x1 + 3, y1 - 4),
                0,
                tl / 3,
                [255, 255, 255],
                thickness=1,
                lineType=cv2.LINE_AA,
            )
            print(
                f"X1:{x1}, Y1:{y1}, X2:{x2}, Y2:{y2}, Score:{score:.4f}, Cls_id:{class_names[int(cls)]}"
            )
    
        return img_orig
    Copy to clipboard

boxes = np.fromfile("yolo-output-qdetect/detection_boxes-activation-0-inf-0.bin", dtype="float32").reshape(1, 100, 4)
    scores = np.fromfile("yolo-output-qdetect/detection_scores-activation-0-inf-0.bin", dtype="float32").reshape(1, 100)
    classes = np.fromfile("yolo-output-qdetect/detection_classes-activation-0-inf-0.bin", dtype="int32").reshape(1, 100)
    detections = np.fromfile("yolo-output-qdetect/num_detections-activation-0-inf-0.bin", dtype="int32").reshape(1)
    
    decoded_output = [boxes, scores, classes, detections]
    image_src = Image.open("zidane.jpg")
    img_orig = np.array(image_src, dtype=np.uint8)
    img_orig_plotted = drawBoxes(decoded_output, img_orig, scale, pad_left, pad_top, True)
    img_orig_plotted = cv2.cvtColor(img_orig_plotted, cv2.COLOR_RGB2BGR)
    cv2.imwrite("output_qdetect.jpg", img_orig_plotted)
    Copy to clipboard

# Plot the outputs on the image
    import matplotlib.pyplot as plt
    from matplotlib.pyplot import figure
    
    img = np.array(Image.open("output_qdetect.jpg"))
    fig, ax = plt.subplots(figsize=(15, 15))
    ax.imshow(img)
    Copy to clipboard

For more examples about various models, checkout our notebooks in SDK.
Location to notebooks in SDK:
`/opt/qti-aic/tools/qaic- pytools/docs/preparator/examples/notebooks`

### Next steps

- [Compile the model](https://docs.qualcomm.com/doc/80-99100-3/topic/index_model-compilation.html#reference-to-compile-the-model)

Last Published: May 01, 2026

[Previous Topic
Inference workflow](https://docs.qualcomm.com/bundle/publicresource/80-99100-3/topics/index_Inference-Workflow.md) [Next Topic
Compile the model](https://docs.qualcomm.com/bundle/publicresource/80-99100-3/topics/index_model-compilation.md)