Tappas 3.31.0 User Guide
Tappas 3.31.0 User Guide
Release 3.31.0
1 January 2025
Table of Contents
2 Installation                                                                                                                                                                                               14
  2.1 Verify HailoRT Installation . . . .                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14
  2.2 Installation via the Hailo SW Suite                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14
  2.3 Using Dockers . . . . . . . . . .                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
  2.4 Yocto . . . . . . . . . . . . . . .                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
  2.5 Manual Installation . . . . . . .                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
  2.6 Run TAPPAS on Raspberry PI 4 .                     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
5 TAPPAS as a framework                                                                                                                                                                                      79
  5.1 TAPPAS Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                                                               79
  5.2 GStreamer Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                                                                80
  5.3 Write Your Own Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                                                             81
6 Elements                                                                                                                                                                                                   114
  6.1 Hailo Cropper . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   114
  6.2 Hailo Overlay . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   116
  6.3 Hailo DeviceStats . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   117
  6.4 Hailo Filter . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   118
  6.5 Hailo Tracker . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   120
  6.6 Hailo Tile Aggregator      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   121
  6.7 Hailo Tile Cropper . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   123
  6.8 Hailo Python . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   125
  6.9 Hailo Net . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   126
  6.10 Hailo Muxer . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   126
  6.11 Hailo Aggregator . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   127
  6.12 Hailo Gallery . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   129
  6.13 Hailo RoundRobin . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   130
  6.14 Hailo Stream Router .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   132
  6.15 Hailo Export File . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   134
  6.16 Hailo Export ZMQ . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   135
   Page i     Release 3.31.0         Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
7 Pipelines                                                                                                                                                                                                  145
  7.1 Cascaded Networks Structure . . . . . . . . .                                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   145
  7.2 Single Network Multi-Device Pipeline Structure                                 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   147
  7.3 Multi Stream Pipeline Structure . . . . . . . .                                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   148
  7.4 Parallel Networks Structure . . . . . . . . . .                                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   149
  7.5 Single Network Pipeline Structure . . . . . . .                                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   150
8 Tools                                                                                                            154
  8.1 Dot Visulaizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
  8.2 Cross-compile Hailo’s GStreamer plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
9 Scripts                                                                                                       158
  9.1 Using record_perf script to get records from tappas . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
   Page ii      Release 3.31.0           Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
Copyright
No part of this document may be reproduced or transmitted in any form without the expressed, written permission
of Hailo. Nothing contained in this document should be construed as granting any license or right to use proprietary
information for that matter, without the written permission of Hailo.
General Notice
Hailo, to the fullest extent permitted by law, provides this document “as-is” and disclaims all warranties, either ex-
press or implied, statutory or otherwise, including but not limited to the implied warranties of merchantability, non-
infringement of third parties’ rights, and fitness for particular purpose.
Although Hailo used reasonable efforts to ensure the accuracy of the content of this document, it is possible that
this document may contain technical inaccuracies or other errors. Hailo assumes no liability for any error in this
document, and for damages, whether direct, indirect, incidental, consequential or otherwise, that may result from
such error, including, but not limited to loss of data or profits.
The content in this document is subject to change without prior notice and Hailo reserves the right to make changes
to content of this document without providing a notification to its users.
   Page 1      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
1.1. Overview
TAPPAS is Hailo’s set of full application examples, implementing pipeline elements and pre-trained AI tasks.
Demonstrating Hailo’s system integration scenario of specific use cases on predefined systems (software and Hard-
ware platforms). It can be used for evaluations, reference code and demos:
   Page 2      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                     TAPPAS User Guide
                                                                 Integration            pyHailoRT
                                                                               CLI
                                                                     Tool              (Python API)
              Hailo Dataflow Compiler (SDK)
                                                                                     C/C++ API and Library
              Python API                  CLI tools
                                                                                                       Hailo Driver
                           Model Parser                          OS IP Stack
                   Model Optimizer
                                                                         Ethernet              PCIe               Integrated
            Resource Allocator                     Profiler
                                       Emulator
                                                                                      NN Core
                 Compiler
                                                                 (part of Hailo Vision Processor or AI Accelerator)
In preview
1.2.1. Prerequisites
• Hailo-8 device
   Page 3        Release 3.31.0            Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
1.2.2. Installation
1.2.3. Documentation
TAPPAS is now released separately for Hailo-8, for Hailo-15 please refer to https://github.com/hailo-ai/tappas/tree/
master-vpu.
For a quick start with Hailo-15, please refer to the Vision Processor Software Package documentation section in Hailo’s
Developer Zone.
Note: These example applications are part of the Hailo AI Software Suite.
TAPPAS comes with a rich set of pre-configured pipelines optimized for different common hosts.
Important:
   Page 4      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
    • All example applications utilize both the host (for non-neural tasks) and the Neural-Network Core (for neural-
      networks inference), therefore performance results are affected by the host.
    • General application examples do not include any architecture-specific accelerator usage, and therefore will
      provide the easiest way to run an application, but with sub-optimal performance.
    • Architecture-specific application examples (i.MX, Raspberry PI, etc.) use platform-specific hardware accelera-
      tors and are not compatible with different architectures.
Note: All i.MX example application are validated on i.MX8 and i.MX6 platforms and are compatible with the architec-
tures.
Pipelines that run a single network. The diagram below shows the pipeline data-flow.
Depth Estimation
Instance segmentation
   Page 5      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
Examples of basic pipelines running two networks. The cascaded (serial) flow shows two networks running in se-
ries. This example pipeline is of the popular configuration where the first network is a detector which finds some
Region-of-Interest (ROI) in the input image and the second network processes the cropped ROI (a face-detection-
and-landmarking use case of this pipeline is shown at the top of this guide). The pipeline is shown in the following
diagram:
   Page 6      Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
Our LPR reference application demonstrates the use of 3 networks, with a database. The pipeline demonstrates
inference based decision making (Vehicle detection) for secondary inference tasks (License plate data extraction).
This allows multiple networks to cooperate in the pipeline for reactive behavior.
Our Multi-Person Multi-Camera Tracking reference application demonstrates person tracking across multiple streams
using RE-ID tracking. The pipeline demonstrates another method for inference based decision making that also con-
nects between different video streams.
   Page 7     Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
RE-ID
1.5. Support
If you need support, please post your question on our Hailo community Forum for assistance.
1.6. Changelog
    • TAPPAS is now released separately for Hailo-8, for Hailo-15 please refer to https://github.com/hailo-ai/tappas/
      tree/master-vpu
• Hailo-8:
– Added an option to control Yolo (Detection) Hailort post-process parameters via a JSON configuration
– Semantic segmentation post-process now extracts the argmax tensor using Regular Expressions
• Hailo-15:
– Added a new C++ based example application that demonstrates the use of the Hailo-15 API Link
   Page 8        Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
– This release is aligned with the Hailo-15 Vision Processor Software Package 2024-07
• Hailo-8:
– Added a new example application which demonstrates x86 hardware-accelerated multi-stream detection
    •   hailooverlay now properly supports Hailo-15 with a new DMABuf sync mechanism
    •   hailovideoscale (Hailo-15 Element) now supports the letterbox property
v3.28.0 (April 2024)
• Tappas was updated in this version, with a revised list of supported platform and apps
• Added a new Hailo-15 external host application that saves udp stream to file
• Updated the Hailo-15 applications to use the updated Media Library implementation:
– Detection
• Added a folder for external host scripts and added the UDP Stream Display script
Note: TAPPAS supports both Hailo-15 and Hailo-8. Temporarily, in this version, only the following Hailo-8 based
example applications are supported:
• Detection
– yolov5
– mobilenet_ssd
• Multi-Stream Detection
– Multi-Stream Detection
   Page 9        Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
These applications are supported under the general folder (x86-based platforms).
    • Updated OSD configuration to support new dynamic features and adjust to the updated Media Library imple-
      mentation
– Detection
– Fixed an issue with Face Recognition which prevented faces to be recognized ins some scenarios
• Updated Yolo networks to use the HailoRT native post-process (selected models)
– Multi-Stream Detection
    • Added a TAPPAS Graphic User Interface to easily run selected general example applications (preview) on the
      TAPPAS Docker - to activate it, run tappas-gui
  Page 10       Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
• New Apps:
         – Added x86_hw_accelerated example pipelines that use Video Acceleration API (VA-API) over Intel proces-
           sors that support Quick Sync:
              *   Video Management System - a pipeline that demonstrates a VMS application which runs several
                  streams and different tasks - Face Recognition, Face Attributes and Person Attributes. Currently this
                  example pipeline is supported on Ubuntu 22.04 only
* Multi-stream detection
* Century
– Pose Estimation pipeline with two cascading networks - Person detection and single person pose estimation
– Face recognition
         – Updated i.MX6 Object Detection App - New network, updated the pipeline to include i.MX6 hardware
           acceleration
– yolact_regnetx_1.6gf
    • New element hailoimportzmq - provides an entry point for importing metadata exported by hailoexportzmq
      (HailoObjects) into the pipeline
• Added Depth Estimation, Object Detection and Classification pipelines for i.MX6 Pipelines
• New Apps:
         – Multi-stream detection that uses HailoRT Stream Multiplexer - Demonstrates the usage of HailoRT stream
           multiplexer (preview)
    • New elements - hailoexportfile and hailoexportmq which provide an access point in the pipeline to export meta-
      data (HailoObjects)
• Improved pipeline profiling by adding new tracers and replacing the GUI of gst-shark
• New Apps:
– Detection every X frames pipeline - Demonstrates the ability of skipping frames using a tracker
• New Apps:
   Page 11     Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
• New Apps:
         – Added Cascading networks, Depth Estimation, Pose Estimation and Semantic Segmentation pipelines for
           i.MX Pipelines
• Added an option to control post-process parameters via a JSON configuration for the detection application
• New Apps:
– LPR (License Plate Recognition) pipeline and facial landmark pipeline for i.MX Pipelines
• New Apps:
• New Apps:
– Hailo Century app - Demonstrates detection on one video file source over 6 different Hailo-8 devices
• New Elements:
  Page 12      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
• New Apps:
• New Apps:
• New Apps:
– Retinaface
• Control Element Integration - Displaying device stats inside a GStreamer pipeline (Power, Temperature)
• New Yocto recipes - Compiling our GStreamer plugins is now available as a Yocto recipe
• Added a C++ detection example (native C++ example for writing an app, without GStreamer)
• Segmentation app
• Classification app
• Detection app
  Page 13      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
2. Installation
Note: This section does not apply to Hailo SW Suite users since HailoRT is already installed.
Confirm that hailo has been identified correctly by running this command:   hailortcli fw-control iden-
tify, The expected output should look similar to the one below:
$ hailortcli fw-control identify
Identifying board
Control Protocol Version: 2
Firmware Version: X.X.X (develop,app)
Logger Version: 0
Board Name: Hailo-8
Device Architecture: HAILO8_B0
Serial Number: 0000000000000009
Part Number: HM218B1C2FA
Product Name: HAILO-8 AI ACCELERATOR M.2 M KEY MODULE
To get started, go to the Hailo Developer Zone and enter the SW Suite download page. From there you can download
your prefered version of the Hailo SW Suite. If this is your first time in the Developer Zone, you will be
asked to register to the site before downloads are enabled, login and then you will be able to download the package.
There are three options for installing the Suite:   Docker installation, Manual installation, and a Self
Extractable installation.
  Page 14      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
The instructions can be found for all installation flows, along with their required pre-requisites and sanity checks, in
the Hailo Developer Zone.
This is all that is required to start the installation. TAPPAS is included in the SW Suite, so by installing the
Suite you should now have the corresponding version of TAPPAS installed inside.
Note that the TAPPAS system requirements are documented in the Required Packages section Here.
The section below would help you with the installation of Docker.
# Install curl
sudo apt-get install -y curl
# Add your user (who has root privileges) to the Docker group
sudo usermod -aG docker $USER
Note: Consider reading Running out of disk space if your system is space limited
Preparations
HailoRT PCIe driver is required - install instructions are provided in HailoRT documentation. Make sure that the driver
is installed correctly by: Verify Hailo installation.
Note: The TAPPAS container already contains the required HailoRT version pre-installed.
Download from Hailo developer zone      tappas_VERSION_ARCH_docker.zip and unzip the file,                     it should
contain the following files:
  Page 15       Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
In order to use TAPPAS release Docker image, you should run the following script:
The script would load the docker image, and start a new container. The script might take a couple of minutes, and
after that, you are ready to go.
From now an on you should run the script with the --resume flag
./run_tappas_docker.sh --resume
Note: The reason that you want to use the --resume flag is that the container already exists, so only attaching to
the container is required.
./run_tappas_docker.sh [options]
Options:
  --help       Show this help
  --tappas-image    Path to tappas image
  --resume       Resume an old container
  --container-name Start a container with a specific name, defaults to hailo_tappas_
 ,→container
Use-cases
./run_tappas_docker.sh --resume
for example:
  Page 16      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
Note: TAPPAS requires a specific HailoRT version, therefore, you will might need to upgrade HailoRT version as well.
To check which HailoRT version is supported, please visit This Link
2.3.4. Troubleshooting
Creating new docker containers with --override does not assure that the directory of cached images and con-
tainers is cleaned. to prevent your system to ran out of memory and clean /var/lib/docker run docker system
prune from time to time.
Change Docker root directory - By default, Docker stores most of its data inside the /var/lib/docker directory
on Linux systems. There may come a time when you want to move this storage space to a new location. For example,
the most obvious reason might be that you’re running out of disk space.
ExecStart=/usr/bin/dockerd -H fd://
Edit the line by putting a -g and the new desired location of your Docker directory. When you’re done making this
change, you can save and exit the file.
If you haven’t already, create the new directory where you plan to move your Docker files to.
Next, reload the systemd configuration for Docker, since we made changes earlier. Then, we can start Docker.
  Page 17       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
Just to make sure that it worked, run the ps command to make sure that the Docker service is utilizing the new
directory location.
In some sceneraios (especially aarch64), you might face the following error:
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libgomp.so.1
2.4. Yocto
This section will guide through the integration of Hailo’s Yocto layer’s into your own Yocto environment.
Two layers are provided by Hailo, the first one is meta-hailo which compiles the        HailoRT sources, and the
second one is meta-hailo-tappas which compiles the TAPPAS sources.
meta-hailo-tappas is a layer that based un-top of meta-hailo that adds TAPPAS recipes.
The layers are stored in Meta-Hailo Github, with branch for each supported yocto release:
 Warning: On i.MX8-based devices Kirkstone branch does not support OpenGL, therefore, the Kirkstone applica-
 tions portfolio is reduced.
2.4.1. Setup
HailoRT
BBLAYERS += ” ${BSPDIR}/sources/meta-hailo/meta-hailo-accelerator \
       ${BSPDIR}/sources/meta-hailo/meta-hailo-libhailort”
  Page 18      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
TAPPAS
BBLAYERS += ”${BSPDIR}/sources/meta-hailo/meta-hailo-tappas”
Run bitbake and build your image. After the build successfully finished, burn the Image to your embedded device.
Note: building on non-IMX devices: To increase the performance of our applications, we patched imx gstreamer-
plugins-base. In non-IMX devices you may encounter an error indicating that recipes under meta-hailo-
tappas/recipes-multimedia/gstreamer/ cannot be parsed. In this case remove this directory under
the meta-hailo-tappas layer, and re-build the image.
rm -rf meta-hailo/meta-hailo-tappas/recipes-multimedia/gstreamer/
Make sure that the following conditions have been met on the target device:
2.4.3. Recipes
libgsthailo
Hailo’s GStreamer plugin for running inference on the hailo8 chip. Depends on libhailort and GStreamer.
The recipe compiles and copies the libgsthailo.so file to /usr/lib/gstreamer-1.0 on the target
device’s root file system, make it loadable by GStreamer as a plugin.
  Page 19      Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
libgsthailotools
Hailo’s TAPPAS gstreamer elements. Depends on libgsthailo, GStreamer, opencv, xtensor and xtl. The
source files located in the TAPPAS release under core/hailo. The recipe compiles with meson and copies the
libgsthailotools.so file to /usr/lib/gstreamer-1.0 on the target device’s root file system.
tappas-apps
Hailo’s TAPPAS embedded application recipe, including GStreamer apps for embedded. The recipe copies the app
script, the hef and media files to /home/root/apps/. Depends on GStreamer, opencv, cxxopts, xtensor and xtl.
hailo-post-processes
The recipe compiles and copies the post processes to     /usr/lib/hailo-post-processes.            Deppends on
opencv, xtensor, xtl, rapidjson and cxxopts.
tappas-tracers
Hailo’s TAPPAS gstreamer tracers. Depends on libgsthailo and GStreamer. The source files located
in the TAPPAS release under core/hailo/tracers. The recipe compiles with meson and copies the
libgsthailotracers.so file to /usr/lib/gstreamer-1.0 on the target device’s root file system.
For instructions on how to use the tracers on a yocto built machine, see debugging
2.4.4. Troubleshooting
If the device does not appear after running lspci, there may be two possible reasons:
• Symptom:
• Symptom:
Solution:
Symptom:
On some imx devices you need to manually configure the u-boot to show video using HDMI port.
Solution:
To fix this issue you should set the u-boot to use HDMI port, defining the resolution, FPS and output format. The
configuration is “added” (do not override this) to the mmcargs:
  Page 20         Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
