# Face recognition The **gst-ai-face-recognition** application collects the live video input from a camera or an RTSP stream and shares this input for face detection, facial landmarking, and face recognition. It uses the `face_det_quantized` models for face detection, `facemap_3dmm_quantized` model for facial landmarking, and `face_attrib_net_quantized` model for face recognition labels. The result is a preview of the overlaid AI model on the HDMI display. Note This application isn't supported in the QLI 2.0 RC2 release. The following figure shows the pipeline, which receives the input, preprocesses it, runs inferences on AI hardware, and displays the results on the screen. Qualcomm Open source qtivoverlay Waylandsink tee qtimetamux qtiqmmfsrc qtimlvconverter qtimlqnn qtimlpostprocess sink_1 sink_0 qtimlvconverter qtimlqnn qtimlpostprocess sink_1 sink_0 tee qtimetamux qtimlvconverter qtimlqnn qtimlpostprocess rtspsrc rtph264 depay h264parse V4l2h264dec tee qtimetamux qtimlvconverter qtimlqnn qtimlpostprocess **Figure : gst-ai-face-recognition pipeline** For information about the plugins used in the pipeline flow, see [Pipeline flow](https://docs.qualcomm.com/doc/80-80021-50/topic/gst-ai-face-recognition.html#section-mrl-x4m-qdc). ## Sample model and label files Table : Sample model and label files for gst-ai-face-recognition | Runtime | Model files | Label files | | --- | --- | --- | | Qualcomm AI Engine direct and LiteRT | | | ## Register a face for facial recognition Before running the gst-ai-face-recognition application, you can register a face for secure verification and authentication. 1. Ensure that you complete the [Prerequisites](https://docs.qualcomm.com/doc/80-80021-50/topic/download-model-and-label-files.html). 2. To register a face, use the following gst-pipeline on the target device shell: gst-pipeline-app -e \ qtimlvconverter name=stage_01_preproc mode=image-batch-non-cumulative \ qtimltflite name=stage_01_inference model=/etc/models/face_det_lite_quantized.tflite delegate=external external-delegate-path=libQnnTFLiteDelegate.so \ external-delegate-options="QNNExternalDelegate,backend_type=htp;" \ qtimlpostprocess name=stage_01_postproc settings="{\"confidence\": 40.0}" results=4 module=qfd labels=/etc/labels/face_detection.json \ qtimlvconverter name=stage_03_preproc mode=roi-batch-cumulative \ qtimltflite name=stage_03_inference model=/etc/models/face_attrib_net_quantized.tflite delegate=external external-delegate-path=libQnnTFLiteDelegate.so \ external-delegate-options="QNNExternalDelegate,backend_type=htp;" \ qtiqmmfsrc video_0::type=video name=camsrc ! video/x-raw,format=NV12,width=1920,height=1080 ! queue ! waylandsink fullscreen=true sync=false \ camsrc.image_1 ! video/x-raw,width=1920,height=1080 ! qtivtransform ! video/x-raw,format=NV12 ! tee name=t_split_1 \ t_split_1. ! queue ! metamux_1. \ t_split_1. ! queue ! stage_01_preproc. stage_01_preproc. ! queue ! stage_01_inference. stage_01_inference. ! queue ! \ stage_01_postproc. stage_01_postproc. ! text/x-raw ! queue ! metamux_1. \ qtimetamux name=metamux_1 ! queue ! tee name=t_split_3 \ t_split_3. ! queue ! stage_03_preproc. stage_03_preproc. ! queue ! stage_03_inference. stage_03_inference. ! queue ! \ multifilesink location=/etc/data/tensor_%d.bin sync=true async=false enable-last-sample=false Copy to clipboard A list of options is displayed. 3. To prepare for capturing a facial image, do the following: 1. Select the following options from the list: 1. `(3)PLAYING`: Move the pipeline to the Playing state. 2. `(p)Plugin Mode` ➔ `(26)camsrc`➔ `(70)capture-image`: Capture the image using a camera source. 2. Using the live preview on the display, face the camera and ensure that the camera is pointed straight and there is only one person in the frame. 3. In the terminal, enter 1 for the following values: 1. `GstImageCaptureMode` for `arg0`. 2. `guint` for `arg1`. 4. To capture all the sides of your face, select `capture-image` do the following for each side: 1. Left and right: Turn your head left by 40° while keeping the landmarks visible, then repeat steps 3 and 4. Turn your head right (by 40°) and repeat. 2. Up and down: Raise your head by 30° while keeping the landmarks visible, then repeat steps 3 and 4. Lower your head (by 30°) and repeat. 5. To stop the pipeline, use `(b)Back` and `(q)Quit`. After running the pipeline, five individual tensor bins are created (`tensor_0.bin` to `tensor_4.bin`) with facial properties recorded for each side of the face. 6. On the target device, go to `/etc/data/`, find the tensor bins. To pull the bins from the target device to the Linux host computer: - For Qualcomm Linux, run the following commands: scp root@:/etc/data/tensor_0.bin . Copy to clipboard scp root@:/etc/data/tensor_1.bin . Copy to clipboard scp root@:/etc/data/tensor_2.bin . Copy to clipboard scp root@:/etc/data/tensor_3.bin . Copy to clipboard scp root@:/etc/data/tensor_4.bin . Copy to clipboard - For Ubuntu Server use the following reference command: scp ubuntu@:/etc/data/tensor_.bin Copy to clipboard 7. To merge the tensor bins with all the facial properties into a cohesive image, download and run the `facedb.py` script in the same directory as the tensor bins on the Linux host computer. 1. Download the `facedb.py` script: curl -L -O https://raw.githubusercontent.com/quic/sample-apps-for-qualcomm-linux/refs/heads/main/qualcomm-linux/scripts/facedb.py Copy to clipboard 2. Run the script. Note that *<Name of the person>* is case and style sensitive. Ensure that you use the same name consistently. python3 ./facedb.py "" 512 32 tensor_0.bin tensor_1.bin tensor_2.bin tensor_3.bin tensor_4.bin Copy to clipboard A `face.bin` binary is created. 8. Push the `face.bin` binary to `/etc/data` directory and rename it to `face0.bin`. scp face.bin root@:/etc/data/face0.bin Copy to clipboard For Ubuntu Server, copy the `face.bin` binary to the user home directory and then use the `sudo` command to copy it to the `/etc/models` directory. 9. To generate the `face_recognition.json` file and register the new person into the database, use the following reference label file for two-person registered face: [ {"id": 0, "color": "0x00FF00FF", "label": ""}, {"id": 1, "color": "0xFFFF00FF", "label": ""} ] Copy to clipboard Note Update the ID field according to the number in the list. If more faces are registered, add the structure in a new line within `face_recognition.json`. 10. To generate the `face_recognition_settings.json` file use the following reference label file: { "confidence": 51.0, "databases":[ {"id": 0, "database": "/etc/data/face0.bin"}, {"id": 1, "database": "/etc/data/face1.bin"} ] } Copy to clipboard 11. To push the updated `face_recognition.json` and `face_recognition_settings.json` files to the `/etc/labels` directory on the target device. scp face_recognition.json root@:/etc/labels Copy to clipboard scp face_recognition_settings.json root@:/etc/labels Copy to clipboard For Ubuntu Server, copy the `face_recognition.json` and `face_recognition_settings.json` files to the user `home` folder and then use the `sudo` command to copy it to the `/etc/labels` directory. ## Run the application on the target device Note The following commands provide the default model and label paths. If you have a different folder structure, replace the default paths in the command-line parameters. See [Sample model and label files](https://docs.qualcomm.com/doc/80-80021-50/topic/gst-ai-face-recognition.html#section-bxr-x4m-qdc). The sample application uses the `/etc/configs/config-face-recognition.json` file to read the input parameters. To create your own config JSON file, use [config-face-recognition.json](https://git.codelinaro.org/clo/le/platform/vendor/qcom-opensource/gst-plugins-qti-oss/-/tree/imsdk.lnx.2.0.0.r2-rel/gst-sample-apps/gst-ai-face-recognition?ref_type=heads) as a reference. 1. Update the config JSON file based on the model, input stream, and other properties. For more information, see [Config JSON field description](https://docs.qualcomm.com/doc/80-80021-50/topic/gst-ai-object-detection.html#section-qjx-hqq-32c). 2. Use the following format of the `/etc/configs/config-face-recognition.json` file: { "ml-framework": "", "face-detection-model": "", "face-landmark-model":"", “face-recognition-model”:””, "face-detection-labels":””, "face-recognition-labels":””, "face-recognition-settings": "", "facemap-3dmm-settings": "" } Copy to clipboard For example, run the application using LiteRT, custom models, custom labels file: { "ml-framework":"tflite", "face-detection-model":"/etc/models/face_det_lite_quantized.tflite", "face-landmark-model":"/etc/models/facemap_3dmm_quantized.tflite", "face-recognition-model":"/etc/models/face_attrib_net_quantized.tflite", "face-detection-labels": "/etc/labels/face_detection.json", "face-recognition-labels": "/etc/labels/face_recognition.json", "face-recognition-settings": "/etc/labels/face_recognition_settings.json", "facemap-3dmm-settings": "/etc/labels/facemap_3dmm_settings.json" } Copy to clipboard 3. Run the gst-ai-face-recognition application: gst-ai-face-recognition --config-file=/etc/configs/config-face-recognition.json Copy to clipboard 4. To display the available help options, run the following commands in the SSH shell: gst-ai-face-recognition -h Copy to clipboard 5. To stop the use case, use **CTRL + C**. ## Expected output ![../../_images/gst-ai-face-recognition-expected-output.jpg](data:image/jpeg;base64,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) ## Pipeline flow The following table lists the plugins used in the face recognition pipeline: | Plugin | Description | | --- | --- | | Camera source: [qtiqmmfsrc](https://docs.qualcomm.com/doc/80-80021-50/topic/qtiqmmfsrc.html) |

  • Captures the live stream from camera.


  • Uses tee to split the stream for inferencing.


