# Face recognition

Source: [https://docs.qualcomm.com/doc/80-70022-50/topic/gst-ai-face-recognition.html](https://docs.qualcomm.com/doc/80-70022-50/topic/gst-ai-face-recognition.html)

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 on the Ubuntu Server.

The following figure shows the pipeline, which receives the input, preprocesses it, runs
            inferences on AI hardware, and displays the results on the screen.

Figure : gst-ai-face-recognition pipeline
            
            <?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1288.94598388671875" height="600.871654510498047" viewbox="0 0 1288.94598388671875 600.871654510498047">
  <g id="Layer_2" data-name="Layer 2">
    <g>
      <rect x=".499755859375" y=".499767303466797" width="1287.9462890625" height="599.87158203125" rx="7.500000000000001" ry="7.500000000000001" style="fill: #fafafa;"></rect>
      <path d="M1280.94598388671875,1c3.85986328125,0,7,3.140167236328125,7,7v584.871654510498047c0,3.85986328125-3.14013671875,7-7,7H8c-3.859832763671875,0-7-3.14013671875-7-7V8c0-3.859832763671875,3.140167236328125-7,7-7h1272.94598388671875M1280.94598388671875,0H8C3.581665039061591,0,0,3.5816650390625,0,8v584.871654510498047c0,4.4183349609375,3.581665039061591,8,8,8h1272.94598388671875c4.4183349609375,0,8-3.5816650390625,8-8V8c0-4.4183349609375-3.5816650390625-8-8-8h0Z" style="fill: #d2d7e1;"></path>
    </g>
    <g>
      <g>
        <text transform="translate(1092.26300048828125 576.963146209716797)" style="font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">Qualcomm </tspan></text>
        <rect x="1072.011999603564618" y="564.871654510498047" width="16" height="16" rx="2" ry="2" style="fill: #2a2aea;"></rect>
      </g>
      <g>
        <text transform="translate(1190.84478759765625 576.963146209716797)" style="font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">Open source</tspan></text>
        <rect x="1170.593781016417779" y="564.871654510498047" width="16" height="16" rx="2" ry="2" style="fill: #007884;"></rect>
      </g>
    </g>
  </g>
  <g id="Layer_3" data-name="Layer 3">
    <g>
      <line x1="929.258301775724249" y1="507.851231315642508" x2="946.694189116413327" y2="507.851270258932345" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
      <g>
        <rect x="696.608850692633496" y="468.425983076927878" width="109.208205931601697" height="76.445744152120824" rx="4" ry="4" style="fill: #2a2aea;"></rect>
        <text transform="translate(717.579833984375 511.116466522216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtivoverlay</tspan></text>
      </g>
      <g>
        <rect x="827.467874552852663" y="468.425983076927878" width="100.989371769333957" height="76.445744152120824" rx="3.99999999999994" ry="3.99999999999994" style="fill: #007884;"></rect>
        <text transform="translate(838.864013671875 511.116466522216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">Waylandsink </tspan></text>
      </g>
      <g>
        <g>
          <rect x="946.957794760390243" y="493.425727563131659" width="39.314954135375956" height="27.520467894764806" rx="4" ry="4" style="fill: none; stroke: #000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2px;"></rect>
          <line x1="958.752281000997755" y1="528.809186284968746" x2="974.478262655145954" y2="528.809186284968746" style="fill: none; stroke: #000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2px;"></line>
        </g>
        <line x1="966.615271828077312" y1="520.946195457896465" x2="966.615271828077312" y2="528.809186284968746" style="fill: none; stroke: #000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2px;"></line>
      </g>
      <rect x="604.748013444052049" y="19.999939169798381" width="65.524923558963565" height="238.742583364275561" rx="4.000000000000002" ry="4.000000000000002" style="fill: #007884;"></rect>
      <rect x="1155.758182628003851" y="19.999939169798381" width="113.576534168871149" height="237.545004843952483" rx="4" ry="4" style="fill: #2a2aea;"></rect>
      <text transform="translate(627.806884765625 143.839122772216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">tee</tspan></text>
      <text transform="translate(1175.180419921875 146.022716522216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimetamux</tspan></text>
      <g>
        <path d="M45.733887428435082,61.150853437437036h-9.828738533844444l-4.914369266922222,5.897243120307394h-5.897243120308303c-2.171304834052535,0-3.931495413535231,1.760190579481787-3.931495413535231,3.931495413535231v17.691729360920363c0,2.171306708734846,1.760190579482696,3.931495413540688,3.931495413535231,3.931495413540688h31.451963308305494c2.171306708734846,0,3.931495413535231-1.760188704805842,3.931495413535231-3.931495413540688v-17.691729360920363c0-2.171304834053444-1.760188704800385-3.931495413535231-3.931495413535231-3.931495413535231h-5.897243120308303l-4.914369266922222-5.897243120307394Z" style="fill: none; stroke: #000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2px;"></path>
        <circle cx="40.81951816151286" cy="76.876835091588191" r="5.897243120307734" style="fill: none; stroke: #000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2px;"></circle>
      </g>
      <rect x="75.291444638843132" y="46.298537430739088" width="93.919057101177714" height="65.524923558961746" rx="4" ry="4" style="fill: #2a2aea;"></rect>
      <g>
        <line x1="169.210494995117188" y1="79.061000823974609" x2="598.930999755859375" y2="79.061000823974609" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
        <polygon points="597.763809204101562 83.050060272216797 604.671981811523438 79.061000823974609 597.763809204101562 75.071933746337891 597.763809204101562 83.050060272216797"></polygon>
      </g>
      <line x1="61.455897765008558" y1="79.060999210219961" x2="75.291444638843132" y2="79.060999210219961" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
      <text transform="translate(85.965576171875 82.906993865966797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtiqmmfsrc</tspan></text>
      <g>
        <g>
          <line x1="670.272933959960938" y1="79.061000823974609" x2="684.608978271484375" y2="79.061000823974609" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="683.441802978515625 83.050060272216797 690.3499755859375 79.061000823974609 683.441802978515625 75.071933746337891 683.441802978515625 83.050060272216797"></polygon>
        </g>
        <g>
          <line x1="670.272933959960938" y1="42.110179901123047" x2="1149.9415283203125" y2="42.110179901123047" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="1148.77435302734375 46.099246978759766 1155.6824951171875 42.110179901123047 1148.77435302734375 38.121112823486328 1148.77435302734375 46.099246978759766"></polygon>
        </g>
        <rect x="690.425647609594307" y="51.758947727319537" width="131.049847117930767" height="54.604102965800848" rx="4" ry="4" style="fill: #2a2aea;"></rect>
        <g>
          <line x1="821.475494384765625" y1="79.061000823974609" x2="835.811553955078125" y2="79.061000823974609" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="834.64434814453125 83.050060272216797 841.552520751953125 79.061000823974609 834.64434814453125 75.071933746337891 834.64434814453125 83.050060272216797"></polygon>
        </g>
        <rect x="841.628205334101949" y="51.758947727319537" width="97.703504413962946" height="54.604102965800848" rx="4" ry="4" style="fill: #2a2aea;"></rect>
        <g>
          <line x1="939.33172607421875" y1="79.061000823974609" x2="953.66778564453125" y2="79.061000823974609" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="952.50054931640625 83.050060272216797 959.40875244140625 79.061000823974609 952.50054931640625 75.071933746337891 952.50054931640625 83.050060272216797"></polygon>
        </g>
        <rect x="959.484420354643589" y="51.758947727319537" width="132.437769294141617" height="54.604102965800848" rx="4" ry="4" style="fill: #2a2aea;"></rect>
        <g>
          <line x1="1091.92218017578125" y1="79.061000823974609" x2="1149.9415283203125" y2="79.061000823974609" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="1148.77435302734375 83.050060272216797 1155.6824951171875 79.061000823974609 1148.77435302734375 75.071933746337891 1148.77435302734375 83.050060272216797"></polygon>
        </g>
        <text transform="translate(707.410888671875 83.528575897216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimlvconverter</tspan></text>
        <text transform="translate(862.978271484375 83.528575897216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimlqnn</tspan></text>
        <text transform="translate(971.209716796875 83.528575897216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimlpostprocess</tspan></text>
        <text transform="translate(1100.400146484375 74.062267303466797)" style="font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">sink_1</tspan></text>
        <text transform="translate(1100.400146484375 34.802013397216797)" style="font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">sink_0</tspan></text>
      </g>
      <g>
        <g>
          <line x1="670.272933959960938" y1="207.666515350341797" x2="684.608978271484375" y2="207.666515350341797" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="683.441802978515625 211.655574798583984 690.3499755859375 207.666515350341797 683.441802978515625 203.677455902099609 683.441802978515625 211.655574798583984"></polygon>
        </g>
        <g>
          <line x1="670.272933959960938" y1="170.715694427490234" x2="1149.9415283203125" y2="170.715694427490234" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="1148.77435302734375 174.704753875732422 1155.6824951171875 170.715694427490234 1148.77435302734375 166.726634979248047 1148.77435302734375 174.704753875732422"></polygon>
        </g>
        <rect x="690.425647609594307" y="180.364462163193821" width="131.049847117930767" height="54.604102965800848" rx="4" ry="4" style="fill: #2a2aea;"></rect>
        <g>
          <line x1="821.475494384765625" y1="207.666515350341797" x2="835.811553955078125" y2="207.666515350341797" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="834.64434814453125 211.655574798583984 841.552520751953125 207.666515350341797 834.64434814453125 203.677455902099609 834.64434814453125 211.655574798583984"></polygon>
        </g>
        <rect x="841.628205334101949" y="180.364462163193821" width="97.703504413962946" height="54.604102965800848" rx="4" ry="4" style="fill: #2a2aea;"></rect>
        <g>
          <line x1="939.33172607421875" y1="207.666515350341797" x2="953.66778564453125" y2="207.666515350341797" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="952.50054931640625 211.655574798583984 959.40875244140625 207.666515350341797 952.50054931640625 203.677455902099609 952.50054931640625 211.655574798583984"></polygon>
        </g>
        <rect x="959.484420354643589" y="180.364462163193821" width="132.437769294141617" height="54.604102965800848" rx="4" ry="4" style="fill: #2a2aea;"></rect>
        <g>
          <line x1="1091.92218017578125" y1="207.666515350341797" x2="1149.9415283203125" y2="207.666515350341797" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="1148.77435302734375 211.655574798583984 1155.6824951171875 207.666515350341797 1148.77435302734375 203.677455902099609 1148.77435302734375 211.655574798583984"></polygon>
        </g>
        <text transform="translate(707.410888671875 212.134044647216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimlvconverter</tspan></text>
        <text transform="translate(862.978271484375 212.134044647216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimlqnn</tspan></text>
        <text transform="translate(971.209716796875 212.134044647216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimlpostprocess</tspan></text>
        <text transform="translate(1100.400146484375 202.667247772216797)" style="font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">sink_1</tspan></text>
        <text transform="translate(1100.400146484375 163.407482147216797)" style="font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">sink_0</tspan></text>
      </g>
      <rect x="567.43461697127259" y="316.258982835393908" width="109.208205931600787" height="76.445744152120824" rx="4" ry="4" style="fill: #2a2aea;"></rect>
      <g>
        <rect x="19.334716796875" y="316.258982835393908" width="76.445744152121733" height="76.445744152120824" rx="4" ry="4" style="fill: #007884;"></rect>
        <text transform="translate(47.853759765625 358.949474334716797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">tee</tspan></text>
      </g>
      <text transform="translate(584.673095703125 361.731700897216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimetamux</tspan></text>
      <g>
        <g>
          <line x1="95.662200927734375" y1="365.402660369873047" x2="109.998260498046875" y2="365.402660369873047" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="108.8310546875 369.391735076904297 115.7392578125 365.402660369873047 108.8310546875 361.413616180419922 108.8310546875 369.391735076904297"></polygon>
        </g>
        <g>
          <line x1="95.662200927734375" y1="328.451854705810547" x2="559.433792114257812" y2="328.451854705810547" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="558.2666015625 332.440929412841797 565.174774169921875 328.451854705810547 558.2666015625 324.462779998779297 558.2666015625 332.440929412841797"></polygon>
        </g>
        <rect x="115.814922441310955" y="338.100624021713884" width="131.049847117930767" height="54.604102965800848" rx="4" ry="4" style="fill: #2a2aea;"></rect>
        <g>
          <line x1="246.864776611328125" y1="365.402660369873047" x2="261.200820922851562" y2="365.402660369873047" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="260.03363037109375 369.391735076904297 266.941802978515625 365.402660369873047 260.03363037109375 361.413616180419922 260.03363037109375 369.391735076904297"></polygon>
        </g>
        <rect x="267.017480165818597" y="338.100624021713884" width="97.703504413963856" height="54.604102965800848" rx="4.000000000000001" ry="4.000000000000001" style="fill: #2a2aea;"></rect>
        <g>
          <line x1="364.720985412597656" y1="365.402660369873047" x2="379.057029724121094" y2="365.402660369873047" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="377.889839172363281 369.391735076904297 384.798015594482422 365.402660369873047 377.889839172363281 361.413616180419922 377.889839172363281 369.391735076904297"></polygon>
        </g>
        <g>
          <line x1="549.191619873046875" y1="365.402660369873047" x2="563.527664184570312" y2="365.402660369873047" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="562.360473632813409 369.391735076904297 569.268646240234375 365.402660369873047 562.360473632813409 361.413616180419922 562.360473632813409 369.391735076904297"></polygon>
        </g>
        <rect x="384.873695186360237" y="338.100624021713884" width="164.301894676745178" height="54.604102965800848" rx="4" ry="4" style="fill: #2a2aea;"></rect>
        <text transform="translate(132.801025390625 369.870372772216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimlvconverter</tspan></text>
        <text transform="translate(288.367431640625 369.870372772216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimlqnn</tspan></text>
        <text transform="translate(412.531967163085938 369.870372772216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimlpostprocess</tspan></text>
      </g>
      <g>
        <rect x="75.291444638843132" y="174.918342196655431" width="93.919057101177714" height="65.524923558959927" rx="3.999999999999973" ry="3.999999999999973" style="fill: #007884;"></rect>
        <g>
          <line x1="169.210494995117188" y1="207.680797576904297" x2="194.467376708984375" y2="207.680797576904297" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="193.300170898436591 211.669872283935547 200.208358764648438 207.680797576904297 193.300170898436591 203.691738128662109 193.300170898436591 211.669872283935547"></polygon>
        </g>
        <line x1="61.455897765008558" y1="207.680803976134484" x2="75.291444638843132" y2="207.680803976134484" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
        <rect x="200.284032939762255" y="174.918342196655431" width="103.747795635022158" height="65.524923558959927" rx="4" ry="4" style="fill: #007884;"></rect>
        <g>
          <line x1="304.031829833984375" y1="207.680797576904297" x2="329.2886962890625" y2="207.680797576904297" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="328.121505737304688 211.669872283935547 335.029678344726562 207.680797576904297 328.121505737304688 203.691738128662109 328.121505737304688 211.669872283935547"></polygon>
        </g>
        <rect x="335.105359774524914" y="174.918342196655431" width="103.747795635022158" height="65.524923558959927" rx="3.999999999999996" ry="3.999999999999996" style="fill: #007884;"></rect>
        <g>
          <line x1="438.853155136108398" y1="207.680797576904297" x2="464.110023498535156" y2="207.680797576904297" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="462.942829132080078 211.669872283935547 469.851005554199219 207.680797576904297 462.942829132080078 203.691738128662109 462.942829132080078 211.669872283935547"></polygon>
        </g>
        <rect x="469.926686609289391" y="174.918342196655431" width="103.747795635023067" height="65.524923558959927" rx="4" ry="4" style="fill: #007884;"></rect>
        <g>
          <line x1="573.674484252929688" y1="207.680797576904297" x2="598.931350708007812" y2="207.680797576904297" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="597.76416015625 211.669872283935547 604.672332763671875 207.680797576904297 597.76416015625 203.691738128662109 597.76416015625 211.669872283935547"></polygon>
        </g>
        <text transform="translate(98.683837890625 211.526622772216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">rtspsrc </tspan></text>
        <text transform="translate(226.194580078125 204.067638397216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">rtph264 </tspan><tspan x="5.52685546875" y="16.7998046875">depay </tspan></text>
        <text transform="translate(353.910400390625 212.148693084716797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">h264parse</tspan></text>
        <text transform="translate(480.818603515625 212.148693084716797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">V4l2h264dec</tspan></text>
        <g>
          <path d="M36.888022747974901,203.694704459625427c.00152224267822-.814237672417221.662826079787919-1.473074426570747,1.477064689552208-1.471552183887979.271058554813862.000506164438775.53673114508274.075730635866421.767819581511503.2174051244765l7.202498727749116,4.420966735000547c.693732105381969.426287939582835.910537331266823,1.334243832221546.484249391685807,2.027975937606243-.121170142199844.197188541922515-.287060849761474.363079249484144-.484249391685807.484249391683989l-7.202498727749116,4.422932340232364c-.694168906544292.425575560006109-1.601901711894243.207838616614026-2.027477271901262-.486330289924808-.142372808066284-.232226369073032-.217624462401545-.499355588111939-.217406999162449-.771748917297373v-8.843898137889482Z" style="fill: none; stroke: #000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2px;"></path>
          <path d="M30.990779627668417,229.740861574318842h19.657477067688887" style="fill: none; stroke: #000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2px;"></path>
          <rect x="21.162041093824882" y="194.357402852478117" width="39.314954135375956" height="27.520467894761168" rx="2" ry="2" style="fill: none; stroke: #000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2px;"></rect>
        </g>
      </g>
      <g>
        <polyline points="1212.54644775390625 258.742534637451172 1212.54644775390625 281.964183807373047 60.47698974609375 281.964183807373047 60.47698974609375 310.517986297607422" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></polyline>
        <polygon points="56.487945556640625 309.350811004638672 60.47698974609375 316.258983612060547 64.466064453125 309.350811004638672 56.487945556640625 309.350811004638672"></polygon>
      </g>
      <g>
        <rect x="19.334716796875" y="468.425983076927878" width="76.445744152121733" height="76.445744152120824" rx="4.000000000000006" ry="4.000000000000006" style="fill: #007884;"></rect>
        <text transform="translate(47.853759765625 511.116466522216797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">tee</tspan></text>
      </g>
      <g>
        <rect x="567.43461697127259" y="468.425983076927878" width="109.208205931600787" height="76.445744152120824" rx="4" ry="4" style="fill: #2a2aea;"></rect>
        <text transform="translate(584.673095703125 513.898693084716797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimetamux</tspan></text>
      </g>
      <g>
        <g>
          <line x1="95.662200927734375" y1="517.569652557373047" x2="109.998260498046875" y2="517.569652557373047" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="108.8310546875 521.558727264404297 115.7392578125 517.569652557373047 108.8310546875 513.580638885498047 108.8310546875 521.558727264404297"></polygon>
        </g>
        <g>
          <line x1="95.662200927734375" y1="480.618846893310547" x2="559.433792114257812" y2="480.618846893310547" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="558.2666015625 484.607921600341797 565.174774169921875 480.618846893310547 558.2666015625 476.629772186279297 558.2666015625 484.607921600341797"></polygon>
        </g>
        <rect x="115.814922441310955" y="490.267624263247853" width="131.049847117930767" height="54.604102965800848" rx="4" ry="4" style="fill: #2a2aea;"></rect>
        <g>
          <line x1="246.864776611328125" y1="517.569652557373047" x2="261.200820922851562" y2="517.569652557373047" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="260.03363037109375 521.558727264404297 266.941802978515625 517.569652557373047 260.03363037109375 513.580638885498047 260.03363037109375 521.558727264404297"></polygon>
        </g>
        <rect x="267.017480165818597" y="490.267624263247853" width="97.703504413963856" height="54.604102965800848" rx="4.000000000000001" ry="4.000000000000001" style="fill: #2a2aea;"></rect>
        <g>
          <line x1="364.720985412597656" y1="517.569652557373047" x2="379.057029724121094" y2="517.569652557373047" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="377.889839172363281 521.558727264404297 384.798015594482422 517.569652557373047 377.889839172363281 513.580638885498047 377.889839172363281 521.558727264404297"></polygon>
        </g>
        <g>
          <line x1="546.991424560546875" y1="517.569652557373047" x2="561.327468872070312" y2="517.569652557373047" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
          <polygon points="560.160278320313409 521.558727264404297 567.068450927734375 517.569652557373047 560.160278320313409 513.580638885498047 560.160278320313409 521.558727264404297"></polygon>
        </g>
        <rect x="384.873695186360237" y="490.267624263247853" width="162.11773055811318" height="54.604102965800848" rx="4" ry="4" style="fill: #2a2aea;"></rect>
        <text transform="translate(132.801025390625 522.037364959716797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimlvconverter</tspan></text>
        <text transform="translate(288.367431640625 522.037364959716797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimlqnn</tspan></text>
        <text transform="translate(411.439697265625 522.037364959716797)" style="fill: #fff; font-family: Roboto-Regular, Roboto; font-size: 14px;"><tspan x="0" y="0">qtimlpostprocess</tspan></text>
      </g>
      <g>
        <polyline points="620.614715576171875 392.704723358154297 620.614715576171875 430.565349578857422 60.47698974609375 430.565349578857422 60.47698974609375 462.685009002685547" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></polyline>
        <polygon points="56.487945556640625 461.517803192138672 60.47698974609375 468.425975799560547 64.466064453125 461.517803192138672 56.487945556640625 461.517803192138672"></polygon>
      </g>
      <g>
        <line x1="676.531829833984375" y1="506.648876190185547" x2="690.86785888671875" y2="506.648876190185547" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
        <polygon points="689.70068359375 510.637889862060547 696.608856201171875 506.648876190185547 689.70068359375 502.659801483154297 689.70068359375 510.637889862060547"></polygon>
      </g>
      <g>
        <line x1="805.817047119140625" y1="506.648876190185547" x2="820.153106689453125" y2="506.648876190185547" style="fill: none; stroke: #000; stroke-miterlimit: 10;"></line>
        <polygon points="818.98590087890625 510.637889862060547 825.894073486328125 506.648876190185547 818.98590087890625 502.659801483154297 818.98590087890625 510.637889862060547"></polygon>
      </g>
    </g>
  </g>
</svg>

For information about the plugins used in the pipeline flow, see [Pipeline flow](https://docs.qualcomm.com/doc/80-70022-50/topic/gst-ai-face-recognition.html#gst-ai-face-recognition__section_mrl_x4m_qdc).

## Sample model and label files

Table : Sample model and label files for gst-ai-face-detection

| Runtime | Model files | Label files |
| :--- | :--- | :--- |
| Qualcomm AI Engine direct and LiteRT | <ul class="ul" id="gst-ai-face-recognition__ul_bdk_hwm_qdc"><br>                                    <li class="li"><var class="keyword varname">face_det_lite_quantized.tflite</var></li><br><br>                                    <li class="li"><var class="keyword varname">facemap_3dmm_quantized.tflite</var></li><br><br>                                    <li class="li"><var class="keyword varname">face_attrib_net_quantized.tflite</var></li><br><br>                                    <li class="li"><var class="keyword varname">face_det_lite_quantized.bin</var></li><br><br>                                    <li class="li"><var class="keyword varname">facemap_3dmm_quantized.bin</var></li><br><br>                                    <li class="li"><var class="keyword varname">face_attrib_net_quantized.bin</var></li><br><br>                                </ul> | <ul class="ul" id="gst-ai-face-recognition__ul_q4l_kwm_qdc"><br>                                    <li class="li"><var class="keyword varname">face_detection.json</var></li><br><br>                                    <li class="li"><var class="keyword varname">face_recognition_settings.json</var></li><br><br>                                    <li class="li"><var class="keyword varname">face_recognition.json</var></li><br><br>                                    <li class="li"><em class="ph i"><var class="keyword varname">facemap_3dmm_settings.json</var></em></li><br><br>                                </ul> |

- Download the following LiteRT models of w8a8 precision. The model file names in
                    the following path is subject to change. Ensure to update the model name when
                    running the commands.
    - [face_det_quantized](https://aihub.qualcomm.com/iot/models/face_det_lite?searchTerm=fac)
    - [face_attrib_net_quantized](https://aihub.qualcomm.com/iot/models/face_attrib_net?searchTerm=fac)
- Push these models to the /etc/models directory on the
                    target
                        device.

        scp face_det_lite-lightweight-face-detection.tflite root@<IP address of target device>:/etc/modelsCopy to clipboard

        scp face_attrib_net-facial-attribute.tflite root@<IP address of target device>:/etc/modelsCopy to clipboard

Note: For Ubuntu Server, copy the model file to the user
                        home folder and then use the `sudo` command to copy the model
                        files to the `/etc/models` directory.

.

## 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-70022-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-lightweight-face-detection.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-facial-attribute.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=falseCopy 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@<IP-Address>:/etc/data/tensor_0.bin .Copy to clipboard

            scp root@<IP-Address>:/etc/data/tensor_1.bin .Copy to clipboard

            scp root@<IP-Address>:/etc/data/tensor_2.bin .Copy to clipboard

            scp root@<IP-Address>:/etc/data/tensor_3.bin .Copy to clipboard

            scp root@<IP-Address>:/etc/data/tensor_4.bin .Copy to clipboard
    - For Ubuntu Server use the following reference
                            command:

            scp ubuntu@<IP-Address>:/etc/data/tensor_<index>.binCopy to clipboard
7. To merge the tensor bins with all the facial properties into a cohesive image,
                    download and run the facedb.pyscript 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.pyCopy to clipboard
    2. Run the script. Note that <var class="keyword varname">&lt;Name of the person&gt;</var> is
                            case and style sensitive. Ensure that you use the same name
                            consistently.

            python3 ./facedb.py "<Name of the person>" 512 32 tensor_0.bin tensor_1.bin tensor_2.bin tensor_3.bin tensor_4.binCopy 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@<IP address of target device>:/etc/data/face0.binCopy 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": "<Name of Person>"},
          {"id": 1, "color": "0xFFFF00FF", "label": "<Name of Person>"}
        ]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@<IP address of target device>:/etc/labelsCopy to clipboard

        scp face_recognition_settings.json root@<IP address of target device>:/etc/labelsCopy 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-70022-50/topic/gst-ai-face-recognition.html#gst-ai-face-recognition__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-70022-50/topic/gst-ai-face-recognition.html#gst-ai-face-recognition__section_qjx_hqq_32c).
2. Use the following format of the
                            `/etc/configs/config-face-recognition.json`
                            file:

        {
        "ml-framework": "<qnn or tflite>",
        "face-detection-model": "<path for face detection model file>", 
        "face-landmark-model":"<path for face landmark model file>",
        “face-recognition-model”:”<path for face recognition model file>”,
        "face-detection-labels":”<path for face detection labels file>”,
        "face-recognition-labels":”<path for face recognition labels file>”,
        "face-recognition-settings": "<Path of face recognition settings>",
        "facemap-3dmm-settings": "<Path of 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.jsonCopy to clipboard
4. To display the available help options, run the following commands in the SSH
                        shell:

        gst-ai-face-recognition -hCopy to clipboard
5. To stop the use case, use CTRL +
                            C.

## Expected output
![](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-70022-50/topic/qtiqmmfsrc.html) | <ul class="ul" id="gst-ai-face-recognition__ul_zyl_gj1_mcc"><br>                                    <li class="li">Captures the live stream from camera.</li><br><br>                                    <li class="li">Uses tee to split the stream for inferencing.</li><br><br>                                </ul> |
| File source: filesrc | <ul class="ul" id="gst-ai-face-recognition__ul_z1z_x4f_w1c"><br>                                    <li class="li">Captures the video stream using filesrc, followed by<br>                                        qtdemux, which demultiplexes the stream.</li><br><br>                                    <li class="li">Uses tee to split the stream for inferencing.</li><br><br>                                </ul> |
| RTSP source: rtspsrc | <ul class="ul" id="gst-ai-face-recognition__ul_vsj_2r4_tbc"><br>                                    <li class="li">Captures the RTSP stream using rtspsrc, followed by<br>                                        rtph264depay for video extraction.</li><br><br>                                    <li class="li">Uses tee to split the stream for inferencing.</li><br><br>                                </ul> |
| h264parse | Parses the H.264 video. |
| [v4l2h264dec](https://docs.qualcomm.com/doc/80-70022-50/topic/v4l2h264dec.html) | Decodes the video. |
| [qtimlvconverter](https://docs.qualcomm.com/doc/80-70022-50/topic/qtimlvconverter.html) | <ol class="ol" id="gst-ai-face-recognition__ol_j34_ddg_q1c"><br>                                    <li class="li">Receives the video stream on its sink pad.</li><br><br>                                    <li class="li">Performs the following preprocessing on the stream data.<br>                                        This preprocessing is done when the model expects<br>                                        floating-point values as input.<ol class="ol" type="a" id="gst-ai-face-recognition__ol_m5z_cpr_lbc"><br>                                            <li class="li">Color conversion</li><br><br>                                            <li class="li">Scaling (up or down)</li><br><br>                                            <li class="li">Normalization</li><br><br>                                        </ol><br></li><br><br>                                    <li class="li">Converts the preprocessed video stream to a tensor stream on<br>                                        its source pad. </li><br><br>                                </ol><br><br>                                <br>The tensor stream is used for inferencing in the later stages of<br>                                    the pipeline. |
| [qtimlqnn](https://docs.qualcomm.com/doc/80-70022-50/topic/qtimlqnn.html) | Acts as the inferencing plugin for Qualcomm Neural Network<br>                                    model.<ol class="ol" id="gst-ai-face-recognition__ol_mbk_pl3_4dc"><br>                                    <li class="li">After the inference runtime receives the tensor stream on<br>                                        its sink pad, it runs the inference.</li><br><br>                                    <li class="li">Produces a tensor stream with the inference results on its<br>                                        source pad.</li><br><br>                                </ol> |
| qtimlpostprocess | <ul class="ul" id="gst-ai-face-recognition__ul_lwr_xl3_4dc"><br>                                    <li class="li">Handles inference results from any face detection<br>                                        model.</li><br><br>                                    <li class="li">Applies a threshold to the chosen number of results.</li><br><br>                                </ul> |
| [qtimetamux](https://docs.qualcomm.com/doc/80-70022-50/topic/qtimetamux.html) | <ul class="ul" id="gst-ai-face-recognition__ul_cvw_j3n_qdc"><br>                                    <li class="li">Receives the output of the face detection models from<br>                                        qtimlpostprocess and multiplexes it.</li><br><br>                                    <li class="li">Receives the output of facial pose from qtimlpostprocess and<br>                                        multiplexes it.</li><br><br>                                </ul> |
| tee | Splits the stream for inferencing. |
| qtimlpostprocess for pose estimation | Uses lite-3dmm module to perform the facial pose<br>                                recognition. |
| qtimlpostprocess for classification model | Uses qfr module to receive the stream from qtimetamux and<br>                                classifies the face. |
| [qtivoverlay](https://docs.qualcomm.com/doc/80-70022-50/topic/qtioverlay.html) | <ol class="ol" id="gst-ai-face-recognition__ol_wst_y5l_vbc"><br>                                    <li class="li">Receives the multiplexed stream.</li><br><br>                                    <li class="li">Overlays the bounding boxes on the stream.</li><br><br>                                </ol> |
| [Waylandsink](https://docs.qualcomm.com/doc/80-70022-50/topic/waylandsink.html) | <ol class="ol" id="gst-ai-face-recognition__ol_kjr_fvr_lbc"><br>                                    <li class="li">Waylandsink submits the video stream received on its sink<br>                                        pad to Weston.</li><br><br>                                    <li class="li">Weston renders the video stream on a local display.</li><br><br>                                </ol> |

## Config JSON field description

Table : Field description–config-face-recognition.json file

| Field | Values/description |
| :--- | :--- |
| **ml-framework** | Use one of the following models:<ul class="ul" id="gst-ai-face-recognition__ul_prm_gck_32c"><br>                                    <li class="li"><code class="ph codeph">tflite</code>–LiteRT</li><br><br>                                    <li class="li"><code class="ph codeph">qnn</code>–Qualcomm AI Engine direct</li><br><br>                                </ul> |
| **Models and labels** | See [Sample model and label files](https://docs.qualcomm.com/doc/80-70022-50/topic/gst-ai-face-recognition.html#gst-ai-face-recognition__section_bxr_x4m_qdc).<ul class="ul" id="gst-ai-face-recognition__ul_c31_nfr_32c"><br>                                    <li class="li"><strong class="ph b">face-detection-model</strong>: The path to the face detection<br>                                        model.</li><br><br>                                    <li class="li"><strong class="ph b">face-landmark-model</strong>: The path to the face landmark<br>                                        model.</li><br><br>                                    <li class="li"><strong class="ph b">face-recognition-model</strong>: The path to the face<br>                                        recognition model.</li><br><br>                                    <li class="li"><strong class="ph b">face-detection-labels</strong>: The path to the face detection<br>                                        labels.</li><br><br>                                    <li class="li"><strong class="ph b">face-recognition-labels</strong>: The path to the face<br>                                        recognition labels.</li><br><br>                                    <li class="li"><strong class="ph b">face-recognition-settings</strong>: The path of face<br>                                        recognition setting labels.</li><br><br>                                    <li class="li"><strong class="ph b">facemap-3dmm-settings</strong>: The path of facemap-3dmm<br>                                        setting labels.</li><br><br>                                </ul> |

## Related information

- [Object detection](https://docs.qualcomm.com/doc/80-70022-50/topic/gst-ai-object-detection.html)
- [Pose detection](https://docs.qualcomm.com/doc/80-70022-50/topic/gst-ai-pose-detection.html)

**Parent Topic:** [Run AI/ML sample applications](https://docs.qualcomm.com/doc/80-70022-50/topic/ai-ml-sample-applications.html)

Last Published: Feb 20, 2026

[Previous Topic
Face detection](https://docs.qualcomm.com/bundle/publicresource/80-70022-50/topics/gst-ai-face-detection.md) [Next Topic
Audio classification](https://docs.qualcomm.com/bundle/publicresource/80-70022-50/topics/audio-classification.md)