The manual installation of TAPPAS requires preparation, Hailo’s recommended method is to begin with Hailo SW
Suite or Pre-built Docker image. This guide will instruct how to install the required components manually.
First HailoRT + HailoRT PCIe driver, needs to be installed. Follow the HailoRT installation guide for further instructions.
After the installation, confirm that HailoRT is working correctly.
2.5.2. Preparations
x86
Unzip tappas_VERSION_linux_installer.zip
unzip tappas_VERSION_linux_installer.zip
Non-x86
unzip tappas_VERSION_linux_installer.zip
2. Change the directory to TAPPAS, and create a directory named hailort and clone HailoRT sources
      cd `tappas_VERSION`
      mkdir hailort
      git clone https://github.com/hailo-ai/hailort.git hailort/sources
Note: In some cases, HailoRT (which is installed via TAPPAS) is not the latest version, while the driver, which was
installed before HailoRT and TAPPAS - has a different version. In these cases, this error will occur:
“Could not find a configuration file for package “HailoRT” that exactly matches requested version.”
Meaning, HailoRT library and driver installed versions are mismatched - while they are required to be fully identical.
In such a case - re-install the driver version which is compatible to your installed HailoRT version.
  Page 21       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
The following APT packages need to be installed, using the command below:
• ffmpeg
• x11-utils
• python3-virtualenv
• python-gi-dev
• libgirepository1.0-dev
• cmake
• libzmq3-dev
• git
• rsync
The following packages are required as well, and their installation instructions can be viewed from the links below:
• OpenCV installation.
• GStreamer installation.
• PyGobject installation.
In case any requirements are missing, a requirements table will be printed when calling manual installation.
Tip: If you are running on an old OS the apt-get version might be too old (You will be notified on the next steps), you
can install OpenCV manually as shown below.
  Page 22         Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
num_cores_to_use=$(($(nproc)/2))
make -j$num_cores_to_use
sudo make install
Please refer to: GStreamer official installation guide for more details
Please refer to: PyGobject official installation guide for more details
  Page 23       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
./install.sh --skip-hailort
Raspberry Pi 4 has its own set of example applications, so the installation command on this platform is slightly differ-
ent:
On Rockchip, run:
rm -rf ~/.cache/gstreamer-1.0/
rm /usr/lib/$(uname -m)-linux-gnu/gstreamer-1.0/libgsthailotools.so
2.5.9. Troubleshooting
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libgomp.so.1
If you encounter the following error: (actual page size might vary)
Some hosts doesn’t support certain PCIe descriptor page size. in order to overcome this issue add the text below to
/etc/modprobe.d/hailo_pci.conf (create the file if it doesn’t exist)
  Page 24       Release 3.31.0          Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
Reboot the machine for this change to take effect. You can also reload the driver without rebooting by running the
following commands:
modprobe -r hailo_pci
modprobe hailo_pci
2.6.1. Overview
• Architecture: arm64
  Page 25      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
Read through on how to pre build docker image for Raspberry Pi or installing TAPPAS manually
Note: Raspberry Pi we limit the number of cpu cores to 1 during compilation (more cores accelerates the compilation
process, but may cause ‘out of swap memory’ issue on weak machines like Raspberry Pi)
After installing TAPPAS and HailoRT, A known issue regarding working with display connected via HDMI requires the
following steps:
  Page 26      Release 3.31.0        Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
Note: installing the module manually is required on every boot of the raspberry-pi.
To support TAPPAS apps, enable camera features that support v4l by doing the following steps:
1) Configure Raspicam:
sudo raspi-config
  Page 27      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
vcgencmd get_camera
To read further and learn more more details about each application refer to the link This section
2.6.7. Troubleshooting
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libgomp.so.1
  Page 28       Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
3.1. General
Where to Begin?
For the starting point Hailo provides a Sanity Pipeline that helps verify that the installation phase went well.
Important: Example applications performance varies on different hosts (affected by the host’s processing power
and throughput).
1. Sanity Pipeline - Helps you verify that all the required components are installed correctly
2. Detection - single-stream object detection pipeline on top of GStreamer using the Hailo-8 device.
3. Depth Estimation - single-stream depth estimation pipeline on top of GStreamer using the Hailo-8 device.
4. Instance segmentation - single-stream instance segmentation on top of GStreamer using the Hailo-8 device.
5. Multi-stream detection - Multi stream object detection (up to 8 RTSP camera into one Hailo-8 chip).
6. Face Detection and Facial Landmarking Pipeline - Face detection and then facial landmarking.
  10. License Plate Recognition - LPR app using yolov5m vehicle detection, tiny-yolov4 license plate detection,
      and lprnet OCR extraction with Hailonet network-switch capability.
11. Multi Person Multi Camera Tracking Pipeline - Tracking persons across multiple streams.
Overview
  Page 29       Release 3.31.0        Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
Options
./license_plate_recognition.sh [--show-fps]
Configuration
The yolo post processes parameters can be configured by a json file                              located    in   $TAP-
PAS_WORKSPACE/apps/h8/gstreamer/general/license_plate_recognition/resources/configs
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/license_plate_recognition/license_
 ,→plate_recognition.sh
Models
Method of Operation
The app builds a gstreamer pipeline (described below) and utilizes the scheduling-algorithm property of
its hailonet elements. This notifies the hailonet elements of a request to switch networks on the same device. The
hailonets perform network switching by blocking the sink pads when it is time to switch, turning off one hailonet and
turning on the other. Before turning a hailonet element on, it has to flush the buffers out of the element, this is all
handled internally. read more about hailonet
Pipeline Operation
This section is optional and provides a drill-down into the implementation of the License Plate Recognition
app with a focus on explaining the GStreamer pipeline.
  Page 30          Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
Pipeline Diagram
           –   hailofilter performs the given post-process, chosen with the so-path property. This instance
               is in charge of yolo post-processing.
           –   hailotracker performs JDE Tracking using a kalman filter, applying a unique id to tracked vehicles.
               This element also receives updates of license plate text and associates them to their corresponding
               tracked vehicle.
               read more about hailotracker
           –   tee splits the pipeline into two branches. While one buffer continues the drawing and displaying, the
               other continues to license plate detection and extraction.
                 * hailonet this instance of hailonet performs tiny-yolov4 network inference for license plate de-
                   tection. When initializing the pipeline this instance of hailonet is set to is-active=false.
  Page 31         Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                   TAPPAS User Guide
          –   hailocropper another cropping element, this time the decision making is an image quality
              estimator - if the license plate detection is determined to be too blurry for OCR, then it is dropped. If the
              detection is not too blurry, then a crop of the license plate is taken from the original full HD image and
              sent to for OCR inference.
                * hailonet this intance of hailonet performs lprnet network inference for license plate text extrac-
                     tion. When initializing the pipeline this instance of hailonet is set to is-active=false.
          –   hailofilter captures incoming buffers. From these the ocr text is extracted and sent upstream
              behind the scenes. These events contain both the OCR postprocess results and the unique tracking id of
              the vehicle they were extracted from. The event is caught by the hailotracker element which
              updates the corresponding entry in its tracked vehicle database.
You can use Retraining Dockers (available on Hailo Model Zoo), to replace the following models with ones that are
trained on your own dataset:
    •   yolov5m_vehicles
          – Retraining docker
    •   tiny_yolov4_license_plates
          – Retraining docker
    •   lprnet
          – Retraining docker
                *    Update ocr_postprocess.cpp with your new parameters, then recompile to create libocr_post.
                     so
  Page 32           Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
Depth Estimation
depth_estimation.sh demonstrates depth estimation on one video file source. This is done by running a
single-stream object depth estimation pipeline on top of GStreamer using the Hailo-8 device.
Options
Run
cd /local/workspace/tappas/apps/h8/gstreamer/general/depth_estimation
./depth_estimation.sh
Model
How it works
1. We use tee to show two screens, one with the depth estimation mask applied and one without
Overview
This GStreamer pipeline demonstrates object detection on 8 camera streams over RTSP protocol. This pipeline also
demonstrates using two hailo8 devices in parallel.
All the streams are processed in parallel through the decode and scale phases, and enter the Hailo devices frame by
frame. Each hailo device is in charge of one inference task (one for yolov5 and the other for centerpose)
Afterwards the post-process and drawing phases add the classified object and bounding boxes to each frame. The
last step is to match each frame back to its respective stream and output all of them to the display.
  Page 33          Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
Prerequisites
• TensorPC
• Ubuntu 20.04
• RTSP
Preparations
   1. Before      running,    configuration   of   the   RTSP   camera    sources   is   required.     open     the
        rtsp_detection_and_pose_estimation.sh in edit mode with your preffered editor. Configure
        the eight sources to match your own cameras.
./rtsp_detection_and_pose_estimation.sh
Models
    •   yolov5m_wo_spp_60p         - https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/
        cfg/networks/yolov5m_wo_spp_60p.yaml
    •   centerpose      - https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/networks/
        centerpose_regnetx_1.6gf_fpn.yaml
Configuration
The yolo post process parameters can be configured by a json file located                               in    $TAP-
PAS_WORKSPACE/apps/h8/gstreamer/general/multistream_multidevice/resources/configs/yolov5.json
  Page 34         Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
Retraining Dockers (available on Hailo Model Zoo), can be used to replace the following models with ones that are
trained on your own dataset:
    •   yolov5m
           – Retraining docker
               *    For optimum compatibility and performance with TAPPAS, use for compilation the corresponding
                    YAML file from above.
    •   centerpose
           – Retraining docker
Overview
detection.sh demonstrates detection on one video file source and verifies Hailo’s configuration. This is
    done by running a single-stream object detection pipeline on top of GStreamer using the
        Hailo-8 device.
Options
    •   --network is an optional flag that sets which network to use. Choose from [yolov5, mobilenet_ssd, nanodet,
        yolov8], default is yolov8. This will set which hef file to use, the corresponding hailofilter function,
        and the scaling of the frame to match the width/height input dimensions of the network.
  Page 35          Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
Configuration
In case the selected network is yolo, the app post process parameters can be configured by a json file located in
$TAPPAS_WORKSPACE/apps/h8/gstreamer/general/detection/resources/configs
Supported Networks
      • ‘yolov8m’    -    https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/networks/
        yolov8m.yaml
      • ‘yolov5m_wo_spp_60p’  -  https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/
        networks/yolov5m_wo_spp_60p.yaml
      • ‘mobilenet_ssd’ - https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/networks/
        ssd_mobilenet_v1.yaml
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/detection
./detection.sh
  Page 36       Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
Method of Operation
Retraining Dockers (available on Hailo Model Zoo), can be used to replace the following models with ones that are
trained on the users own dataset:
    •   yolov8m
          – Retraining docker
              *    For optimum compatibility and performance with TAPPAS, use for compilation the corresponding
                   YAML file from above.
              *    For optimum compatibility and performance with TAPPAS, use for compilation the corresponding
                   YAML file from above.
              *    For optimum compatibility and performance with TAPPAS, use for compilation the corresponding
                   YAML file from above.
Overview
Sanity apps purpose is to help verify that all the required components have been installed successfully.
First of all, sanity_gstreamer.sh needs to be run to ensure that the image presented looks like the one that
will be presented later.
  Page 37         Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
Sanity GStreamer
Note: Open the source code in your preferred editor to see how simple this app is.
In order to run the app just cd to the sanity_pipeline directory and launch the app
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/sanity_pipeline
./sanity_gstreamer.sh
If the output is similar to the image shown above, continue to the next verification phase.
face_detection_and_landmarks.sh demonstrates face detection and facial landmarking on one video file source.
        This is done by running a face detection pipeline (infer + postprocessing), cropping and scaling all detected
        faces, and sending them into the 2nd network of facial landmarking. All resulting detections and landmarks
        are then aggregated and drawn on the original frame. The two networks are running using one Hailo-8 device
        with two hailonet elements.
Options
  Page 38        Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/cascading_networks
./face_detection_and_landmarks.sh
Models
Method of Operation
object_detection_and_pose_estimation.sh demonstrates object detection and pose estimation on one video file
          This is done by running an object detection pipeline, cropping and scaling each detected person, and sending
          them into a 2nd network of pose estimation. All resulting detections and landmarks are then aggregated and
          drawn on the original frame. The two networks are running using one Hailo-8 device with two hailonet
          elements.
Options
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/cascading_networks
./object_detection_and_pose_estimation.sh
  Page 39          Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
Model
Joined together:
      • ‘yolov5m_wo_spp_60p’  -  https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/
        networks/yolov5m_wo_spp_60p.yaml
      • ‘mspn_regnetx_800mf’  -  https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/
        networks/mspn_regnetx_800mf.yaml
Method of Operation
Classification
The purpose of classification.sh is to demonstrate classification on one video file source with python post-
processing by running a single-stream object classification pipeline on top of GStreamer
using the Hailo-8 device.
Options
Supported Networks
      • ‘resnet_v1_50’ - https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/networks/
        resnet_v1_50.yaml
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/classification
./classification.sh
Model
      •   resnet_v1_50:              https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/
          networks/resnet_v1_50.yaml
  Page 40          Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
Method of Operation
This app is based on single network pipeline template With a slight modification, instead of using hailofilter for
post-process, hailopython is used.
Overview
Options
./face_recognition.sh
      •   -i --input is an optional flag, a path to an input source (video file / camera device)
      •   --print-gst-launch prints the ready gst-launch command without running it
      •   --show-fps is an optional flag that enables printing FPS on screen
      •   --network to set which network to use. choose from [scrfd_10g, scrfd_2.5g], default is scrfd_10g”
Models
      •   arcface_mobilefacenet: https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_
          zoo/cfg/networks/arcface_mobilefacenet.yaml
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/face_recognition/
./face_recognition.sh
Method of Operation
   1. Face detection and landmarks: Detect faces and predict the locations of key facial landmarks (such as eyes,
           nose, and mouth), in the video stream. The scrfd_10g network is more accurate but computationally
           heavier, while the scrfd_2.5g network is less accurate but more lightweight, providing better performance.
   2. Face alignment: This step involves using the detected landmarks and the original video frame to compute an
           affine transformation that aligns the face with a predefined destination matrix. This ensures that the face
           is consistently positioned in the same way for the next step in the pipeline.
   3. Embedding matrix: Run Arcface network to generate an embedding matrix for each aligned face. An embed-
          ding is a compact representation of the face that captures its unique characteristics. This embedding can
          then be compared to other embeddings to determine the similarity between faces.
  Page 41          Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
   4. Gallery: Use the generated embeddings to find the closest matching face in the local database (named “Local
           Gallery” and stored in a JSON file). This allows the application to identify the person in the video stream.
To add faces to the gallery, you can use the save_face.sh script.
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/face_recognition/
./save_faces.sh
Options:
    •   --network to set which network to use. choose from [scrfd_10g, scrfd_2.5g], default is scrfd_10g
    •   --clean to clean the local gallery file enitrely
The script goes over the .png files in resources/faces directory, and saves each face into the gallery. The
name of the face is determined by the file name.
To use your own video sources and faces, add your images to the resources/faces directory and remove the
original ones. Make sure to use .png format image files and a file name including the name of the person. Also use
–clean option to order the script to clean the gallery file before saving the new faces.
Retraining Dockers (available on Hailo Model Zoo), can be used to replace the following models with ones that are
trained on your own dataset:
    •   scrfd_10g
           – No retraining docker is available.
               *   Update face_detection.cpp (scrfd() function) with your new parameters, then recompile to cre-
                   ate libface_detection_post.so
    •   scrfd_2.5g
           – No retraining docker is available.
               *   Update face_detection.cpp (scrfd() function) with your new parameters, then recompile to cre-
                   ate libface_detection_post.so
    •   arcface_mobilefacenet
           – Retraining docker
  Page 42          Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
Single scale tiling FHD Gstreamer pipeline demonstrates splitting each frame into several tiles which are processed in-
dependently by hailonet element. This method is especially effective for detecting small objects in high-resolution
frames.
Model
The VisDrone dataset consists of only small objects which can be assumed to be always confined within an single tile.
As such it is better suited for running single-scale tiling with little overlap and without additional filtering.
Options
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/tiling
./tiling.sh
Method of Operation
  Page 43          Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                       TAPPAS User Guide
Multi-scale tiling FHD Gstreamer pipeline demonstrates a case where the video and the training dataset includes
objects in different sizes. Dividing the frame to small tiles might miss large objects or “cut” them to small objects. The
solution is to split each frame into number of scales (layers) each includes several tiles.
Multi-scale tiling strategy also allows us to filter the correct detection over several scales. For example we use 3 sets
of tiles at 3 different scales:
In this mode we use 1 + 4 + 9 = 14 tiles for each frame. We can simplify the process by highlighting the main tasks:
Crop -> Inference -> Ppost-process -> Aggregate � Remove exceeded boxes � Remove large landscape � Perform NMS
Model
Options
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/tiling
./multi_scale_tiling.sh
  Page 44            Release 3.31.0           Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                  TAPPAS User Guide
Mode of Operation
As multi scale tiling is almost equal to single scale, the differences are listed below:
TILE_CROPPER_ELEMENT=”hailotilecropper internal-offset=$internal_offset�
 ,→name=cropper tiling-mode=1 scale-level=$scale_level
hailonet hef-path is mobilenet_ssd which is training dataset includes objects in different sizes.
  hailotileaggregator flatten-detections=true iou-threshold=$iou_threshold border-
,→ threshold=$border_threshold name=agg
Retraining Dockers (available on Hailo Model Zoo), can be used to replace the following models with ones that are
trained in the dataset:
     •   mobilenet_ssd
            – Retraining docker
Overview
century.sh demonstrates detection on one video file source over multiple Hailo-8 devices, either using the
Century platform, or other multi device configurations (i.e., multiple M.2 modules connected directly to the same
host). While this application defaults to 4 devices, any number of Hailo-8 devices are supported.
This pipeline runs the detection network Yolov5.
Options
  Page 45           Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                  TAPPAS User Guide