| | File source: filesrc |

  • Captures the video stream using filesrc, followed by qtdemux, which demultiplexes the stream.


  • Uses tee to split the stream for inferencing.


| | RTSP source: rtspsrc |

  • Captures the RTSP stream using rtspsrc, followed by rtph264depay for video extraction.


  • Uses tee to split the stream for inferencing.


| | h264parse | Parses the H.264 video. | | [v4l2h264dec](https://docs.qualcomm.com/doc/80-80021-50/topic/v4l2h264dec.html) | Decodes the video. | | [qtimlvconverter](https://docs.qualcomm.com/doc/80-80021-50/topic/qtimlvconverter.html) |

  1. Receives the video stream on its sink pad.


  2. Performs the following preprocessing on the stream data. This preprocessing is done when the model expects floating-point values as input.


    1. Color conversion


    2. Scaling (up or down)


    3. Normalization




  3. Converts the preprocessed video stream to a tensor stream on its source pad.




The tensor stream is used for inferencing in the later stages of the pipeline. | | [qtimlqnn](https://docs.qualcomm.com/doc/80-80021-50/topic/qtimlqnn.html) | Acts as the inferencing plugin for Qualcomm Neural Network model.

  1. After the inference runtime receives the tensor stream on its sink pad, it runs the inference.


  2. Produces a tensor stream with the inference results on its source pad.


| | [qtimlpostprocess](https://docs.qualcomm.com/doc/80-80021-50/topic/qtimlpostprocess.html) |

  • Handles inference results from any face detection model.


  • Applies a threshold to the chosen number of results.


| | [qtimetamux](https://docs.qualcomm.com/doc/80-80021-50/topic/qtimetamux.html) |

  • Receives the output of the face detection models from qtimlpostprocess and multiplexes it.


  • Receives the output of facial pose from qtimlpostprocess and multiplexes it.


| | tee | Splits the stream for inferencing. | | qtimlpostprocess for pose estimation | Uses lite-3dmm module to perform the facial pose recognition. | | qtimlpostprocess for classification model | Uses qfr module to receive the stream from qtimetamux and classifies the face. | | [qtivoverlay](https://docs.qualcomm.com/doc/80-80021-50/topic/qtioverlay.html) |

  1. Receives the multiplexed stream.


  2. Overlays the bounding boxes on the stream.


| | [Waylandsink](https://docs.qualcomm.com/doc/80-80021-50/topic/waylandsink.html) |

  1. Waylandsink submits the video stream received on its sink pad to Weston.


  2. Weston renders the video stream on a local display.


| ## Config JSON field description Table : Field description–config-face-recognition.json file | Field | Values/description | | --- | --- | | **ml-framework** | Use one of the following models:

  • tflite–LiteRT


  • qnn–Qualcomm AI Engine direct


| | **Models and labels** | See [Sample model and label files](https://docs.qualcomm.com/doc/80-80021-50/topic/gst-ai-face-recognition.html#section-bxr-x4m-qdc).

  • face-detection-model: The path to the face detection model.


  • face-landmark-model: The path to the face landmark model.


  • face-recognition-model: The path to the face recognition model.


  • face-detection-labels: The path to the face detection labels.


  • face-recognition-labels: The path to the face recognition labels.


  • face-recognition-settings: The path of face recognition setting labels.


  • facemap-3dmm-settings: The path of facemap-3dmm setting labels.


| ## Related information - [Object detection](https://docs.qualcomm.com/doc/80-80021-50/topic/gst-ai-object-detection.html) - [Pose detection](https://docs.qualcomm.com/doc/80-80021-50/topic/gst-ai-pose-detection.html) Last Published: Mar 26, 2026 [Previous Topic Face detection](https://docs.qualcomm.com/bundle/publicresource/80-80021-50/topics/gst-ai-face-detection.md) [Next Topic Audio classification](https://docs.qualcomm.com/bundle/publicresource/80-80021-50/topics/audio-classification.md)