# Image classification use case Source: [https://docs.qualcomm.com/doc/80-88500-3/topic/image_classification_use_case.html](https://docs.qualcomm.com/doc/80-88500-3/topic/image_classification_use_case.html) - Use cases - Single camera stream: 1080p with AI inference. - Single file stream: 720p with AI inference. - **TensorFlow Lite**: Steps to execute the use cases - Display (variant 1): Use the `qtioverlay`plug-in to apply the classification overlay. - Camera source: - Linux Ubuntu: export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! tee name=split ! queue ! qtimetamux name=metamux ! queue ! qtioverlay ! queue ! waylandsink sync=false fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=hexagon model=/data/mobilenet_v2_1.0_224_quant.tflite ! queue ! qtimlvclassification threshold=60.0 results=3 module=mobilenet labels=/data/mobilenet.labels ! text/x-raw ! queue ! metamux.Copy to clipboard - Linux Embedded: export WAYLAND_DISPLAY=wayland-1 && export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! tee name=split ! queue ! qtimetamux name=metamux ! queue ! qtioverlay ! queue ! waylandsink sync=false fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=hexagon model=/data/mobilenet_v2_1.0_224_quant.tflite ! queue ! qtimlvclassification threshold=60.0 results=3 module=mobilenet labels=/data/mobilenet.labels ! text/x-raw ! queue ! metamux.Copy to clipboard - File source: - Linux Ubuntu: export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 filesrc location=/data/Animals_003_720p_180s_30FPS.mp4 ! qtdemux ! queue ! h264parse ! qtic2vdec ! queue ! tee name=split ! queue ! qtimetamux name=metamux ! queue ! qtioverlay ! queue ! waylandsink sync=true fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=hexagon model=/data/mobilenet_v2_1.0_224_quant.tflite ! queue ! qtimlvclassification threshold=60.0 results=3 module=mobilenet labels=/data/mobilenet.labels ! text/x-raw ! queue ! metamux.Copy to clipboard - Linux Embedded: export WAYLAND_DISPLAY=wayland-1 && export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 filesrc location=/data/Animals_003_720p_180s_30FPS.mp4 ! qtdemux ! queue ! h264parse ! qtic2vdec ! queue ! tee name=split ! queue ! qtimetamux name=metamux ! queue ! qtioverlay ! queue ! waylandsink sync=true fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=hexagon model=/data/mobilenet_v2_1.0_224_quant.tflite ! queue ! qtimlvclassification threshold=60.0 results=3 module=mobilenet labels=/data/mobilenet.labels ! text/x-raw ! queue ! metamux.Copy to clipboard - Display (variant 2): Use the `qtivcomposer`plug-in to mix the original frame with the classification mask. - Camera source: - Linux Ubuntu: export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! tee name=split ! queue ! qtivcomposer name=mixer sink_1::position="<50, 50>" sink_1::dimensions="<368, 64>" ! queue ! waylandsink sync=false fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=hexagon model=/data/mobilenet_v2_1.0_224_quant.tflite ! queue ! qtimlvclassification threshold=60.0 results=3 module=mobilenet labels=/data/mobilenet.labels ! video/x-raw,format=BGRA,width=368,height=64 ! queue ! mixer.Copy to clipboard - Linux Embedded: export WAYLAND_DISPLAY=wayland-1 && export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! tee name=split ! queue ! qtivcomposer name=mixer sink_1::position="<50, 50>" sink_1::dimensions="<368, 64>" ! queue ! waylandsink sync=false fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=hexagon model=/data/mobilenet_v2_1.0_224_quant.tflite ! queue ! qtimlvclassification threshold=60.0 results=3 module=mobilenet labels=/data/mobilenet.labels ! video/x-raw,format=BGRA,width=368,height=64 ! queue ! mixer.Copy to clipboard - File source: - Linux Ubuntu: export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 filesrc location=/data/Animals_003_720p_180s_30FPS.mp4 ! qtdemux ! queue ! h264parse ! qtic2vdec ! queue ! tee name=split ! queue ! qtivcomposer name=mixer sink_1::position="<50, 50>" sink_1::dimensions="<368, 64>" ! queue ! waylandsink sync=true fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=hexagon model=/data/mobilenet_v2_1.0_224_quant.tflite ! queue ! qtimlvclassification threshold=60.0 results=3 module=mobilenet labels=/data/mobilenet.labels ! video/x-raw,format=BGRA,width=368,height=64 ! queue ! mixer.Copy to clipboard - Linux Embedded: export WAYLAND_DISPLAY=wayland-1 && export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 filesrc location=/data/Animals_003_720p_180s_30FPS.mp4 ! qtdemux ! queue ! h264parse ! qtic2vdec ! queue ! tee name=split ! queue ! qtivcomposer name=mixer sink_1::position="<50, 50>" sink_1::dimensions="<368, 64>" ! queue ! waylandsink sync=true fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=hexagon model=/data/mobilenet_v2_1.0_224_quant.tflite ! queue ! qtimlvclassification threshold=60.0 results=3 module=mobilenet labels=/data/mobilenet.labels ! video/x-raw,format=BGRA,width=368,height=64 ! queue ! mixer.Copy to clipboard - Encode (variant 1): Use the `qtioverlay`plug-in to apply the classification overlay. - Camera source: gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! tee name=split ! queue ! qtimetamux name=metamux ! queue ! qtioverlay ! queue ! qtic2venc target-bitrate=6000000 ! h264parse ! queue ! mp4mux ! queue ! filesink location=/data/video.mp4 split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=hexagon model=/data/mobilenet_v2_1.0_224_quant.tflite ! queue ! qtimlvclassification threshold=60.0 results=3 module=mobilenet labels=/data/mobilenet.labels ! text/x-raw ! queue ! metamux.Copy to clipboard - File source: gst-launch-1.0 -e --gst-debug=2 filesrc location=/data/Animals_003_720p_180s_30FPS.mp4 ! qtdemux ! queue ! h264parse ! qtic2vdec ! queue ! tee name=split ! queue ! qtimetamux name=metamux ! queue ! qtioverlay ! queue ! qtic2venc target-bitrate=6000000 ! h264parse ! queue ! mp4mux ! queue ! filesink location=/data/video.mp4 split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=hexagon model=/data/mobilenet_v2_1.0_224_quant.tflite ! queue ! qtimlvclassification threshold=60.0 results=3 module=mobilenet labels=/data/mobilenet.labels ! text/x-raw ! queue ! metamux.Copy to clipboard - Encode (variant 2): Use the `qtivcomposer`plug-in to mix the original frame with the classification mask. - Camera source: gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! tee name=split ! queue ! qtivcomposer name=mixer sink_1::position="<50, 50>" sink_1::dimensions="<368, 64>" ! queue ! qtic2venc target-bitrate=6000000 ! h264parse ! queue ! mp4mux ! queue ! filesink location=/data/video.mp4 split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=hexagon model=/data/mobilenet_v2_1.0_224_quant.tflite ! queue ! qtimlvclassification threshold=60.0 results=3 module=mobilenet labels=/data/mobilenet.labels ! video/x-raw,format=BGRA,width=368,height=64 ! queue ! mixer.Copy to clipboard - File source: gst-launch-1.0 -e --gst-debug=2 filesrc location=/data/Animals_003_720p_180s_30FPS.mp4 ! qtdemux ! queue ! h264parse ! qtic2vdec ! queue ! tee name=split ! queue ! qtivcomposer name=mixer sink_1::position="<50, 50>" sink_1::dimensions="<368, 64>" ! queue ! qtic2venc target-bitrate=6000000 ! h264parse ! queue ! mp4mux ! queue ! filesink location=/data/video.mp4 split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=hexagon model=/data/mobilenet_v2_1.0_224_quant.tflite ! queue ! qtimlvclassification threshold=60.0 results=3 module=mobilenet labels=/data/mobilenet.labels ! video/x-raw,format=BGRA,width=368,height=64 ! queue ! mixer.Copy to clipboard - **Qualcomm Neural Processing SDK**: Steps to execute the use cases - Display (variant 1): Use `qtioverlay`plug-in to apply the classification overlay. - Camera source: - Linux Ubuntu: export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! tee name=split ! queue ! qtimetamux name=metamux ! queue ! qtioverlay text-font-size=24 ! queue ! waylandsink sync=false fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimlsnpe delegate=dsp model=/data/mobilenet_v1_quantaware_quantized.dlc ! queue ! qtimlvclassification threshold=51.0 results=1 module=mobilenet labels=/data/mobilenet.labels ! text/x-raw ! queue ! metamux.Copy to clipboard - Linux Embedded: export WAYLAND_DISPLAY=wayland-1 && export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! tee name=split ! queue ! qtimetamux name=metamux ! queue ! qtioverlay text-font-size=24 ! queue ! waylandsink sync=false fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimlsnpe delegate=dsp model=/data/mobilenet_v1_quantaware_quantized.dlc ! queue ! qtimlvclassification threshold=51.0 results=1 module=mobilenet labels=/data/mobilenet.labels ! text/x-raw ! queue ! metamux.Copy to clipboard - File source: - Linux Ubuntu: export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 filesrc location=/data/Animals_003_720p_180s_30FPS.mp4 ! qtdemux ! queue ! h264parse ! qtic2vdec ! queue ! tee name=split ! queue ! qtimetamux name=metamux ! queue ! qtioverlay text-font-size=24 ! queue ! waylandsink sync=true fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimlsnpe delegate=dsp model=/data/mobilenet_v1_quantaware_quantized.dlc ! queue ! qtimlvclassification threshold=51.0 results=1 module=mobilenet labels=/data/mobilenet.labels ! text/x-raw ! queue ! metamux.Copy to clipboard - Linux Embedded: export WAYLAND_DISPLAY=wayland-1 && export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 filesrc location=/data/Animals_003_720p_180s_30FPS.mp4 ! qtdemux ! queue ! h264parse ! qtic2vdec ! queue ! tee name=split ! queue ! qtimetamux name=metamux ! queue ! qtioverlay text-font-size=24 ! queue ! waylandsink sync=true fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimlsnpe delegate=dsp model=/data/mobilenet_v1_quantaware_quantized.dlc ! queue ! qtimlvclassification threshold=51.0 results=1 module=mobilenet labels=/data/mobilenet.labels ! text/x-raw ! queue ! metamux.Copy to clipboard - Display (variant 2): Use the `qtivcomposer`plug-in to mix the original frame with the classification mask. - Camera source: - Linux Ubuntu: export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! tee name=split ! queue ! qtivcomposer name=mixer sink_1::position="<50, 50>" sink_1::dimensions="<368, 32>" ! queue ! waylandsink sync=false fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimlsnpe delegate=dsp model=/data/mobilenet_v1_quantaware_quantized.dlc ! queue ! qtimlvclassification threshold=51.0 results=1 module=mobilenet labels=/data/mobilenet.labels ! video/x-raw,format=BGRA,width=368,height=32 ! queue ! mixer.Copy to clipboard - Linux Embedded: export WAYLAND_DISPLAY=wayland-1 && export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! tee name=split ! queue ! qtivcomposer name=mixer sink_1::position="<50, 50>" sink_1::dimensions="<368, 32>" ! queue ! waylandsink sync=false fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimlsnpe delegate=dsp model=/data/mobilenet_v1_quantaware_quantized.dlc ! queue ! qtimlvclassification threshold=51.0 results=1 module=mobilenet labels=/data/mobilenet.labels ! video/x-raw,format=BGRA,width=368,height=32 ! queue ! mixer.Copy to clipboard - File source: - Linux Ubuntu: export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 filesrc location=/data/Animals_003_720p_180s_30FPS.mp4 ! qtdemux ! queue ! h264parse ! qtic2vdec ! queue ! tee name=split ! queue ! qtivcomposer name=mixer sink_1::position="<50, 50>" sink_1::dimensions="<368, 32>" ! queue ! waylandsink sync=true fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimlsnpe delegate=dsp model=/data/mobilenet_v1_quantaware_quantized.dlc ! queue ! qtimlvclassification threshold=51.0 results=1 module=mobilenet labels=/data/mobilenet.labels ! video/x-raw,format=BGRA,width=368,height=32 ! queue ! mixer.Copy to clipboard - Linux Embedded: export WAYLAND_DISPLAY=wayland-1 && export XDG_RUNTIME_DIR=/run/user/root && gst-launch-1.0 -e --gst-debug=2 filesrc location=/data/Animals_003_720p_180s_30FPS.mp4 ! qtdemux ! queue ! h264parse ! qtic2vdec ! queue ! tee name=split ! queue ! qtivcomposer name=mixer sink_1::position="<50, 50>" sink_1::dimensions="<368, 32>" ! queue ! waylandsink sync=true fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimlsnpe delegate=dsp model=/data/mobilenet_v1_quantaware_quantized.dlc ! queue ! qtimlvclassification threshold=51.0 results=1 module=mobilenet labels=/data/mobilenet.labels ! video/x-raw,format=BGRA,width=368,height=32 ! queue ! mixer.Copy to clipboard - Encode (variant 1): Use the `qtioverlay`plug-in to apply the classification overlay. - Camera source: gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! tee name=split ! queue ! qtimetamux name=metamux ! queue ! qtioverlay text-font-size=24 ! queue ! qtic2venc target-bitrate=6000000 ! h264parse ! queue ! mp4mux ! queue ! filesink location=/data/video.mp4 split. ! queue ! qtimlvconverter ! queue ! qtimlsnpe delegate=dsp model=/data/mobilenet_v1_quantaware_quantized.dlc ! queue ! qtimlvclassification threshold=51.0 results=1 module=mobilenet labels=/data/mobilenet.labels ! text/x-raw ! queue ! metamux.Copy to clipboard - File source: gst-launch-1.0 -e --gst-debug=2 filesrc location=/data/Animals_003_720p_180s_30FPS.mp4 ! qtdemux ! queue ! h264parse ! qtic2vdec ! queue ! tee name=split ! queue ! qtimetamux name=metamux ! queue ! qtioverlay text-font-size=24 ! queue ! qtic2venc target-bitrate=6000000 ! h264parse ! queue ! mp4mux ! queue ! filesink location=/data/video.mp4 split. ! queue ! qtimlvconverter ! queue ! qtimlsnpe delegate=dsp model=/data/mobilenet_v1_quantaware_quantized.dlc ! queue ! qtimlvclassification threshold=51.0 results=1 module=mobilenet labels=/data/mobilenet.labels ! text/x-raw ! queue ! metamux.Copy to clipboard - Encode (variant 2): Use the `qtivcomposer`plug-in to mix the original frame with the classification mask. - Camera source: gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! tee name=split ! queue ! qtivcomposer name=mixer sink_1::position="<50, 50>" sink_1::dimensions="<368, 32>" ! queue ! qtic2venc target-bitrate=6000000 ! h264parse ! queue ! mp4mux ! queue ! filesink location=/data/video.mp4 split. ! queue ! qtimlvconverter ! queue ! qtimlsnpe delegate=dsp model=/data/mobilenet_v1_quantaware_quantized.dlc ! queue ! qtimlvclassification threshold=51.0 results=1 module=mobilenet labels=/data/mobilenet.labels ! video/x-raw,format=BGRA,width=368,height=32 ! queue ! mixer.Copy to clipboard - File source: gst-launch-1.0 -e --gst-debug=2 filesrc location=/data/Animals_003_720p_180s_30FPS.mp4 ! qtdemux ! queue ! h264parse ! qtic2vdec ! queue ! tee name=split ! queue ! qtivcomposer name=mixer sink_1::position="<50, 50>" sink_1::dimensions="<368, 32>" ! queue ! qtic2venc target-bitrate=6000000 ! h264parse ! queue ! mp4mux ! queue ! filesink location=/data/video.mp4 split. ! queue ! qtimlvconverter ! queue ! qtimlsnpe delegate=dsp model=/data/mobilenet_v1_quantaware_quantized.dlc ! queue ! qtimlvclassification threshold=51.0 results=1 module=mobilenet labels=/data/mobilenet.labels ! video/x-raw,format=BGRA,width=368,height=32 ! queue ! mixer.Copy to clipboard - Validation method - The application saves .mp4 files to storage when it receives CTRL+ C and terminates the command-line tool successfully. - To verify the AI processing, check the video stream running on the display. There should be a list with possible classification labels. **Parent Topic:** [Configure AI/ML modules](https://docs.qualcomm.com/doc/80-88500-3/topic/66_Configure_AI_ML_modules.html) Last Published: Sep 26, 2023 [Previous Topic Pose estimation use case](https://docs.qualcomm.com/bundle/publicresource/80-88500-3/topics/pose_estimation_use_case.md) [Next Topic Debug mechanisms](https://docs.qualcomm.com/bundle/publicresource/80-88500-3/topics/77_Debugging_procedures.md)