Configuration
The app post process parameters can be configured by a json                             file   located   in   $TAP-
PAS_WORKSPACE/apps/h8/gstreamer/general/century/resources/configs/yolov5.json
Supported Networks
      • ‘yolov5m_wo_spp_60p’  -  https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/
        networks/yolov5m_wo_spp_60p.yaml
      • ‘yolox_l_leaky’ - https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/networks/
        yolov5m_wo_spp_60p.yaml
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/century
./century.sh
How it works
You can use Retraining Dockers (available on Hailo Model Zoo), to replace the following models with ones that are
trained on your own dataset:
      •   yolov5m
            – Retraining docker
            – For optimum compatibility and performance with TAPPAS, use for compilation the corresponding YAML
              file from above.
      •   yolox_l_leaky
            – Retraining docker
            – For optimum compatibility and performance with TAPPAS, use for compilation the corresponding YAML
              file from above.
  Page 46           Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                  TAPPAS User Guide
Overview
instance_segmentation.sh demonstrates instance segmentation on one video file source and verifies Hailo’s configura
    This is done by running a single-stream instance segmentation pipeline on top of
          GStreamer using the Hailo-8 device.
Options
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/instance_segmentation
./instance_segmentation.sh
Model
      •   yolov5n_seg - https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/networks/
          yolov5n_seg.yaml
Method of Operation
Retraining Dockers (available on Hailo Model Zoo), can be used to replace the following models with ones that are
trained on your own dataset:
      •   yolov5n_seg
             – No retraining docker is available.
  Page 47            Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
Overview
This GStreamer pipeline demonstrates object detection on multiple camera streams over RTSP protocol / Files.
All the streams are processed in parallel through the decode and scale phases, and enter the Hailo device frame by
frame.
Afterwards post-process and drawing phases add the classified object and bounding boxes to each frame. The last
step is to match each frame back to its respective stream and output all of them to the display.
Prerequisites
• TensorPC
Preparations
In case of using RTSP cameras, configuration of the RTSP camera sources is required before running. open the
multi_stream_detection_rtsp.sh in edit mode with your preferred editor. Configure the eight sources
to match your own cameras.
./multi_stream_detection.sh
OR
./multi_stream_detection_rtsp.sh
     4.   --set-live-source Use the actual source data given (example: /dev/video2). this flag is optional. if it’s
          in use, num_of_sources is limited to 4.
  Page 48          Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
Supported Networks
    • ‘yolov8m’    -       https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/networks/
      yolov8m.yaml
    • ‘yolov5m_wo_spp_60p’  -  https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/
      networks/yolov5m_wo_spp_60p.yaml
    • ‘yolovx_l_leaky’ - https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/networks/
      yolovx_l_leaky.yaml
    •   rtspsrc Makes a connection to an rtsp server and read the data. Used as a src to get the video stream from
        rtsp-cameras.
    • This application shows the usage of the HailoRT Stream Multiplexer. This feature controls the time shared
      on the Hailo device between all streams. The Stream Multiplexer is enabled by the Hailonet scheduling-
      algorithm property when in use in multiple Hailonet elements that run the same HEF file. When the Stream
      Multiplexer is in use, there is no need to use funnel and streamiddemux like elements because the logic
      is handled internally.
  Page 49        Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
Retraining Dockers (available on Hailo Model Zoo), can be used to replace the following models with ones that are
trained on the users own dataset:
    •   yolov8m
          – Retraining docker
              *   For optimum compatibility and performance with TAPPAS, use for compilation the corresponding
                  YAML file from above.
              *   For optimum compatibility and performance with TAPPAS, use for compilation the corresponding
                  YAML file from above.
          – For optimum compatibility and performance with TAPPAS, use for compilation the corresponding YAML
            file from above.
Overview
  Page 50         Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                  TAPPAS User Guide
Options
./multi_person_multi_camera_tracking.sh [--show-fps]
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/multi_person_multi_camera_tracking
./multi_person_multi_camera_tracking.sh
Expected output:
Models
Method of Operation
Pipeline Diagram
   Page 51         Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
Retraining Dockers (available on Hailo Model Zoo), can be used to replace the following models with ones that are
trained in the User’s dataset:
    •   yolov5s_personface
          – Retraining docker
    •   repvgg_a0_person_reid_2048
          – Retraining docker
* Update re_id.cpp with your new parameters, then recompile to create libre_id.so
Overview
GStreamer has many plugins that support hardware acceleration for a large number of devices via several acceler-
ation packages. The hardware acceleration can be used for decoding/encoding operations, color convert, scaling,
compositing etc.
On x86 based devices, one of the main plugins for hardware acceleration is vaapi plugin, that uses the VA-API hw
acceleration library.
For more information about VA-API and device compatibility: VAAPI (Video Acceleration API)
The applications under the x86_hw_accelerated directory are using the vaapi gstreamer plugin and dependent on it.
In order to verify your device is compatible and supports the x86 hardware acceleration in gstreamer (AKA VA-API),
please use the following guide.
To determine if your CPU has integrated graphics you can follow the following guide
To find out what is the generation of your Intel cpu and also whether it has integrated graphics:
2. Take the model name and search for it in the Intel Ark
  Page 52         Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
4. If the page of the specific processor has a Processor Graphics section, it has integrated graphics.
Highlighted are the Processor Graphics section and the CPU’s generation.
   3. Hailo provides a Sanity Pipeline that helps you verify that the installation phase went well. This is a good starting
      point.
Supported Pipelines
1. Sanity Pipeline - Helps you verify that all the required components are installed correctly
Overview
Sanity apps purpose is to help you verify that all the required components have been installed successfully. This
sanity app helps you to verify that the x86 accelerators are installed correctly.
First of all, you would need to run   sanity.sh and make sure that the image presented looks like the one that
would be presented later.
  Page 53       Release 3.31.0        Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
Sanity GStreamer
Note: Open the source code in your preferred editor to see how simple this app is.
In order to run the app just cd to the sanity directory and launch the app
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/x86_hw_accelerated/sanity
./sanity.sh
If the output is similar to the image shown above, you are good to go to the next verification phase!
Overview
All the streams are processed in parallel through the decode and scale phases, and enter the Hailo device frame by
frame.
Afterwards postprocess and drawing phases add the classified object and bounding boxes to each frame. The last
step is to match each frame back to its respective stream and output all of them to the display.
Prerequisites
• RSC101
  Page 54       Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
Preparations
./multistream_detection.sh
   3.   --network If specified, set the network to use. Choose from [yolov5, yolox, yolov8], default is yolov5.
   4.   --device-count If specified, set the number of devices to use. Default (and maximum value) is the min-
        imum between 4 and the number of devices on machine.
Supported Networks
    • ‘yolov8m’    -       https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/networks/
      yolov8m.yaml
    • ‘yolov5m_wo_spp_60p’  -  https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/
      networks/yolov5m_wo_spp_60p.yaml
    • ‘yolovx_l_leaky’ - https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/networks/
      yolovx_l_leaky.yaml
  Page 55        Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
    • This application shows the usage of the HailoRT Stream Multiplexer. This feature controls the time shared
      on the Hailo device between all streams. The Stream Multiplexer is enabled by the Hailonet scheduling-
      algorithm property when in use in multiple Hailonet elements that run the same HEF file. When the Stream
      Multiplexer is in use, there is no need to use funnel and streamiddemux like elements because the logic
      is handled internally.
Retraining Dockers (available on Hailo Model Zoo), can be used to replace the following models with ones that are
trained on the users own dataset:
    •   yolov8m
          – Retraining docker
              *    For optimum compatibility and performance with TAPPAS, use for compilation the corresponding
                   YAML file from above.
              *    For optimum compatibility and performance with TAPPAS, use for compilation the corresponding
                   YAML file from above.
          – For optimum compatibility and performance with TAPPAS, use for compilation the corresponding YAML
            file from above.
Overview
century.sh demonstrates detection on one video file source over multiple Hailo-8 devices, either using the
Century platform, or other multi device configurations (i.e., multiple M.2 modules connected directly to the same
host). While this application defaults to 4 devices, any number of Hailo-8 devices are supported.
This pipeline runs the detection network Yolov5.
  Page 56         Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                   TAPPAS User Guide
Options
Configuration
The app post process parameters can be configured by a json                                 file   located   in   $TAP-
PAS_WORKSPACE/apps/h8/gstreamer/general/century/resources/configs/yolov5.json
Supported Networks
      • ‘yolov5m_wo_spp_60p’  -  https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/
        networks/yolov5m_wo_spp_60p.yaml
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/general/century
./century.sh
You can use Retraining Dockers (available on Hailo Model Zoo), to replace the following models with ones that are
trained on your own dataset:
      •   yolov5m
             – Retraining docker
             – For optimum compatibility and performance with TAPPAS, use for compilation the corresponding YAML
               file from above.
  Page 57            Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
3.3. i.MX8
 Warning: The Kirkstone applications portfolio is reduced on i.MX8-based devices, since the Kirkstone branch
 does not support OpenGL.
1. Detection - single-stream object detection pipeline on top of GStreamer using the Hailo-8 device.
2. Depth Estimation - single-stream depth estimation pipeline on top of GStreamer using the Hailo-8 device.
3. Face Detection and Facial Landmarking Pipeline - Face detection and then facial landmarking.
   4. License Plate Recognition - LPR app using yolov5m vehicle detection, tiny-yolov4 license plate detection,
      and lprnet OCR extraction with Hailonet network-switch capability.
face_detection_and_landmarks.sh demonstrates face detection and facial landmarking on one video file source.
          This is done by running a face detection pipeline (infer + postprocessing), cropping and scaling all detected
          faces, and sending them into the 2nd network of facial landmarking. All resulting detections and landmarks
          are then aggregated and drawn on the original frame. The two networks are running using one Hailo-8 device
          with two hailonet elements.
Options
Run
cd /home/root/apps/cascading_networks
./face_detection_and_landmarks.sh
Models
  Page 58          Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
Method of Operation
object_detection_and_pose_estimation.sh demonstrates object detection and pose estimation on one video file
          This is done by running an object detection pipeline, cropping and scaling each detected person, and sending
          them into a 2nd network of pose estimation. All resulting detections and landmarks are then aggregated and
          drawn on the original frame. The two networks are running using one Hailo-8 device with two hailonet
          elements.
Options
Run
cd $TAPPAS_WORKSPACE/apps/gstreamer/general/cascading_networks
./object_detection_and_pose_estimation.sh
Model
Joined together:
      • ‘yolov5m_wo_spp_60p’  -  https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/
        networks/yolov5m_wo_spp_60p.yaml
      • ‘mspn_regnetx_800mf’  -  https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/
        networks/mspn_regnetx_800mf.yaml
Method of Operation
Depth Estimation
depth_estimation.sh demonstrates depth estimation on one video file source. This is done by running a
single-stream object depth estimation pipeline on top of GStreamer using the Hailo-8 device.
  Page 59          Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
Options
Run
cd /home/root/apps/depth_estimation
./depth_estimation.sh
Model
How it works
Overview
Our requirement from this pipeline is a real-time high-accuracy object detection to run on a single video stream using
an embedded host. The required input video resolution was HD (high definition, 720p).
The chosen platform for this project is based on NXP’s i.MX8M ARM processor. The Hailo-8TM AI processor is con-
nected to it as an AI accelerator.
  Page 60          Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
Drill Down
Although the i.MX8M is a capable host, processing and decoding real-time HD video is bound to utilize a lot of the
CPU’s resources, which may eventually reduce performance. To solve this problem, most of the vision pre-processing
pipeline has been offloaded to the Hailo-8 device in our application.
The camera sends the raw video stream, encoded in YUV color format using the YUY2 layout. The data passes through
Hailo’s runtime software library, called HailoRT, and through Hailo’s PCIe driver. The data’s format is kept unmodified,
and it is sent to the Hailo-8 device as is.
Hailo-8’s NN core handles the data preprocessing, which includes decoding the YUY2 scheme, converting from the
YUV color space to RGB and, finally, resizing the frames into the resolution expected by the deep learning detection
model.
The Hailo Dataflow Compiler supports adding these pre-processing stages to any model when compiling it. In this
case, they are added before the YOLOv5m detection model.
Options
    •   --input is an optional flag, path to the video camera used (default is /dev/video2).
    •   --show-fps is an optional flag that enables printing FPS on screen.
    •   --print-gst-launch is a flag that prints the ready gst-launch command without running it”
  Page 61        Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                  TAPPAS User Guide
Configuration
The app post process parameters can be configured by a json                             file   located   in   $TAP-
PAS_WORKSPACE/apps/h8/gstreamer/imx8/detection/resources/configs/yolov5.json
Run
./detection.sh
Model
How it works
Links
You can use Retraining Dockers (available on Hailo Model Zoo), to replace the following models with ones that are
trained on your own dataset:
      •   yolov5m_wo_spp_yuv
            – Retraining docker
  Page 62           Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                   TAPPAS User Guide
Overview
Configuration
The yolo post processes parameters can be configured by a json file                            located   in   $TAP-
PAS_WORKSPACE/apps/h8/gstreamer/general/license_plate_recognition/resources/configs
Configuration
The yolo post processes parameters can be configured by a json file                            located   in   $TAP-
PAS_WORKSPACE/apps/h8/gstreamer/general/license_plate_recognition/resources/configs
Run
./apps/license_plate_recognition/license_plate_recognition.sh
Models
This app uses HailoRT Model Scheduler, read more about HailoRT Model Scheduler GStreamer integration at HailoNet
You can use Retraining Dockers (available on Hailo Model Zoo), to replace the following models with ones that are
trained on your own dataset:
      •   yolov5m_vehicles
             – Retraining docker
  Page 63            Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
    •   tiny_yolov4_license_plates
           – Retraining docker
    •   lprnet
           – Retraining docker
               *   Update ocr_postprocess.cpp with your new parameters, then recompile to create libocr_post.
                   so
3.4. Raspberry Pi
That’s a great question! Hailo provides a Sanity Pipeline that helps you verify that the installation phase went well. This
is a good starting point.
1. Sanity Pipeline - Helps you verify that all the required components are installed correctly
2. Detection - single-stream object detection pipeline on top of GStreamer using the Hailo-8 device.
3. Depth Estimation - single-stream depth estimation pipeline on top of GStreamer using the Hailo-8 device.
Depth Estimation
depth_estimation.sh demonstrates depth estimation on one video file source. This is done by running a
single-stream object depth estimation pipeline on top of GStreamer using the Hailo-8 device.
Options
  Page 64          Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
Run
cd /local/workspace/tappas/apps/h8/gstreamer/raspberrypi/depth_estimation
./depth_estimation.sh
Model
How it works
1. We use tee to show two screens, one with the depth estimation mask applied and one without
Overview
detection.sh demonstrates detection on one video file source and verifies Hailo’s configuration. This is
    done by running a single-stream object detection pipeline on top of GStreamer using the
          Hailo-8 device.
Options
      •   --input is an optional flag, a path to the video file displayed (default is detection.mp4).
      •   --network is a flag that sets which network to use. choose from [yolov5, mobilenet_ssd], default is yolov5.
          this will set the hef file to use, the hailofilter function to use and the scales of the frame to match the
          width and heigh input dimensions of the network.
  Page 65          Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                  TAPPAS User Guide
Configuration
In case the selected network is yolo, the app post process parameters can be configured by a json file located in
$TAPPAS_WORKSPACE/apps/h8/gstreamer/raspberrypi/detection/resources/configs/yolov5.json
Supported Networks
      • ‘yolov5m_wo_spp_60p’  -  https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/
        networks/yolov5m_wo_spp_60p.yaml
      • ‘mobilenet_ssd’ - https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/networks/
        ssd_mobilenet_v1.yaml
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/raspberrypi/detection
./detection.sh
How it works
You can use Retraining Dockers (available on Hailo Model Zoo), to replace the following models with ones that are
trained on your own dataset:
      •   yolov5m
            – Retraining docker
                *   For optimum compatibility and performance with TAPPAS, use for compilation the corresponding
                    YAML file from above.
      •   mobilenet_ssd
            – Retraining docker
  Page 66           Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
Overview
Sanity apps purpose is to help you verify that all the required components have been installed successfully.
First of all, you would need to run sanity_gstreamer.sh and make sure that the image presented looks like
the one that would be presented later.
Sanity GStreamer
Note: Open the source code in your preferred editor to see how simple this app is.
In order to run the app just cd to the sanity_pipeline directory and launch the app
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/raspberrypi/sanity_pipeline
./sanity_gstreamer.sh
If the output is similar to the image shown above, you are good to go to the next verification phase!
  Page 67         Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
3.5. Rockchip
1. Detection - single-stream object detection pipeline on top of GStreamer using the Hailo-8 device.
   2. License Plate Recognition - LPR app using yolov5m vehicle detection, tiny-yolov4 license plate detection,
      and lprnet OCR extraction with Hailonet network-switch capability.
3. Multistream Detection - multistream detection with multi stream out using rockchip elements
Overview
detection.sh demonstrates detection on one video file source and verifies Hailo’s configuration, by running a
single-stream object detection pipeline on top of GStreamer using the Hailo-8 device.
Options
    •   --network is an optional flag that sets which network to use. Choose from [yolov5, nanodet], default is
        yolov5. This will set which hef file to use, the corresponding hailofilter function, and the scaling of
        the frame to match the width/height input dimensions of the network.
Configuration
In case the selected network is yolo, the app post process parameters can be configured by a json file located in
$TAPPAS_WORKSPACE/apps/h8/gstreamer/rockchip/detection/resources/configs
Supported Networks
    • ‘yolov5m_wo_spp_60p’  -  https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/
      networks/yolov5m_wo_spp_60p.yaml
  Page 68        Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                  TAPPAS User Guide
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/rockchip/detection
./detection.sh
Method of Operation
Retraining Dockers (available on Hailo Model Zoo), can be used to replace the following models with ones that are
trained in the dataset:
      •   yolov5m
            – Retraining docker
                *   For optimum compatibility and performance with TAPPAS, use for compilation the corresponding
                    YAML file from above.
  Page 69           Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                  TAPPAS User Guide
Overview
Options
./license_plate_recognition.sh [--show-fps]
Configuration
The yolo post processes parameters can be configured by a json file                               located    in   $TAP-
PAS_WORKSPACE/apps/h8/gstreamer/rockchip/license_plate_recognition/resources/configs
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/rockchip/license_plate_recognition/
 ,→license_plate_recognition.sh
Models
  Page 70            Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
The app builds a gstreamer pipeline (that is explained below) and utilizes the scheduling-algorithm property
of its hailonet elements. This lets the hailonet elements know that we wish to switch networks on the same device.
The hailonets perform network switching by blocking their sink pads when it is time to switch: turning off one hailonet
and turning on the other. Before turning a hailonet element on, it has to flush the buffers out of the element, this is
all handled internally. read more about hailonet
This section is optional and provides a drill-down into the implementation of the License Plate Recognition
app with a focus on explaining the GStreamer pipeline.
Pipeline Diagram
           –   hailofilter performs the given postprocess, chosen with the so-path property. This instance
               is in charge of yolo post processing.
           –   hailotracker performs JDE Tracking using a kalman filter, applying a unique id to tracked vehicles.
               This element also receives updates of license plate text and associates them to their corresponding
               tracked vehicle.
               read more about hailotracker
           –   tee splits the pipeline into two branches. While one buffer continues the drawing and displaying, the
               other continues to license plate detection and extraction.
  Page 71         Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                    TAPPAS User Guide
           –   hailocropper crops vehicle detections from the original full HD image and resizes them to the
               input size of the following hailonet (license plate detection). Extra decision making is applied to only
               pass vehicles that have not had license plate detected and text extracted yet.
               read more about hailocropper
                 * hailonet this intance of hailonet performs tiny-yolov4 network inference for license plate detec-
                      tion. When initializing the pipeline this instance of hailonet is set to is-active=false.
                 * hailonet this intance of hailonet performs lprnet network inference for license plate text extrac-
                      tion. When initializing the pipeline this instance of hailonet is set to is-active=false.
           –   hailofilter captures incoming buffers. From these the ocr text is extracted and sent upstream
               behind the scenes. These events contain both the OCR postprocess results and the unique tracking id of
               the vehicle they were extracted from. The event is caught by the hailotracker element which
               updates the corresponding entry in its tracked vehicle database.
Retraining Dockers (available on Hailo Model Zoo), can be used to replace the following models with ones that are
trained in the dataset:
    •   yolov5m_vehicles
           – Retraining docker
    •   tiny_yolov4_license_plates
           – Retraining docker
  Page 72            Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
    •   lprnet
           – Retraining docker
               *    Update ocr_postprocess.cpp with the new parameters, then recompile to create libocr_post.
                    so
Overview
This GStreamer pipeline demonstrates object detection on multiple camera streams over RTSP protocol / files. All the
streams are processed in parallel via the hardware accelerated decoder, and after scaling, the frames are sent to the
Hailo chip frame by frame.
After postprocess and optional drawing phases, the classified object and bounding boxes are added to each frame.
Each frame is then separated by the input stream, the Hailo meta data is saved to a .json file, the image stream is
encoded and sent to a remote host. On the remote host, the RTP server receives the data from each stream.
This pipeline uses the Rockchip mpp elements for hardware-accelerated decoding and encoding capabilities.
Read more about RTSP: RTSP Read more about MPP: MPP
Prerequisites
• Firefly ITX-3588J
Preparations
Before running the pipeline,   configuration of the RTSP camera sources are required.         Open the
multi_stream_detection_rtsp.sh              in edit mode with your preferred editor. Configure the eight
sources to match your own cameras.
./rtp-src_streams.sh
./multi_stream_detection.sh
  Page 73          Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                   TAPPAS User Guide
OR
./multi_stream_detection_rtsp.sh
     1.   --num-of-sources Sets the number of sources to use by given input.            The default and recommended
          value in this pipeline is 10 “
     2.   --use-overlay If set the pipeline will print the bounding boxes after post processing, it may affect the
          application performance on streams which have a large amount of detections.
     3.   --udp-sink-ip Sets the ip of the remote host to send the video streams after processing.
The output should look like:
Configuration
The app post process parameters can be configured by a json file located                                    in   $TAP-
PAS_WORKSPACE/apps/h8/gstreamer/rockchip/multistream_detection/resources/configs/yolov5.json
Supported Networks
      • ‘yolov5s_nv12’ - https://github.com/hailo-ai/hailo_model_zoo/blob/master/hailo_model_zoo/cfg/networks/
        yolov5s_nv12.yaml
      •   rtspsrc Makes a connection to an rtsp server and read the data. Used as a src to get the video stream from
          rtsp-cameras.
      •   mppvideodec Decodes the input h264 encoded stream using the MPP to allow for HW acceleration.
      •   mpph264enc Encodes the input video stream in to h264 video stream using the MPP to allow for HW accel-
          eration.
Single scale tiling FHD Gstreamer pipeline demonstrates splitting each frame into several tiles which are processed in-
dependently by hailonet element. This method is especially effective for detecting small objects in high-resolution
frames.
  Page 74            Release 3.31.0        Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                 TAPPAS User Guide
Model
The VisDrone dataset consists of only small objects which we can assume are always confined within an single tile.
As such it is better suited for running single-scale tiling with little overlap and without additional filtering.
Options
Run
cd $TAPPAS_WORKSPACE/apps/h8/gstreamer/rockchip/tiling
./tiling.sh
How it works
  Page 75          Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
4.1. Overview
This application serves as reference code for developers who wish to build an end-to-end application on Hailo15 that
integrates Hailo’s AI inference capabilities and other hardware accelerated features. The application demonstrates
how to assemple a native C++ pipeline with the following features:
The reference shows how a user can integrate such features in a multi-threaded pipeline that maintains zero-copy
behavior for high performance.
The applicaton will come pre-compiled and ready to run on the Hailo15 platform as part of the release image.
   1. On the host machine, run a gstreamer streaming pipeline to capture video feed from the ethernet cable.
           Enter the following command in the terminal of the host machine:
            This will start the streaming pipeline and you will be able to see the video feed on the screen after starting
            the application in the next step.
2. On the Hailo15 platform, run the executable located at the following path:
$ ./apps/ai_example_app/ai_example_app
You should now be able to see the video feed with the inference overlay on the screen.
  Page 76      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
Now that you are able to run the application, let’s discuss what you are seeing. Below you can see the pipeline that
the application is running:
This may look like a lot at first, so we will break it down into smaller peices later. For now the key takeways are:
• The pipeline outputs 3 streams: two of just video (HD and SD), and a third (4K) with the inference overlay.
– The first stage performs yolo object detection (person and face classes) on a tiled stream
* Netwrork: yolov5s_personface_nv12
                     *   Output: FLOAT32, HAILO NMS(number of classes: 2, maximum bounding boxes per class: 80,
                         maximum frame size: 3208)
– The second stage performs facial landmarking on faces detected in the first stage
* Netwrork: tddfa_mobilenet_v1_nv12
• In both stages of the AI pipeline the DSP is used to crop and resize the image before inference is performed
  Page 77       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
In Running the Application, we saw how to see the inference overlay stream. If you want to see the other streams (HD
& SD), you simply need to open more streaming pipelines on the host machine.
Each stream is output on a different port, so you will need to open a new pipeline for each stream you want to see.
Note that in the streaming pipeline shown before targets a specific port (port=5000). To target another port, you
will need to change the port number in the pipeline and run it separately. The application outputs streams to the
following port numbers:
• HD Stream: 5002
• SD Stream: 5004
• 4K Stream: 5000
For example, to display the HD stream run the following ajusted pipeline on the host machine:
• Understanding the Pipeline: Further details on the reference pipeline presented with focus on the AI stream.
    • Compiling and Deploying: The application is pre-compiled and ready to run on the Hailo15 platform. If you
      want to make changes to the application, you will need to compile it yourself.
    • Application Structure: An in depth look at the technical design of how the application is implemented. Here
      design decisions are explained.
  Page 78      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
5. TAPPAS as a framework
TAPPAS is a GStreamer based library of plug-ins. It enables using a Hailo devices within gstreamer pipelines to create
intelligent video processing applications.
GStreamer’s development framework makes it possible to write any type of streaming multimedia application. The
GStreamer framework is designed to simplify for the user how to write applications that handle audio or video or
both. It isn’t restricted to audio and video and can process any kind of data flow. The framework is based on plugins
that will provide various codecs and other functionalities. The plugins can be linked and arranged in a pipeline. This
pipeline defines the flow of the data. The GStreamer core function is to provide a framework for plugins, data flow,
and media type handling/negotiation. It also provides an API to write applications using the various plugins.
The functionality that Hailo brings into the GStreamer-framework allows us to infer video frames easily and intuitively
without compromising on performance and flexibility.
Hailo Concepts
    • Network encapsulation - Since in a configured network group, there are only input and output layers a
      GstHailoNet will be associated to a “Network” by its configured input and output pads
    • Network independent elements - The GStreamer elements will be network independent, so the same infras-
      tructure elements can be used for different applicative pipelines that use different NN functionality, configura-
      tion, activation, and pipelines. Using the new API we can better decouple network configuration and activation
      stages and thus better support network switch
    • GStreamer Hailo decoupling - Applicative code will use Hailo API and as such will be GStreamer independent.
      This will help us build and develop the NN and postprocessing functionality in a controlled environment (with
      all modern IDE and debugging capabilities).
    • Context control - Hailo elements will be contextless and thus leave the context (thread) control to the pipeline
      builder
• GStreamer reuse - The pipeline will use many off the shelf GStreamer elements
• HailoNet - Element for sending and reciveing data from Hailo-8 chip
    • HailoFilter - Element that enables the user to apply a postprocess or drawing operation to a frame and its
      tensors
    • HailoPython - Element that enables the user to apply a postprocess or drawing operation to a frame and its
      tensors via python.
  Page 79       Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
   • HailoAggregator - HailoAggregator is an element designed for applications with cascading networks. It has 2
     sink pads and 1 source
   • HailoCropper - HailoCropper is an element designed for applications with cascading networks. It has 1 sink and
     2 sources
   • HailoTileAggregator - HailoTileAggregator is an element designed for applications with tiles. It has 2 sink pads
     and 1 source
• HailoTileCropper - HailoCropper is an element designed for applications with tiles. It has 1 sink and 2 sources
   • HailoTracker - HailoTracker is an element that applies Joint Detection and Embedding (JDE) model with Kalman
     filtering to track object instances.
   • Object-oriented - All GStreamer Objects can be extended using the GObject inheritance methods. All plugins
     are loaded dynamically and can be extended and upgraded independently.
   • GStreamer adheres to GObject, the GLib 2.0 object model. A programmer familiar with GLib 2.0 or GTK+ will
     be comfortable with GStreamer.
• Allow binary-only plugins - Plugins are shared libraries that are loaded at runtime.
• High performance
   • Elements - have one specific function for processing/ generating / consuming data. By chaining together sev-
     eral such elements, a pipeline can be created to perform a specific task.
   • Pads - are an element’s input and output, which can connect to other elements. A pad can be viewed as a “plug”
     or “port” on an element where links may be made with other elements, and through which data can flow to or
     from those elements. Data types are negotiated between pads using a process called Caps Negotiation. Data
     types are described by GstCaps.
   • Bin - A bin is a container for a collection of elements. Since bins are subclasses of elements themselves, a bin
     can be mostly controlled as if it was an element, thereby subtracting away a lot of complexity from the user’s
     application. A pipeline is a top-level bin. It provides a bus for the application and manages the synchronization
     for its children.
 Page 80      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
5.2.3. Terminology
NVR is a specialized hardware and software solution used in IP (Internet Protocol) video surveillance systems. In most
cases, the NVR is intended for obtaining video streams from the IP cameras (via the IP network) for the purpose of
storage and subsequent playback.
Is a network control protocol designed for use in entertainment and communications systems to control streaming
media servers. This protocol is used for establishing and controlling media sessions between endpoints.
The MPP is a library for Rockchip SoC’s which provides high performance on multimedia (video and image) processing.
The benchmark tool is a new script that can help the user identify their platform’s limitations when trying to build
an application using TAPPAS baseline. This tool can be used to measure the FPS of different pipelines according to a
variety of parameters. The pipeline that will run will be without any neural network and is able to demonstrate the
performance the platform is able to provide under the defined conditions.
Benchmark Usage
Options:
  Page 81      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
              --display-resolution RESOLUTION Scale width and height of each stream in WxH mode (e.g.
                                     640x480)
Usage Notes
1. The format should be written according to the GStreamer conventions, e.g. RGBA instead of rgba.
   2. If the min and max number of sources are the same only 1 pipeline will run, otherwise several pipelines will be
      running consecutively.
3. If you want to use VA-API make sure you download VA-API via from the link VA-API Install Manual
Before using the benchmark tool videos must be prepared for it to run. The videos must be in format mp4 . A working
script has been prepared script which takes one video and creates as many soft links to this video as the user requires,
numbered from 0 to n-1 for the benchmark tool. When providing the prefix after –video-prefix-path in the benchmark
tool, write a path with the name of the videos until the numbering. Example: If the videos are located at /tmp/tappas/
and their names are tap0.mp4 to tap15.mp4, the prefix will be “/tmp/tappas/tap”.
Benchmark Example
When building the TAPPAS Docker (or installing natively), all of the TAPPAS source files are compiled and ready to
use. If however you want to add your own additions (for example, a new postprocess) or make other changes, it will
be necessary to recompile the sources. This guide covers the build system used in TAPPAS and how to compile the
project.
Meson is an open source build system that places the emphasis on speed and ease of use. GStreamer uses meson
for all sub-projects to generate build instructions to be executed by ninja, another build system focuses entirely on a
speed that requires a higher level build system (ie: meson) to generate its input files. Similar to GStreamer, TAPPAS
also uses Meson, and compiling new projects requires the adjustment of the meson.build files.
How to Compile
To help streamline this process the TAPPAS Framework have provided a script that handles most of the work. The
script can be found at scripts/gstreamer/install_hailo_gstreamer.sh.
The following arguments are available:
  Page 82       Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
./scripts/gstreamer/install_hailo_gstreamer.sh
The TAPPAS provides a set of abstractions for the different objects that might be handled in a user’s pipeline, such
as tensors, detections, classifications, or landmarks. If the user wants to write their own
custom pipeline behavior (postprocessing, drawing, etc..), then it is worthwhile to become familiar with
these classes.
This guide documents the different classes available in the TAPPAS and their interactions.
  Page 83      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
Structs
HailoBBox
Constructor
Functions
HailoPoint
Constructor
Functions
  Page 84      Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
Enumerations
hailo_object_t
typedef enum
{
  HAILO_ROI,
  HAILO_CLASSIFICATION,
  HAILO_DETECTION,
  HAILO_LANDMARKS,
  HAILO_TILE,
  HAILO_UNIQUE_ID,
  HAILO_MATRIX,
  HAILO_DEPTH_MASK,
  HAILO_CLASS_MASK,
  HAILO_CONF_CLASS_MASK
} hailo_object_t;
HailoTensor
Tensors are the ouput vector of the network inference.         Usually these are N-dimensional matrices that hold lit-
tle “human readable” value at first, but after a little postprocessing become meaningful objects such as detections
or landmarks. All postprocesses start by looking at the output tensors. In fact, usually there will be no need to
construct one it will be provided to your postprocess via the hailofilter element. To make handling these vectors
easier, they are provided in a HailoTensor class. Shared pointer handle: HailoTensorPtr SOURCE:
core/hailo/general/hailo_tensors.hpp
Functions
  Page 85       Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
HailoObject
HailoObject represents objects that are usable output after postprocessing. They can be detections,
classifications, landmarks, or any other similar postprocess results.
This class is an abstraction for other objects to inherit from. To more conveniently compare different types of
inheriting classes, HailoObjects store their object type from an enumerated list hailo_object_t.
The class     inheritance hierarchy is as follows:
Constructor
HailoObject()
Functions
  Page 86       Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
HailoMainObject
Constructor
HailoMainObject()
Functions
  Page 87       Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
HailoROI
Constructor
HailoROI(HailoBBox bbox)
Functions
HailoDetection
  Page 88       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                            TAPPAS User Guide
Constructors
Functions
HailoClassification
Constructors
Functions
  Page 89      Release 3.31.0   Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
HailoLandmarks
Constructors
Functions
HailoUniqueID
  Page 90       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
Constructors
HailoUniqueID()
HailoUniqueID(int unique_id)
Functions
HailoMask
Constructors
Functions
  Page 91      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                            TAPPAS User Guide
HailoDepthMask
Constructors
Functions
HailoClassMask
Constructors
Functions
  Page 92      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
HailoConfClassMask
Constructors
Functions
HailoMatrix
Constructors
  Page 93       Release 3.31.0         Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
Functions
5.3.4. Debugging
GstShark
GstShark is an open-source project from RidgeRun that provides benchmarks and profiling tools for GStreamer 1.7.1
(and above). It includes tracers for generating debug information plus some tools to analyze the debug information.
GstShark provides easy to use and useful tracers, paired with analysis tools to enable straightforward optimizations.
GstShark leverages GStreamer’s built in tracing system and adds plotting tools to simplify the process of understand-
ing the bottlenecks in the user’s pipeline.
As part of the TAPPAS framework, we have expanded the available profiling mechanisms to include TAPPAS related
tracers and a new plotting tool.
The profiling tool provides 3 general features that can be used to debug the pipeline:
    • Tracers log printouts - At the most basic level, printouts are available from the traces of the different measure-
      ments made. An experienced user will be able to make observations at runtime. Printouts can be found in the
      debug file: GST_DEBUG_FILE=$TAPPAS_WORKSPACE/tappas_traces.log.
  Page 94       Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
    • Graphic visualization - Shown above, gst-shark can generate a pipeline graph that shows how elements are
      connected and what caps were negotiated between them. This is a very convenient feature for observing the
      pipeline in a more comfortable way. The graph is generated at runtime so it is very effective for seeing and
      debugging how elements were actually connected and in what formats the data ended up in.
    • Plotting tool - A python script that generates a graph plot for each tracer metric enabled. This is a powerful tool
      to visualize each metric that can be used for deeper debugging.
Install
The docker image already contains GstShark! If the user decides to not use the TAPPAS Docker image, our suggestion
is to follow RidgeRun tutorial: GstShark
Bash Shortcuts
Note: These shortcuts are only available if the Docker TAPPAS installation is being used, otherwise, please refer to
the following section: Using GstShark in yocto-compiled images
As part of the TAPPAS creation of the Docker image, some convenient shortcuts are copied to GstShark:
vim ~/.bashrc
  export GST_DEBUG_NO_COLOR=1
  echo 'Options for TRACERS:”'
  echo 'export GST_TRACERS=”cpuusage;proctime;interlatency;scheduletime;bitrate;
 ,→framerate;queuelevel;threadmonitor;numerator;buffer;detections;graphic”'
  Page 95      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
  $TAPPAS_WORKSPACE/sources/gst-shark/scripts/graphics/split_traces.sh $split_
 ,→traces_dir
  python3 $TAPPAS_WORKSPACE/sources/gst-shark/scripts/graphics/plot_all_to_html.
 ,→py -p $split_traces_dir
Note that 4 functions were added: two sets, an unset, and a plot function. The set functions enable gst-shark by
setting environment variables, the chief of which is GST_TRACERS. This enables the different trace hooks in the
pipeline. The available tracers are listed in the echo command at the end of each set. You can enable any com-
bination of the available tracers, just chain them together with a ‘;’ (notice that the difference between gst_set_debug
and gst_set_graphic is that gst_set_debug enables all tracers whereas gst_set_graphic only enables the graphic tracer
that draws the pipeline graph). HAILO_PROFILE_LOCATION and GST_DEBUG_DUMP_DOT_DIR set locations where the
dump files are stored, the first sets where the tracer dumps are (used for gst-plot), and the latter where the dot file is
saved (the graphic pipeline graph). Unset disables all tracers, and gst_plot_debug runs plot script.
      export HAILO_PROFILE_LOCATION=/tmp/profile
      export GST_DEBUG=”GST_TRACER:7”
      export GST_DEBUG_NO_COLOR=1
    • Select the tracers by setting the GST_TRACERS environment variable to the list of tracers, separated by ; as in
      the example:
      export GST_TRACERS=”scheduletime;bitrate;threadmonitor;numerator;buffer;
       ,→detections”
    • You should export only some of the tracers, exporting too many tracers may fail the embedded device. All
      tracers explained: Understanding GstShark tappas plotted graphs
• If you want to save the output to a file, run the following command before running the app:
export GST_DEBUG_FILE=<file_path>
    • If you want to plot the tracers output, use a strong machine (not an embedded device) with a full tappas instal-
      lation and copy there the output file, then run the following commands:
      export GST_DEBUG_FILE=<file_path>
      gst_plot_debug
Using GstShark
Then just run your app, it will be possible to see all kinds of tracer prints on the debug output file:
GST_DEBUG_FILE=$TAPPAS_WORKSPACE/tappas_traces.log.
After you have run a gstreamer pipeline with tracers enabled, plot them using the plot script, just run:
gst_plot_debug
It will print to the console the path of the html file that contains the plots, which can be opened in the browser. In
addition it will print the command to open the pipeline graph, which can be run in a terminal to open the graph.
  Page 96       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
Each graph inspects a different metric of the pipeline, it is recommended to read more about what each one repre-
sents here:
    • CPU Usage (cpuusage) - Measures the CPU usage every second. In multiprocessor systems this measurements
      are presented per core.
    • Processing Time (proctime) - Measures the time an element takes to produce an output given the corresponding
      input.
• InterLatency (interlatency) - Measures the latency time at different points in the pipeline.
• Schedule Time (scheduling) - Measures the amount of time between two consecutive buffers in a sink pad.
• Buffer (buffer) - Prints information of every buffer that passes through every sink pad in the pipeline.
• Bitrate (bitrate) - Measures the current stream bitrate in bits per second.
• Framerate (framerate) - Measures the amount of frames that go through a src pad every second.
• Queue Level (queuelevel) - Measures the amount of data queued in every queue element in the pipeline.
• Thread Monitor (threadmonitor) - Measures the CPU usage of every thread in the pipeline.
    • Numerator (numerator) - Numerates the buffers by setting the field “offset” of the buffer metadata. This trace
      is different from the others because it does not collect any data, it just numerates the buffers.
    • Detections (detections) - Prints information about the objects detected in every buffer that passes through every
      pad in the pipeline. This trace only works with the TAPPAS framework since it collects the TAPPAS detection
      objects.
Note: When using the Thread Monitor tracer, provide meaningful names to the queues because the names of
the threads in the graph will be based on the names of the queues. This will help easily identify the threads and
understand their purpose when analyzing the trace. In addition, due to the way this tracer works, it is important to
keep the names of the queues shorter than 16 characters. If the names are longer than this, the thread names in the
graph will be truncated.
$ export GST_SHARK_FILE_BUFFERING=0
With the no buffering mode every I/O operation is written as soon as possible.
The following command is an example of how to define the environment variable that will change the buffering mode
to full buffering and the buffering size, this command uses a positive integer value for the size:
$ export GST_SHARK_FILE_BUFFERING=1024
  Page 97      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
The individual element tracing, or filter parameter, allows the user to choose which elements get included in the
tracing. The value to be set in the filter is a Glib Compatible Regular Expression, meaning that elements to be traced
can be grouped by using a regex that matches with their name.
The filtering applies to the element name, NOT the factory. This is, if the element is specified as “identity
name=myelem”, it should be referred to as “myelem” and not to “identity”
Print the amount of frames that flow every 5 seconds through the different src pads in the pipe:
GST_TRACERS=”framerate(period=5)” GST_DEBUG=GST_TRACER:7
Print the amount of bits that flow every 3 seconds through the different src pads in the pipe:
GST_TRACERS=”bitrate(period=3)” GST_DEBUG=GST_TRACER:7
Print the amount of frames that flow every 5 seconds and bits that flow every 3 seconds through the different src
pads in the pipe:
GST_TRACERS=”framerate(period=5);bitrate(period=3)” GST_DEBUG=GST_TRACER:7
Print the amount of frames that flow every 5 through the identity:
GST_TRACERS=”framerate(period=5,filter=identity);bitrate(period=3)” GST_
 ,→DEBUG=GST_TRACER:7
Using gst-instruments
gst-instruments is a set of performance profiling and data flow inspection tools for GStreamer pipelines.
    •   gst-top-1.0 at the start of the pipeline will analyze and profile the run.   (gst-top-1.0 gst-launch-1.0 ! au-
        diotestsrc ! autovideosink)
Overview
When adding a network to the TAPPAS that is not already supported, then most likely it will need to implement a
new post-process and drawing filter. Fortunately with the use of the hailofilter, there is no need to create any new
GStreamer elements, just provide the .so (compiled shared object binary) that applies to the filter! This guide will
go over how to create such an .so and what mechanisms/structures are available to the user as they create their
postprocess.
  Page 98        Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
Getting Started
File Location
When creating or working with postprocess, it is important to know where to find all the relevant source files that
already exist, and how to add new ones. From the TAPPAS home directory, one can find the core/ folder. Inside
this core/ directory are a few subdirectories that host different types of source files. The open_source folder
contains source files from 3rd party libraries (opencv, xtensor, etc..), while the hailo folder contains source files
for all kinds of Hailo tools, such as the Hailo Gstreamer elements, the different metas provided, and the source files
for the postprocesses of the networks that were already provided in the TAPPAS. Inside this directory is one titled
general/, which contains sources for the different object classes (detections, classifications, etc..) available. Next to
general is a directory titled gstreamer/, and inside that are two folders of interest: libs/ and plugins/.
The former contains the source code for all the postprocess and drawing functions packaged in the TAPPAS, while
the latter contains source code for the different Hailo GStreamer elements, and the different metas available. This
guide will mostly focus on this core/hailo/ directory, as it has everything needed to create and compile a new
.so! It is recommended that users spend time familiarizing themselves with these locations, and then when ready to
continue enter the postprocesses/ directory:
  Page 99       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
The new postprocess can be created here in the postprocesses/ folder. Create a new header file named
my_post.hpp.In the first lines we want to import useful classes to our postprocess, so add the following includes:
#pragma once
#include ”hailo_objects.hpp”
#include ”hailo_common.hpp”
”hailo_objects.hpp”              contains classes that represent the different inputs (tensors) and outputs
(detections, classifications, etc…) that your postprocess might handle.             You can find the header in
core/hailo/general/hailo_objects.hpp. Your main point of entry for data in the postprocess is the HailoROI,
which can have a tensor or a number of tensors attached. ”hailo_common.hpp” provides common useful
functions for handling these classes. Wrap up the header file by adding a function prototype for your filter, the whole
header file should look like:
#pragma once
#include ”hailo_objects.hpp”
#include ”hailo_common.hpp”
__BEGIN_DECLS
void filter(HailoROIPtr roi);
__END_DECLS
The process is now complete. The hailofilter element does not expect much, just that the above filter
function be provided. Adding Multiple Filters in One .so will be described later. Note that the filter function takes
a HailoROIPtr as a parameter; this will provide you with the HailoROI of each passing image.
Implementing a Filter()
Start implementing the actual filter to see how to access and work with tensors. Start by creating a new file called
my_post.cpp. Open it and include the following:
#include <iostream>
#include ”my_post.hpp”
The <iostream> will allow printing to the console, and the ”my_post.hpp” includes the header file we just
wrote.
For now add the following implementation for the filter() so that we have a working postprocess we can test:
This is sufficient for compiling and running a pipeline. Next we will describe how to add the postprocess to the meson
project so that it compiles.
  Page 100      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
Meson is an open source build system that places an emphasis on speed and ease of use. GStreamer uses meson for
all sub-projects to generate build instructions to be executed by ninja, another build system focuses specifically on
speed that requires a higher level build system (ie: meson) to generate its input files. Like GStreamer, TAPPAS also
uses meson, and compiling new projects requires adjusting the meson.build files. Here we will describe how to
add the user’s. In the libs/postprocesses path will be found a meson.build, open it and add the following
entry for our postprocess:
################################################
# MY POST SOURCES
################################################
my_post_sources = [
 'my_post.cpp',
]
my_post_lib = shared_library('my_post',
 my_post_sources,
 include_directories: [hailo_general_inc] + xtensor_inc,
 dependencies : post_deps,
 gnu_symbol_visibility : 'default',
 install: true,
 install_dir: post_proc_install_dir,
)
This will provide meson with all the information required to compile the postprocess. In short, we are provid-
ing paths to cpp compilers, linked libraries, included directories and dependencies. All these path variables come
from the parent meson project, the meson file can be read to see what packages and directories are available at
core/hailo/meson.build.
We are now ready to compile the postprocess. To help streamline this process a script has been provided that will
handle most of the work. The script can be found at scripts/gstreamer/install_hailo_gstreamer.sh. It includes some
flags that allows the user to do more specific operations, but they are not needed right now.
From the TAPPAS home directory folder you can run:
./scripts/gstreamer/install_hailo_gstreamer.sh
  Page 101      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                          TAPPAS User Guide
If all runs correctly a green   YES,   and our .so should appear in     apps/h8/gstreamer/libs/
post_processes/!
 Page 102     Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                       TAPPAS User Guide
Page 103   Release 3.31.0   Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
Now that the user has successfully compiled their first postprocess, they can continue to run the postprocess and
view the results. Since it is still generic, run this test pipeline in the terminal to see if it works:
Note in the above pipeline that we gave the hailofilter the path to libmy_post.so in the so-path
property. So now every time a buffer is received in that hailofilter‘s sink pad, it calls the filter() function
in libmy_post.so. The resulting app should print our chosen text ”My first postprocess!” in the
console:
Filter Basics
Printing statements on every buffer is useful, however we would like a postprocess that can actually do operations
on inference tensors. We will now describe how this can be achieved. Go back to my_post.cpp and replace the
print statement with the following:
The HailoROI has two ways of providing the output tensors of a network: via the get_tensors() and
get_tensor(std::string name) functions. The first (which is used here) returns an std::vector
of HailoTensorPtr objects. These are an std::shared_ptr to a HailoTensor: a class that repre-
sents an output tensor of a network. HailoTensor holds all kinds of important tensor metadata besides the data
itself; such as the width, height, number of channels, and even quantization parameters. A full implementation for
this class can be viewed at core/hailo/general/hailo_tensors.hpp. get_tensor(std::string name) also
returns a HailoTensorPtr, but only the one with the given name output layer name. This can be convenient
for performing operations on specific layers whose names are known in advance. Now that we have a vector of
HailoTensorPtr objects, lets examine the information that can be obtained from it. Add the following lines to
our filter() function:
Recompile with the same script we used earlier. Run a test pipeline, and this time see actual parameters of the tensor
printed out:
,→WORKSPACE/apps/h8/gstreamer/general/detection/resources/yolov5m_wo_spp_60p.hef�
  Page 104      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
With a HailoTensorPtr the user has everything needed to perform postprocess operations. The actual tensor
values can be accessed from the HailoTensorPtr with:
Remember at this point the data is of type uint8_t, for full precision you will have to dequantize the tensor to a
float. To aid this the quantization parameters (scale and zero point) are stored in the HailoTensorPtr and
can be applied through tensor->fix_scale(uint8_t num).
Now that you know how to create a basic filter and access your inference tensor, we will learn how to add a detection
object to the hailo_frame.Remove the prints from the filter() function and replace them with the following
function call:
Here the function is being called demo_detection_objects() which will return some detection objects.
Copy the following function definition into my_post.cpp:
std::vector<HailoDetection> demo_detection_objects()
{
  std::vector<HailoDetection> objects; // The detection objects we will eventually�
 ,→return
  objects.push_back(first_detection);
  objects.push_back(second_detection);
 return objects;
}
In this function two instances of HailoDetection are being created and pushed into a vector that we return.
Note that when creating a HailoDetection, we give a series of parameters. The expected parameters are as
follows:
  Page 105      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
Where HailoBBox is a class that represents a bounding box, it is initialized as HailoBBox(float               xmin,
float ymin, float width, float height).
NOTE: It is assumed that the xmin, ymin, width, and height given are a percentage of the image size
(meaning, if the box is half as wide as the width of the image, then width=0.5). This protects the pipeline’s
ability to resize buffers without compromising the correct relative size of the detection boxes.
Looking back at the demo function we just introduced, we are adding two instances of HailoDetection:
first_detection and second_detection. According to the parameters we saw,
first_detection has an xmin 20% along the x axis, and a ymin 20% down the y axis. The width and
height are also 20% of the image. The last two parameters, label and confidence, show that this instance
has a 99% confidence for label person.
Now that we have a couple of HailoDetections available, add to them the original HailoROIPtr. There is
a helper function we need in the core/hailo/general/hailo_common.hpp file that we included earlier in
my_post.hpp.
This file has other features that will be useful, so it is recommended to keep the file readily available.
With the include in place, add the following function call to the end of the filter() function:
This function takes a HailoROIPtr and a HailoDetection vector, then adds each HailoDetection to
the HailoROIPtr. Now that our detections have been added to the hailo_frame our postprocess is done!
To recap, our whole my_post.cpp should look like this:
#include <iostream>
#include ”my_post.hpp”
std::vector<HailoDetection> demo_detection_objects()
{
  std::vector<HailoDetection> objects; // The detection objects we will eventually�
 ,→return
  objects.push_back(first_detection);
  objects.push_back(second_detection);
  return objects;
}
Recompile again and run the test pipeline, if all is correct then you should see the original video run with no problems.
If you are unable to see any detections this is because they are attached to each buffer, however no overlay is drawing
them onto the image itself. To see how our detection boxes can be drawn, read further in Next Steps Drawing.
    Page 106     Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
Next Steps
Drawing
At this point we have a working postprocess that attaches two detection boxes to each passing buffer. But to get the
GStreamer pipeline to draw those boxes onto the image, We provide a GStreamer element - hailooverlay - that
draws any Hailo provided output classes (detections, classifications, landmarks, etc..) on the buffer, to do this
include it in your pipeline.
The element should be added in the pipeline after the hailofilter element with our postprocess.
Now the pipeline should look like:
,→WORKSPACE/apps/h8/gstreamer/general/detection/resources/yolov5m_wo_spp_60p.hef�
,→overlay=false
Run the expanded pipeline above to see the original video, but this time with the two detection boxes we added.
  Page 107      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
Both boxes will be labeled as person, and each is shown with the assigned confidence. Obviously, the two
boxes don’t move or match any object in the video; this is because for the benefit of this tutorial the values are
hardcoded. It is up to the user to extract the correct numbers from the inferred tensor of their network, as can
be seen among the postprocesses already implemented in the TAPPAS each network can be different. This guide
provides a strong starting point for further development.
While the hailofilter always calls on a filter() function by default, the user can provide the element
access to other functions in .so to call instead. This may be of interest for developing a postprocess that applies to
mutliple networks, but each network needs slightly different starting parameters (in the TAPPAS case, mutliple flavors
of the Yolo detection network are handled via the same .so). This can be achieved by declaring the extra functions in
the header file, then pointing the hailofilter to that function via the function-name property. Taking the
Yolo networks as an example, open up libs/postprocesses/detection/yolo_postprocess.hpp to see what functions are
made available to the hailofilter:
  Page 108      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
#pragma once
#include ”hailo_objects.hpp”
#include ”hailo_common.hpp”
__BEGIN_DECLS
void filter(HailoROIPtr roi);
void yolov5(HailoROIPtr roi, void *params_void_ptr);
void yolox(HailoROIPtr roi, void *params_void_ptr);
void yoloxx(HailoROIPtr roi, void *params_void_ptr);
void yolov3(HailoROIPtr roi, void *params_void_ptr);
void yolov4(HailoROIPtr roi, void *params_void_ptr);
void tiny_yolov4_license_plates(HailoROIPtr roi, void *params_void_ptr);
void yolov5_no_persons(HailoROIPtr roi, void *params_void_ptr);
void yolov5_no_faces(HailoROIPtr roi, void *params_void_ptr);
void yolov5_counter(HailoROIPtr roi, void *params_void_ptr);
void yolov5_vehicles_only(HailoROIPtr roi, void *params_void_ptr);
void yolov5_personface(HailoROIPtr roi, void *params_void_ptr);
void yolov5_personface_letterbox(HailoROIPtr roi, void *params_void_ptr);
void yolov5_no_faces_letterbox(HailoROIPtr roi, void *params_void_ptr); //should�
 ,→add to python too
Any of the functions declared here can be given as a function-name property to the hailofilter element.
Condsider this pipeline for running the Yolov5 network:
,→apps/h8/gstreamer/general/detection/resources/yolov5m_wo_spp_60p.hef is-
,→overlay=false
The hailofilter above that performs the post-process points to libyolo_post.so in the so-path, but
it also includes the property function-name=yolov5. This lets the hailofilter know that instead of the
default filter() function it should call on the yolov5 function instead.
Overview
To add a network to the TAPPAS that is not already supported, requires the implementation of a new post-process.
Fortunately with the use of the hailopython, there is no need to create any new GStreamer elements, only to provide
a Python module that applies your post-processing! This section will review how to create a python module and what
mechanisms/structures are available for creating a post-process.
  Page 109      Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
Getting Started
import hailo
# Create 'run' function, that accepts one parameter - VideoFrame, more about�
 ,→VideoFrame later.
return Gst.FlowReturn.OK
One of the first steps in each post-process is to get the output tensors. This can be done by one of two methods
video_frame.roi.get_tensor(tensor_name) or video_frame.roi.get_tensors()
def run(video_frame: VideoFrame):
   for tensor in video_frame.roi.get_tensors():
     print(tensor.name())
   my_tensor = roi.get_tensor(”output_layer_name”)
   print(f”shape is {my_tensor.height()}X{my_tensor.width()}X{my_tensor.features()}
 ,→)
After doing this it is possible to convert this object of type HailoTensor to a numpy array on which perform post-
processing operations can be performed more conveniently. This is a fairly simple step, just use np.array on a given
HailoTensor.
        Notice that np.array has a parameter that determines whether to copy the memory or use the original
        buffer.
There    are   some   other    methods    in      HailoTensor,   that   can   be   performed   dir(my_tensor)     or
help(my_tensor).
  Page 110       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
Adding Results
After processing the net results and obtaining the post-processed results, they can be used as preferred. Below
demonstrates how to add them to the original image in order to draw them later with the hailooverlay element.
In order to add the post-processed result to the original image - use the video_frame.roi.add_object
method. This method adds a HailoObject object to the image. There are several types of objects that are cur-
rently supported: hailo.HailoClassification - Classification of the image. hailo.HailoDetection - Detection in the image.
hailo.HailoLandmarks - Landmarks in the image.
It is possible to create one of these objects and then add it with the roi.add_object method.
video_frame.roi.add_object(classification)
  # Now, Adds a face to the person, at the top of the person. (normalized only)
  face_bbox = hailo.HailoBBox(xmin=0.0, ymin=0.0, width=1, height=0.2)
  face = hailo.HailoDetection(bbox=face_bbox, label='face', confidence=0.84)
  person.add_object(face)
  # No need to add the face to the roi because it is already in the person that is in the�
,→roi.
Next Steps
Drawing
In order to draw the post-processed results on the original image use the hailooverlay element. It is already familiar
with our HailoObject types and knows how to draw classifications, detections, and landmarks onto the image.
This is the standard detection pipeline with a python module for post-processing.
  Page 111      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
      There is an option to write several post-process functions in the same module. In order to run each of
      them just add the function property to the hailopython element:
import hailo
VideoFrame Class
In addition to providing buffer and HailoROI access functions, the             VideoFrame module provides helper
functions for accessing the buffer through NumPy
Running the following command would display a list of methods and members available:
Instructions
If you wish to use a TAPPAS pipeline/demo with your own model, the easiest solution is:
               • If Model Zoo retraining dockers are available for those models, links are given; In addition it describes
                 how to reconfigure TAPPAS for the retrained models
2. Follow the retraining docker’s instructions to retrain the model with your own data
  Page 112      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                            TAPPAS User Guide
Notes
   • Easy post-processing JSON reconfiguration is currently only available for YOLO architecures. For other archi-
     tectures, recreating post-processing .so file is required. The relevant code and header files are mentioned on
     the README pages.
   • Models that use on-chip RGBX->RGB layers does not appear yet on the ModelZoo. Therefore, many models that
     are used for iMX demos (and others; see on the README of each app) should be added those layers manually
     to create models that will fit TAPPAS:
        – Use the non-rgbx network from the above table for retraining and compilation, with one simple modifi-
          cation - On the model alls file (on hailo_model_zoo/cfg/alls), add right after normalization command:
 Page 113     Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
6. Elements
6.1.1. Overview
HailoCropper is an element providing cropping functionality, designed for application with cascading networks,
meaning doing one task based on a previous task. It has 1 sink and 2 sources. HailoCropper receives a frame on
its sink pad, then invokes it’s prepare_crops method that returns the vector of crop regions of interest (crop_roi),
For each crop_roi it creates a cropped image (representing it’s x, y, width, height in the full frame). The cropped images
are then sent to the second src. From the first src we push the original frame that the detections were cropped from.
        HailoCropper receives a video frame that has detections (means a previous HailoNet +
By default,
HailoFilter ran) on it’s sinkpad. For each detection it creates a cropped image (using a specific algorithm to
create a scaled image with the same aspect ratio). This is used by the cascading networks app Face Landmarks based
on Face Detection.
Derived classes can override the default prepare_crops behaviour and decide where to crop and how many
times. hailotilecropper element does this exact thing when splitting the frame into tiles by rows and columns.
Parameters
There is only one property for this element other than the common ‘name’ and ‘parent’. The name of this boolean
property is ‘internal-offset’ and it is used to determine whether we use the original offset* of the buffer or overwrite
it with our own offset. The offset of the buffer is given to the original buffer and all the crops, and used by the
hailoaggregator, to make sure the cropped detections we are ‘muxing’ with the original buffer are actually from the
same buffer.*Offset is an attribute of buffer that determines on what offset this buffer is since the start of the pipeline
run, represented by number of buffers. It’s similar to frame-id in video. On some videos the offset attribute is not
created by the filesrc element and it is set to -1 (casted to uint64), therefore if we want to use it to determine what
the current frame is, we should somehow track the number of buffers and set this offset accordingly.
6.1.2. Example
  Page 114       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
6.1.3. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstHailoCropper
Pad Templates:
 SRC template: 'src'
  Availability: Always
  Capabilities:
   ANY
Pads:
 SINK: 'sink'
  Pad Template: 'sink'
 SRC: 'src_0'
  Pad Template: 'src'
 SRC: 'src_1'
  Pad Template: 'src'
Element Properties:
 name        : The name of the object
            flags: readable, writable
            String. Default: ”hailocropper0”
 parent       : The parent of the object
            flags: readable, writable
            Object of type ”GstObject”
 internal-offset : Whether to use Gstreamer offset of internal offset.
            flags: readable, writable, controllable
            Boolean. Default: false
6.1.4. Hailo-15
HailoCropper can utilize the on-chip DSP (Digital Signal Processor), to perform resize and crop operations.
The DSP is used by default on the Hailo-15 machine, and can be disabled by setting the use-dsp property. When
disabled OpenCV will be used (on the CPU) to perform the resize and crop operations.
HailoCropper holds a buffer pool (GstBufferPool) that manages the buffers, used by the DSP. The buffer pool is re-
sponsible for allocating and freeing the buffers when the reference count of a buffer reaches 0. Buffer pool size
(maximum buffers that can be allocated simultaneously in the pool) can be controlled using the pool-size prop-
erty.
It is recommended to make sure that a buffer is contiguous in memory, before being sent to the DSP. Non-contiguous
buffers will be copied to a new buffer, before being sent to the DSP.
  Page 115      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
6.2.1. Overview
HailoOverlay is a drawing element that can draw postprocessed results on an incoming video frame. This element
supports the following results:
• Detection - Draws the rectengle over the frame, with the label and confidence (rounded).
• Classification - Draws a classification over the frame, at the top left corner of the frame.
• Landmarks - Draws a set of points on the given frame at the wanted coordintates.
Parameters
As a member of the GstBaseTransform hierarchy, the hailooverlay element supports qos (Quality of Service). Although
qos typically tries to guarantee some level of performance, it can lead to frames dropping. For this reason it is advised
to always set qos=false to avoid either tensors being dropped or not drawn.
6.2.2. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstBaseTransform
            +----GstHailoOverlay
Pad Templates:
 SINK template: 'sink'
  Availability: Always
  Capabilities:
   video/x-raw
         format: { (string)RGB }
         width: [ 1, 2147483647 ]
         height: [ 1, 2147483647 ]
       framerate: [ 0/1, 2147483647/1 ]
  Page 116      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                           TAPPAS User Guide
          width: [ 1, 2147483647 ]
         height: [ 1, 2147483647 ]
        framerate: [ 0/1, 2147483647/1 ]
Pads:
 SINK: 'sink'
  Pad Template: 'sink'
 SRC: 'src'
  Pad Template: 'src'
Element Properties:
 name         : The name of the object
            flags: readable, writable
            String. Default: ”hailooverlay0”
 parent        : The parent of the object
            flags: readable, writable
            Object of type ”GstObject”
 qos         : Handle Quality-of-Service events
            flags: readable, writable
            Boolean. Default: false
6.3.1. Overview
Hailodevicestats is an element that samples power and temperature. It doesn’t have any pads, it just has to
be part of the pipeline. An example for using this element could be found under the detection / multi-
stream_multidevice app.
Parameters
Determine the time period between samples with the interval property.
6.3.2. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstHailoDeviceStats
Factory Details:
 Rank          primary (256)
 Long-name         hailodevicestats element
 Klass          Hailo/Device
 Description        Log Hailo-8 device statistics
 Author          Omer Salem <omers@hailo.ai>
  Page 117    Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
Pad Templates:
none
Pads:
none
Properties:
6.4.1. Overview
Hailofilter is an element which enables the user to apply a postprocess operation on hailonet’s output tensors. It
provides an entry point for a compiled .so file that the user writes, inside of which they will have access to the original
image frame, the tensors output by the network for that frame, and any metadata attached. At first the hailofilter will
read the buffer from the sink pad, then apply the filter defined in the provided .so, until finally sending the filtered
buffer along the source pad to continue down the pipeline.
  Page 118       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
Parameters
The most important parameter here is the so-path. Here the user provides the path to your compiled .so that
applies your wanted filter. By default, the hailofilter will call on a filter() function within the .so as the entry point. If
your .so has multiple entry points, for example in the case of slightly different network flavors, then you can chose
which specific filter function to apply via the function-name parameter. As a member of the GstVideoFilter
hierarchy, the hailofilter element supports qos (Quality of Service). Although qos typically tries to garuantee some
level of performance, it can lead to frames dropping. For this reason it is advised to always set qos=false to avoid
either tensors being dropped or not drawn.
6.4.2. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstBaseTransform
            +----GstHailofilter
Pad Templates:
 SRC template: 'src'
  Availability: Always
  Capabilities:
   ANY
Pads:
 SINK: 'sink'
  Pad Template: 'sink'
 SRC: 'src'
  Pad Template: 'src'
Element Properties:
 name         : The name of the object
            flags: readable, writable
            String. Default: ”hailofilter-0”
 parent        : The parent of the object
            flags: readable, writable
            Object of type ”GstObject”
 qos         : Handle Quality-of-Service events
            flags: readable, writable
            Boolean. Default: false
 so-path        : Location of the so file to load
            flags: readable, writable, changeable only in NULL or READY state
            String. Default: null
 function-name      : function-name
            flags: readable, writable, changeable only in NULL or READY state
            String. Default: ”filter”
 use-gst-buffer      : use function with access to the Gst Buffer
            flags: readable, writable, controllable
            Boolean. Default: false
  Page 119       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
6.5.1. Overview
HailoTracker is an element which enables the user to track HailoDetection objects using the
Joint-Detection-and-Embedding (JDE) Tracking algorithm. JDE is a fast and high-performance multiple-object tracking
algorithm that associates between detections in consecutive frames based on size/location/movement. Associations
are made by linear assignment via a Kalman Filter.
For more information on JDE Tracking and Kalman Filtering read here.
Parameters
The hailotracker element provides a series of properties that allow you to adjust the tracking algorithm. The most
important property to set is class-id: this determines if the tracker will track all HailoDetection objects indiscrim-
inately of class or focus only on detections of a specific class id (the default behavior is to track across-classes).
6.5.2. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstBaseTransform
            +----GstVideoFilter
               +----GstHailoTracker
Pad Templates:
 SRC template: 'src'
  Availability: Always
  Capabilities:
   ANY
Pads:
 SINK: 'sink'
  Pad Template: 'sink'
 SRC: 'src'
  Pad Template: 'src'
Element Properties:
 name         : The name of the object
            flags: readable, writable
            String. Default: ”hailotracker0”
 parent         : The parent of the object
            flags: readable, writable
            Object of type ”GstObject”
 qos         : Handle Quality-of-Service events
            flags: readable, writable
            Boolean. Default: true
 debug         : Enable debug mode.
                                                                                                 (continues on next page)
  Page 120      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
6.6.1. Overview
HailoTileAggregator is a derived element of hailoAggregator and it is used in the Tiling app.          A complement
to the HailoTileCropper, the two elements work together to form a versatile tiling apps.
    •   post_aggregation: Functionality to perform after all frames are aggregated succesfully. .. code-block:
        Performs ``remove_large_landscape`` and ``NMS``.
  Page 121       Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                        TAPPAS User Guide
6.6.2. Example
6.6.3. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstHailoAggregator
            +----GstHailoTileAggregator
Pad Templates:
 SRC template: 'src'
  Availability: Always
  Capabilities:
   ANY
Pads:
 SINK: 'sink_0'
  Pad Template: 'sink'
 SINK: 'sink_1'
  Pad Template: 'sink'
 SRC: 'src'
  Pad Template: 'src'
Element Properties:
  name        : The name of the object
             flags: readable, writable
             String. Default: ”hailotileaggregator0”
  parent       : The parent of the object
             flags: readable, writable
             Object of type ”GstObject”
  flatten-detections : perform a 'flattening' functionality on the detection metadata�
 ,→when receiving each frame
 Page 122   Release 3.31.0   Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
6.7.1. Overview
HailoTileCropper is a derived element of hailoCropper and it is used in the Tiling app. It overrides the default
prepare_crops behaviour to return a vector of tile regions of interest, and allows splitting the incoming frame
into tiles by rows and columns. Each tile stores their x, y, width, and height (with overlap between tiles included) in
the full frame. Just like the base HailoCropper, the full original frame is sent to the first src pad while all the cropped
images are sent to the second.
hailoaggregator wiil aggregate the cropped tiles and stitch them back to the original resolution.
Parameters
    • scale-level : Scales (layers of tiles) in addition to the main layer 1: [(1 X 1)] 2: [(1 X 1), (2 X 2)] 3: [(1 X 1), (2 X 2),
      (3 X 3)]] - default 2
6.7.2. Example
6.7.3. Hierarchy
GObject
+----GInitiallyUnowned
    +----GstObject
       +----GstElement
          +----GstHailoBaseCropper
             +----GstHailoTileCropper
Pad Templates:
 SRC template: 'src'
                                                                                                            (continues on next page)
  Page 123       Release 3.31.0         Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                         TAPPAS User Guide
  Availability: Always
  Capabilities:
   video/x-raw
        format: { (string)RGB, (string)YUY2 }
         width: [ 1, 2147483647 ]
        height: [ 1, 2147483647 ]
       framerate: [ 0/1, 2147483647/1 ]
Pads:
 SINK: 'sink'
  Pad Template: 'sink'
 SRC: 'src_0'
  Pad Template: 'src'
 SRC: 'src_1'
  Pad Template: 'src'
Element Properties:
  name        : The name of the object
            flags: readable, writable
            String. Default: ”hailotilecropper0”
  parent       : The parent of the object
            flags: readable, writable
            Object of type ”GstObject”
  internal-offset :
            Whether to use Gstreamer offset of internal offset.
            NOTE: If using file sources, Gstreamer does not generate offsets for�
 ,→buffers,
 Page 124    Release 3.31.0   Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
6.8.1. Overview
HailoPython is an element which enables the user to apply processing operations to an image via python. It provides
an entry point for a python module that the user writes, inside of which they will have access to the Hailo raw-output
(output tensors) and postprocessed-outputs (detections, classifications etc..) as well as the gstreamer buffer. The
python function will be called for each buffer going through the hailopython element.
Parameters
The two parameters that define the function to call are module and function for the module path and func-
tion name respectively. In addition, as a member of the GstVideoFilter hierarchy, the hailofilter element supports
qos (Quality of Service). Although qos typically tries to guarantee some level of performance, it can lead to frames
dropping. For this reason it is advised to always set qos=false to avoid either tensors being dropped or not drawn.
6.8.2. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstBaseTransform
            +----GstVideoFilter
               +----GstHailoPython
Pad Templates:
 SRC template: 'src'
  Availability: Always
  Capabilities:
   video/x-raw
         format: { (string)RGB, (string)YUY2 }
         width: [ 1, 2147483647 ]
         height: [ 1, 2147483647 ]
       framerate: [ 0/1, 2147483647/1 ]
Pads:
 SINK: 'sink'
  Pad Template: 'sink'
 SRC: 'src'
  Pad Template: 'src'
                                                                                                  (continues on next page)
  Page 125      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
Element Properties:
 name         : The name of the object
            flags: readable, writable
            String. Default: ”hailopython0”
 parent        : The parent of the object
            flags: readable, writable
            Object of type ”GstObject”
 qos         : Handle Quality-of-Service events
            flags: readable, writable
            Boolean. Default: true
 module        : Python module name
            flags: readable, writable
            String. Default: ”/local/workspace/tappas/processor.py”
 function        : Python function name
            flags: readable, writable
            String. Default: ”run”
6.10.1. Overview
HailoMuxer is an element designed for our new multi-device application. It muxes 2 similar streams into 1 stream,
holding both stream’s metadata. It has 2 src elements and 1 sink, and whenever there are buffers on both src pads,
it takes only 1 of the buffers and passes it on, with both buffer’s metadata.
Parameters
There are no unique properties to hailomuxer. The only parameters are the baseclass parameters, which are ‘name’
and ‘parent’.
6.10.2. Example
  Page 126     Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
6.10.3. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstHailoMuxer
Pad Templates:
 SRC template: 'src'
  Availability: Always
  Capabilities:
   ANY
Pads:
 SRC: 'src'
  Pad Template: 'src'
Element Properties:
 name        : The name of the object
            flags: readable, writable
            String. Default: ”hailomuxer0”
 parent       : The parent of the object
            flags: readable, writable
            Object of type ”GstObject”
6.11.1. Overview
HailoAggregator is an element designed for applications with cascading networks or cropping functionality, meaning
to perform one task based on a previous task. It is a complement to the HailoCropper, the two elements work together
to form versatile apps. It has 2 sink pads and 1 source: the first sinkpad receives the original frame from an upstream
hailocropper, while the other receives cropped buffers from the other hailocropper. The HailoAggregator waits for
all crops of a given orignal frame to arrive, then sends the original buffer with the combined metadata of all collected
crops.
HailoAggregator also performs a ‘flattening’ functionality on the detection metadata when receiving each frame: de-
tections are taken from the cropped frame, copied to the main frame and re-scaled/moved to their corresponding
location in the main frame (x,y,width,height). As an example:
    • Face Landmarks based on Face Detection - HailoCropper crops each face detection -> HailoNet + FaceLandmarks
      post for each face -> HailoAggregator aggregates the frames back.
    • Tiling - hailotilecropper crops the image to tiles -> HailoNet + Detection post for each tile -> HailoAggregator
      aggregates the frames back and ‘flatten‘ the detection objects in the metadata.
  Page 127      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
Parameters
There are no unique properties to hailoaggregator. The only parameters are the baseclass parameters, which are
‘name’ and ‘parent’.
6.11.2. Example
6.11.3. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstHailoAggregator
Pad Templates:
 SRC template: 'src'
  Availability: Always
  Capabilities:
   ANY
Pads:
 SINK: 'sink_0'
  Pad Template: 'sink'
 SINK: 'sink_1'
  Pad Template: 'sink'
 SRC: 'src'
  Pad Template: 'src'
Element Properties:
 name        : The name of the object
                                                                                           (continues on next page)
 Page 128        Release 3.31.0    Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
6.12.1. Overview
HailoGallery is an element which enables the user to save and compare embeddings (HailoMatrix) that represents
recogintion, in order to track objects across multiple streams. It is also enables saving and loading these embeddings
into a local JSON file (database like), in order to track pre-saved objects.
Parameters
The hailogallery element provides a series of properties that allow you to adjust the gallery comparison algorithm.
The most important property to set is class-id: this determines if the gallery will track all HailoDetection objects
indiscriminately of class or focus only on detections of a specific class id (the default behavior is to track across-classes).
6.12.2. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstBaseTransform
            +----GstHailoGallery
Pad Templates:
 SRC template: 'src'
  Availability: Always
  Capabilities:
   ANY
Pads:
 SINK: 'sink'
  Pad Template: 'sink'
 SRC: 'src'
  Pad Template: 'src'
Element Properties:
 name        : The name of the object
                                                                                                         (continues on next page)
  Page 129       Release 3.31.0        Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
6.13.1. Overview
HailoRoundRobin is an element that provides muxing functionality.              It receives input from one or more sink
pads and forwards them into a single src pad in round-robin method.
It also adds metadata to each buffer with the input pad name it was received on, The metadata’s pupose is to be able
to de-mux it easily later on by hailostreamrouter . De-muxing by streamiddemux is not supported with this element.
• Funnel mode - push every buffer when it is ready no matter which pad it came from.
    • Blocking mode - push every buffer when it is its pad’s turn, and if the buffer is not ready, block until ready. This
      is the default mode.
    • Non Blocking mode - push every buffer when it is its pad’s turn, and if the buffer is not ready, skip it. This mode
      is useful when the video sources are not stable and may stop sending buffers for a while. In this case, the
      pipeline should not be blocked and should continue to process the other streams.
When using non-blocking mode, the element maintains a queue for sink pad that holds pointers to buffers. When a
buffer is pushed to a sink pad, it is added to the queue. When the src pad wants to push a buffer, the element tries
to get a buffer from the queue of the pad that is next in line. If the queue is empty, the element retries to get a buffer
from the queue for a number of times (retries-num property). If the queue is still empty, the element skips the pad
and tries to get a buffer from the next pad in line. The size of the queue and the number of retries can be configured
by the properties:
  Page 130       Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
When using non-blocking mode, Compositor element is not supported, since it requires all the streams to be syn-
chronized.
6.13.2. Example
Here’s an example of a pesudo pipeline muxing 4 streams into one detection pipeline, and then de-muxing them into
2 separate pipelines - one for person attributes and one for face attributes.
6.13.3. Hierarchy
GObject
+—-GInitiallyUnowned
+—-GstObject
+—-GstElement +—-GstHailoRoundRobin
Pad Templates:
ANY
ANY
Pads:
Element Properties: mode : Select the mode of the element (0 - funnel mode (push every buffer when it is ready), 1
     - blocking mode (push every buf
fer when it is its pad’s turn, and if the buffer is not ready, block until ready), 2 - non blocking mode(push every buffer when it is i
        turn, and if the buffer is not ready, skip it)) flags: readable, writable Enum “GstHailoRoundRobinMode” De-
              fault: 1, “blocking-mode”
                  (0): funnel-mode - Funnel Mode (push every buffer when it is ready) (1): blocking-mode - Block-
                  ing Mode (push every buffer when it is its pad’s turn, and if the buffer is not ready,
block until ready) (2): non-blocking-mode - Non Blocking Mode (push every buffer when it is its pad’s turn, and if
      the buffer is not re
  Page 131       Release 3.31.0          Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
name [The name of the object] flags: readable, writable String. Default: “hailoroundrobin0”
parent [The parent of the object] flags: readable, writable Object of type “GstObject”
      queue-size [Size of the queue for each pad (only relevant when using non-blocking mode)] flags: readable,
          writable, controllable Unsigned Integer. Range: 1 - 10 Default: 3
      retries-num [Number of retries to get a buffer from a pad queue (only relevant when using non-blocking
            mode)] flags: readable, writable, controllable Unsigned Integer. Range: 1 - 20 Default: 3
6.14.1. Overview
HailoStreamRouter is an element that provides de-muxing functionality. It is designed to be used after muxing
any number of streams using a hailoroundrobin element.
Note: hailoroundrobin tags each incoming frame with the input pad name it was received on (adding it to the meta-
data of the buffer).
Each HailoStreamRouter has to be configured with a list of input names (In accordance with the HailoR-
oundRobin inputs). As an Example: .. code-block:
src_0::input-streams='<sink_0, sink_1>' src_1::input-streams='<sink_2, sink_3>'
HailoStreamRouter receives a frame on its sink pad, reads the input name from it’s metadata, and then passes
the frame to pre configured source pads.
6.14.2. Example
Here’s an example of a pesudo pipeline muxing 4 streams into one detection pipeline, and then de-muxing them into
2 separate pipelines - one for person attributes and one for face attributes.
In this example HailoStreamRouter is configured with 2 source pads that each have a list of 2 input streams.
Another Example is using HailoStreamRouter as a classic de-muxer, where each input stream is mapped to a
single output, and into compositor afterwards.
  Page 132      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                        TAPPAS User Guide
6.14.3. Hierarchy
 GObject
 --GInitiallyUnowned
   --GstObject
      --GstElement
         --GstHailoStreamRouter
Implemented Interfaces:
 GstChildProxy
Pad Templates:
 SINK template: 'sink'
  Availability: Always
  Capabilities:
   ANY
Pads:
 SINK: 'sink'
  Pad Template: 'sink'
Element Properties:
 name        : The name of the object
            flags: readable, writable, 0x2000
            String. Default: ”hailostreamrouter0”
 parent       : The parent of the object
            flags: readable, writable, 0x2000
            Object of type ”GstObject”
 Page 133   Release 3.31.0   Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
6.15.1. Overview
HailoExportFile is an element which provides an access point in the pipeline to export HailoObjects meta to a JSON
file.
The meta itself is not changed or removed, and buffers continue onwards in the pipeline unchanged.
Parameters
The HailoExportFile element allows the user to change the output file name/path. The default is hailo_meta.json
6.15.2. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstBaseTransform
            +----GstHailoExportFile
Pad Templates:
 SRC template: 'src'
  Availability: Always
  Capabilities:
   video/x-raw
        format: { (string)RGB, (string)YUY2 }
         width: [ 1, 2147483647 ]
        height: [ 1, 2147483647 ]
       framerate: [ 0/1, 2147483647/1 ]
Pads:
 SINK: 'sink'
  Pad Template: 'sink'
 SRC: 'src'
  Pad Template: 'src'
Element Properties:
 name         : The name of the object
            flags: readable, writable
            String. Default: ”hailoexportfile0”
 parent        : The parent of the object
            flags: readable, writable
            Object of type ”GstObject”
 qos         : Handle Quality-of-Service events
            flags: readable, writable
                                                                                                (continues on next page)
  Page 134      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
6.16.1. Overview
HailoExportZMQ is an element which provides an access point in the pipeline to export HailoObjects meta to a ZMQ
socket.
The meta itself is not changed or removed, and buffers continue onwards in the pipeline unchanged.
Parameters
The HailoExportZMQ element allows the user to change the output port/protocol. The default is tcp://*:5555. Cur-
rently only PUB behvaior (PUB/SUB) is supported.
6.16.2. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstBaseTransform
            +----GstHailoExportZMQ
Pad Templates:
 SINK template: 'sink'
  Availability: Always
  Capabilities:
   video/x-raw
        format: { (string)RGB, (string)YUY2 }
         width: [ 1, 2147483647 ]
        height: [ 1, 2147483647 ]
       framerate: [ 0/1, 2147483647/1 ]
Pads:
 SINK: 'sink'
  Pad Template: 'sink'
 SRC: 'src'
  Pad Template: 'src'
                                                                                              (continues on next page)
  Page 135     Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
Element Properties:
 name         : The name of the object
            flags: readable, writable
            String. Default: ”hailoexportzmq0”
 parent        : The parent of the object
            flags: readable, writable
            Object of type ”GstObject”
 qos         : Handle Quality-of-Service events
            flags: readable, writable
            Boolean. Default: false
 address        : Address to bind the socket to.
            flags: readable, writable, changeable only in NULL or READY state
            String. Default: ”tcp://*:5555”
6.17.1. Overview
HailoImportZMQ is an element which provides an access point in the pipeline to import HailoObjects meta from a
ZMQ socket.
The meta is added to any pre-existing ROI in the buffer, and then the buffer continues onwards in the pipeline.
Parameters
The HailoImportZMQ element allows the user to change the input port/protocol. The default is tcp://localhost:5555.
Currently only SUB behvaior (PUB/SUB) is supported.
6.17.2. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstBaseTransform
            +----GstHailoImportZMQ
Pad Templates:
 SRC template: 'src'
  Availability: Always
  Capabilities:
   ANY
Pads:
 SINK: 'sink'
  Pad Template: 'sink'
                                                                                                 (continues on next page)
  Page 136      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
 SRC: 'src'
  Pad Template: 'src'
Element Properties:
 name         : The name of the object
            flags: readable, writable
            String. Default: ”hailoimportzmq0”
 parent        : The parent of the object
            flags: readable, writable
            Object of type ”GstObject”
 qos         : Handle Quality-of-Service events
            flags: readable, writable
            Boolean. Default: false
 address        : Address to bind the socket to.
            flags: readable, writable, changeable only in NULL or READY state
            String. Default: ”tcp://localhost:5555”
6.18.1. Overview
HailoOSD is an element which enables the user to draw static text, images, and timestamps on GstBuffers using the
DSP provided in Hailo-15. By offloading the image blending to the DSP, high performance overlays can be achieved.
The DSP also supports transparent blending, allowing HailoOSD to draw image files with transparency.
Currently only NV12 pipelines are supported by HailoOSD.
  Page 137     Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
Parameters
{
    ”image”: [
      {
        ”id”: ”image_id”,
        ”image_path”: ”/path/to/image”,
        ”width”: 0.2,
        ”height”: 0.13,
        ”x”: 0.76,
        ”y”: 0.05,
        ”z-index”: 1
      }
    ],
    ”dateTime”: [
      {
        ”id”: ”datetime_id”,
        ”font_size”: 2,
        ”text_color”: [0, 0, 255],
        ”x”: 0.1,
        ”y”: 0.7,
        ”z-index”: 3
      }
    ],
    ”text”: [
      {
        ”id”: ”text1_id”,
        ”label”: ”example text 1”,
        ”font_size”: 2,
        ”text_color”: [255, 0, 0],
        ”x”: 0.7,
        ”y”: 0.8,
        ”z-index”: 1
      },
      {
        ”id”: ”text2_id”,
        ”label”: ”example text 2”,
        ”font_size”: 2,
        ”x”: 0.05,
        ”y”: 0.1,
        ”z-index”: 1
      }
    ]
}
    Page 138    Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                        TAPPAS User Guide
6.18.2. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstBaseTransform
            +----GstHailoOsd
Pad Templates:
 SINK template: 'sink'
  Availability: Always
  Capabilities:
   video/x-raw
        format: { (string)NV12 }
         width: [ 1, 2147483647 ]
        height: [ 1, 2147483647 ]
       framerate: [ 0/1, 2147483647/1 ]
Pads:
 SINK: 'sink'
  Pad Template: 'sink'
 SRC: 'src'
  Pad Template: 'src'
Element Properties:
 config-file-path       : json config file path
            flags: readable, writable, changeable only in NULL or READY state
            String. Default: ”NULL”
 name         : The name of the object
            flags: readable, writable, 0x2000
            String. Default: ”hailoosd0”
 parent        : The parent of the object
            flags: readable, writable, 0x2000
            Object of type ”GstObject”
 qos         : Handle Quality-of-Service events
            flags: readable, writable
            Boolean. Default: false
 Page 139   Release 3.31.0   Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
6.19.1. Overview
HailoUpload is an element specifically designed for Hailo-15 system. It is responsible for transformation between
memory spaces.
    • Request an address (pointer) to a physically contiguous buffer from the kernel at a specifc size (determined by
      the format and resolution of the frame).
• Hold the address in a buffer pool - to free the buffer when its reference count is zero.
• Ensure that the output buffer is physically contiguous in memory and also virtually contiguous.
DSP and Encoder require physically contiguous buffers. It is recommended to make sure that a buffer is contiguous
in memory, before being sent to an element that uses DSP- it is essential to avoid memcopies. (Like in HailoCropper).
In Encoder - contiguous memory is mandatory. (see Media Library documentation for more information).
As an example, file source allocates non-contiguous buffers, meaning a hailoupload is required to use
hailoh265enc:
gst-launch-1.0 filesrc location=video.raw name=src_0 ! rawvideoparse format=rgb�
 ,→width=1920 height=1080 ! hailoupload ! hailoh265enc ! fakesink
Another example is to use hailoupload before hailonet, to make sure that the input buffer is virtually contiguous in
memory:
,→hef ! fakesink
HailoUpload inherits from HailoDspBaseTransform which is responsible for managing the allocation
queries and buffer pool.
6.19.2. Hierarchy
         GObject                                                                                                  �
       ,→                                            │
      +----GInitiallyUnowned                                                                                     �
       ,→                                                          │
         +----GstObject                                                                                          �
       ,→                                              │
              +----GstElement                                                                                    �
       ,→                                                  │
                 +----GstBaseTransform                                                                            �
       ,→                                                      │
                                                                                            (continues on next page)
  Page 140      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                        TAPPAS User Guide
                  +----GstHailoDspBaseTransform                                                        �
    ,→                                                         │
                    +----GstHailoUpload                                                                �
    ,→                                                 │
                                                                                                       �
    ,→                             │
   Pad Templates:                                                                                     �
    ,→                                             │
   SINK template: 'sink'                                                                               �
    ,→                                                 │
      Availability: Always                                                                             �
    ,→                                                     │
      Capabilities:                                                                                   �
    ,→                                             │
      ANY                                                                                              �
    ,→                                 │
                                                                                                       �
    ,→                             │
   SRC template: 'src'                                                                                 �
    ,→                                             │
      Availability: Always                                                                             �
    ,→                                                     │
      Capabilities:                                                                                   �
    ,→                                             │
      ANY                                                                                              �
    ,→                                 │
                                                                                                       �
    ,→                        │
   Element has no clocking capabilities.                                                              �
    ,→                                                             │
   Element has no URI handling capabilities.                                                           �
    ,→                                                                 │
                                                                                                       �
    ,→                             │
   Pads:                                                                                              �
    ,→                                     │
   SINK: 'sink'                                                                                        �
    ,→                                         │
      Pad Template: 'sink'                                                                             �
    ,→                                                 │
   SRC: 'src'                                                                                          �
    ,→                                     │
      Pad Template: 'src'                                                                              �
    ,→                                                 │
                                                                                                       �
    ,→                             │
   Element Properties:                                                                                 �
    ,→                                                 │
   name           : The name of the object                                                            �
    ,→                                          │
                  flags: readable, writable, 0x2000                                                    �
    ,→                                               │
                  String. Default: ”hailoupload0”                                                      �
    ,→                                              │
   parent          : The parent of the object                                                          �
    ,→                                            │
                  flags: readable, writable, 0x2000                                                    �
    ,→                                               │
                  Object of type ”GstObject”                                                          �
    ,→                                           │
   pool-size         : Size of the pool of buffers to use for cropping. Default 10                    �
    ,→                                                               │
                                                                                 (continues on next page)
Page 141    Release 3.31.0   Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
6.20.1. Overview
Hailograytonv12 is an element that replaces the GRAY8 buffer with an NV12 buffer that is stored in the metadata of
the GRAY8 buffer. It is a mirror to the hailonv12togray element.It is worth noting that this process does not involve
any buffer copies, enabling high performance.This element is particularly useful for NV12 pipelines that want to use
a GRAY8 formatted HEF.In such cases, the hailonv12togray element should be placed before the hailonet element,
and the hailograytonv12 element should be placed after the hailonet element, to retrieve the original NV12 buffer.
6.20.2. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstBaseTransform
            +----GstHailograytonv12
Pad Templates:
 SRC template: 'src'
  Availability: Always
  Capabilities:
   video/x-raw
        format: { (string)NV12 }
         width: [ 1, 2147483647 ]
        height: [ 1, 2147483647 ]
       framerate: [ 0/1, 2147483647/1 ]
Pads:
 SINK: 'sink'
  Pad Template: 'sink'
 SRC: 'src'
  Pad Template: 'src'
                                                                                                   (continues on next page)
  Page 142      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
Element Properties:
 name         : The name of the object
            flags: readable, writable
            String. Default: ”hailograytonv12-0”
 parent        : The parent of the object
            flags: readable, writable
            Object of type ”GstObject”
 qos         : Handle Quality-of-Service events
            flags: readable, writable
            Boolean. Default: false
6.21.1. Overview
Hailonv12togray is an element that performs conversion of NV12 format to GRAY8 format, while preserving the initial
NV12 buffer as the metadata of the resulting GRAY8 buffer. It is a mirror to the hailograytonv12 element.It is worth
noting that this process does not involve any buffer copies, enabling high performance.This element is particularly
useful for NV12 pipelines that want to use a GRAY8 formatted HEF.In such cases, the hailonv12togray element should
be placed before the hailonet element, and the hailograytonv12 element should be placed after the hailonet element,
to retrieve the original NV12 buffer.
6.21.2. Hierarchy
GObject
+----GInitiallyUnowned
   +----GstObject
      +----GstElement
         +----GstBaseTransform
            +----GstHailonv12togray
Pad Templates:
 SRC template: 'src'
  Availability: Always
  Capabilities:
   video/x-raw
        format: { (string)GRAY8 }
         width: [ 1, 2147483647 ]
        height: [ 1, 2147483647 ]
       framerate: [ 0/1, 2147483647/1 ]
Pads:
 SINK: 'sink'
                                                                                                (continues on next page)
  Page 143      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                        TAPPAS User Guide
Element Properties:
 name         : The name of the object
            flags: readable, writable
            String. Default: ”hailonv12togray0”
 parent        : The parent of the object
            flags: readable, writable
            Object of type ”GstObject”
 qos         : Handle Quality-of-Service events
            flags: readable, writable
            Boolean. Default: false
 Page 144   Release 3.31.0   Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
7. Pipelines
This section provides a drill-down into the template of our cascaded network pipelines with a focus on explaining the
GStreamer pipeline.
First, it is necessary to declare two sub-pipelines, these pipelines are derived from our Single network template
NETWORK_ONE_PIPELINE=”videoscale qos=false ! \
   queue leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0 ! \
   hailonet net-name=$NETWORK_ONE_NAME \
   hef-path=$hef_path is-active=true qos=false ! \
   queue leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0 ! \
   hailofilter so-path=$NETWORK_ONE_SO function-name=$NETWORK_ONE_FUNC_NAME�
 ,→qos=false ! \
   hailonet net-name=$NETWORK_TWO_NAME \
   hef-path=$hef_path is-active=true qos=false ! \
   queue leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0 ! \
   hailofilter so-path=$NETWORK_TWO_SO function-name=$NETWORK_TWO_FUNC_NAME�
 ,→qos=false ! \
gst-launch-1.0 \
   $source_element ! \
   tee name=t \
   \
   hailomuxer name=hmux \
   \
   t. ! queue leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0 ! hmux. \
   t. ! $NETWORK_ONE_PIPELINE ! hmux. \
   hmux. ! queue leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0 ! \
   hailocropper internal-offset=$internal_offset name=cropper \
   \
   hailoaggregator name=agg \
   \
   cropper. ! queue leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0 !�
 ,→agg. \
   \
   cropper. ! $NETWORK_TWO_PIPELINE ! agg. \
                                                                                                   (continues on next page)
  Page 145       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
$source_element ! \
tee name=t \
\
hailomuxer name=hmux \
\
t. ! queue leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0 ! hmux. \
t. ! $NETWORK_ONE_PIPELINE ! hmux. \
hmux. ! queue leaky=no max-size-buffers=3 max-size-bytes=0 max-size-time=0 ! \
This section of the pipeline is taken from our: Single network template. in brief: run an inference while keeping the
original image resolution.
Hailocropper Hailocropper splits the pipeline into 2 branches: the first passes the original frame while the other
passes crops from that original frame one at a time. The hailocropper chooses what crops to take from the origi-
nal frame based on an so file that you can provide (typically a set of detections from a prior hailofilter postprocess).
The hailocropper also scales all crops based on caps negotiation. This way if a hailonet is placed after the cropper
(such as in this example), then the hailocropper will scale all crops to that hailonet’s input network size. The hailoag-
gregator gets the original frame and then knows to wait for all related cropped buffers: aggregating all metadata to
the original frame, then sending it forward.
The first part of the cascading network pipeline, passes the original frame on the bypass pads to hailoaggregator.
The second part of the cascading network pipeline, performs a second network on all�
 ,→objects, which are cropped and scaled to the needed resolution by the HEF in the�
,→hailonet.
Aggregates all objects to the original frame, and draws them over the frame using the hailooverlay with specific draw-
ing function.
  Page 146       Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
This page provides a drill-down into the template of our multi-device pipelines with a focus on explaining the
GStreamer pipeline.
gst-launch-1.0 \
   $source_element ! videoconvert ! \
   videoscale ! \
   queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   hailonet hef-path=$hef_path device-count=$device_count is-active=true ! \
   queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   hailofilter function-name=$network_name so-path=$postprocess_so qos=false ! \
   queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   hailooverlay qos=false ! \
   queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   videoconvert ! \
   fpsdisplaysink video-sink=$video_sink_element name=hailo_display sync=$sync_
 ,→pipeline text-overlay=false
This pipeline is based on-top of our single network pipeline. The number of physical devices to utilize is set via the
hailonet device-count property (The default is 4 in this app)
  Page 147      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                                TAPPAS User Guide
This page provides a drill-down into the template of our multi stream pipelines with a focus on explaining the
GStreamer pipeline.
n=4
sources=''
pipeline=”gst-launch-1.0 \
     funnel name=fun ! \
     queue name=hailo_pre_infer_q_0 leaky=no max-size-buffers=30 max-size-bytes=0�
 ,→max-size-time=0 ! \
     hailooverlay ! \
     streamiddemux name=sid \
     compositor name=comp start-time-selection=0 $compositor_locations ! \
     queue name=hailo_video_q_0 leaky=no max-size-buffers=30 max-size-bytes=0 max-
 ,→size-time=0 ! \
    •   funnel takes multiple input sinks and outputs one source. an N-to-1 funnel that attaches a streamid to each
        stream, can later be used to demux back into separate streams. this lets you queue frames from multiple
  Page 148       Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
    •   streamiddemux a reverse to the funnel.         It is a 1-to-N demuxer that splits a serialized stream based on
        stream id to multiple outputs.
    •   compositor composites pictures from multiple sources. handy for multi-stream/tiling like applications, as
        it lets you input many streams and draw them all together as a grid.
This page provides a drill-down into the template of our parallel networks pipeline with a focus on explaining the
GStreamer pipeline.
gst-launch-1.0 \
   $source_element ! videoconvert ! \
   queue name=hailo_pre_split leaky=no max-size-buffers=30 max-size-bytes=0 max-
 ,→size-time=0 ! \
   tee name=splitter \
   hailomuxer name=hailomuxer ! \
   queue name=hailo_draw0 leaky=no max-size-buffers=30 max-size-bytes=0 max-size-
 ,→time=0 ! \
   hailooverlay qos=false ! \
   splitter. ! queue name=hailo_pre_infer_q_1 leaky=no max-size-buffers=5 max-size-
 ,→bytes=0 max-size-time=0 ! \
 Page 149         Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
gst-launch-1.0 \
   $source_element ! videoconvert !
   queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   tee name=t ! queue ! videoscale ! \
   queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   hailonet hef-path=$hef_path is-active=true net-name=$network_one_name ! \
   queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   hailofilter so-path=$network_one_so qos=false ! videoconvert ! \
   fpsdisplaysink video-sink=$video_sink_element name=hailo_display sync=false text-
 ,→overlay=false \
   t. ! \
   videoscale ! queue ! \
   hailonet hef-path=$hef_path is-active=true net-name=$network_two_name ! \
   queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   hailofilter so-path=$network_two_so function-name=mobilenet_ssd_merged�
 ,→qos=false ! \
This pipeline is based on-top of the single network pipeline, the modification amounts to using the GStreamer built in
the tee element.
This page provides a drill-down into the template of our single network pipelines with a focus on explaining the
  Page 150      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
GStreamer pipeline.
gst-launch-1.0 \
   filesrc location=$video_device ! decodebin ! videoconvert ! \
   videoscale ! \
   queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   hailonet hef-path=$hef_path is-active=true ! \
   queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   hailofilter function-name=yolov5 so-path=$POSTPROCESS_SO qos=false ! \
   queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   hailooverlay ! \
   videoconvert ! \
   fpsdisplaysink video-sink=xvimagesink name=hailo_display sync=true text-
 ,→overlay=false
Specifies the location of the video used, then decodes and converts to the required format.
videoscale ! \
Re-scale the video dimensions to fit the input of the network. The video scale finds out�
 ,→the requires width and height using caps negotiation with ``hailonet``.
Before sending the frames into the hailonet element, set a queue so no frames are lost (Read more about queues
here)
hailooverlay ! \
hailofilter performs a given post-process to extract the objects. The following hailooverlay element is able to draw
standard HailoObjects to the buffer.
videoconvert ! \
fpsdisplaysink video-sink=xvimagesink name=hailo_display sync=true text-
 ,→overlay=false
Apply the final convert to let GStreamer utilize the format required by the fpsdisplaysink element
  Page 151      Release 3.31.0       Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                               TAPPAS User Guide
Using this template the source resolution would be preserved, this is an extension to our Example pipeline
gst-launch-1.0 \
   $source_element ! videoconvert ! \
   tee name=t hailomuxer name=mux \
   t. ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! mux. \
   t. ! videoscale ! \
   queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   hailonet hef-path=$hef_path is-active=true ! \
   queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   hailofilter function-name=$network_name so-path=$postprocess_so qos=false ! mux. \
   mux. ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
   hailooverlay ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-
 ,→time=0 ! \
   videoconvert ! \
   fpsdisplaysink video-sink=$video_sink_element name=hailo_display sync=$sync_
 ,→pipeline text-overlay=false
    •   hailotilecropper which splits the frame into tiles by separating the frame into rows and columns
              (given as parameters to the element).
    •   hailotileaggregator which aggregates the cropped tiles and stitches them back to the original reso-
        lution.
  Page 152        Release 3.31.0     Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
An example for the pipeline itself could be found on our Tiling app.
  Page 153      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                              TAPPAS User Guide
8. Tools
# Run `gst_set_debug`
$ gst_set_debug
8.2.1. Overview
Hailo recommended method at the moment for cross-compilation is using Yocto SDK (aka Toolchain). We provide
wrapper scripts whose only requirement is a Yocto toolchain to make this as easy as possible.
8.2.2. Preparations
In order to cross-compile you need to run TAPPAS container on a X86 machine and copy the Yocto toolchain to the
container.
Toolchain
What is Toolchain?
• Cross-Development Toolchain: This toolchain contains a compiler, debugger, and various miscellaneous tools.
    • Libraries, Headers, and Symbols: The libraries, headers, and symbols are specific to the image (i.e. they match
      the image).
    • Environment Setup Script: This *.sh file, once run, sets up the cross-development environment by defining
      variables and preparing for Toolchain use.
You can use the standard Toolchain to independently develop and test code that is destined to run on some target
machine.
  Page 154      Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
For this example we will add the recipes to an NXP-IMX based image
Must add
# GStreamer plugins
IMAGE_INSTALL_append += ”         \
  imx-gst1.0-plugin           \
  gstreamer1.0-plugins-bad-videoparsersbad \
  gstreamer1.0-plugins-good-video4linux2 \
  gstreamer1.0-plugins-base         \
”
Nice to add
# GStreamer plugins
IMAGE_INSTALL_append += ”                        \
  gstreamer1.0-python                        \
  gst-instruments                        \
”
8.2.3. Components
TAPPAS
This script cross-compiles TAPPAS components. This script first unpack and installs the toolchain (if not already
installed), and then cross-compiles TAPPAS core/.
  Page 155     Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
Flags
$ ./cross_compile_tappas.py --help
usage: cross_compile_tappas.py [-h] [--remote-machine-ip REMOTE_MACHINE_IP] [--
 ,→build-lib {all,apps,plugins,libs,tracers}] [--clean-build-dir]
               [--install-to-rootfs]
               {aarch64,armv7l,armv7lhf,armv8a} {imx8,hailo15} {debug,release}�
 ,→toolchain_dir_path
Cross-compile TAPPAS
positional arguments:
{aarch64,armv7l,armv7lhf,armv8a}
            Arch to compile to
{imx8,hailo15} Target platform to compile to
{debug,release}     Build and compilation type
toolchain_dir_path Toolchain directory path
optional arguments:
-h, --help      show this help message and exit
--remote-machine-ip REMOTE_MACHINE_IP
            remote machine ip
--build-lib {all,apps,plugins,libs,tracers}
            Build a specific tappas lib target (default all)
--clean-build-dir Delete previous build cache (default false)
--install-to-rootfs Install to rootfs (default false)
Example
Note: In this example we assume that the toolchain is located under toolchain-raw/hailo-dartmx8m-dunfell-aarch64-
toolchain
$ ls aarch64-gsthailotools-build/
build.ninja compile_commands.json config.h libs meson-info meson-logs meson-
 ,→private plugins
$ ls aarch64-gsthailotools-build/libs/*.so
libcenterpose_post.so libmobilenet_ssd_post.so
libclassification.so libsegmentation_draw.so
libdebug.so       libyolo_post.so
libdetection_draw.so
  Page 156     Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                             TAPPAS User Guide
Find out where the GStreamer plugins are stored in your embedded device by running the following command:
Copy libgsthailo.so + libgsthailotools.so to the path found out above. Copy the post-processes
so files under libs to the embedded device under /usr/lib/hailo-post-processes (create the directory if it does not
exist)
Run gst-inspect-1.0 hailo and gst-inspect-1.0 hailotools and make sure that no error raises
  Page 157     Release 3.31.0      Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.
                            TAPPAS User Guide
9. Scripts
1) Enter core/hailo/meson.build
4) Run:
./scripts/misc/internals/record_perf/record_perf.sh <time>
Page 158 Release 3.31.0 Confidential and Proprietary | Copyright © 2025 – Hailo Technologies Ltd.