Intel DL Streamer Pipelines Guide#
Overview#
Intel DL Streamer is a GStreamer-based framework for building video analytics pipelines with AI inference on Intel CPU, GPU, and NPU using OpenVINO.
A pipeline is a chain of GStreamer elements:
input source ! decode ! inference ! post-processing ! output sink
Prerequisites#
Edge Node Infrastructure Blueprint image deployed
Docker Engine 25+ with CDI enabled (see Container Device Interface Guide)
Intel GPU and/or NPU hardware present
Network connectivity for pulling images and sample videos
Setup#
Pull the DL Streamer Image#
docker pull intel/dlstreamer:latest
Verify it works:
docker run --rm --device intel.com/gpu=card1 intel/dlstreamer:latest gst-inspect-1.0 gvadetect
Download Models#
DL Streamer inference elements need OpenVINO IR models. Download them using the bundled script:
mkdir -p models
docker run --rm \
-v $(pwd)/models:/models \
-e MODELS_PATH=/models \
intel/dlstreamer:latest \
bash -c "/opt/intel/dlstreamer/samples/download_public_models.sh yolox_s"
Add coco128 to also quantize to INT8:
docker run --rm \
-v $(pwd)/models:/models \
-e MODELS_PATH=/models \
intel/dlstreamer:latest \
bash -c "/opt/intel/dlstreamer/samples/download_public_models.sh yolox_s coco128"
Available models include: yolox-tiny, yolox_s, yolov7, yolov8s, yolov9c, yolov10s, yolo11s, yolo11s-seg, yolo11s-pose, and others. Pass all for everything.
Models are saved to models/public/<model_name>/<precision>/ (containing .xml and .bin files).
Running Pipelines#
Each example below is a complete, copy-paste-ready command.
Proxy note: If behind a corporate proxy, add
-e http_proxy=$http_proxy -e https_proxy=$https_proxy -e no_proxy=$no_proxyto eachdocker runcommand. This is needed both for model downloads and forurisourcebinto fetch remote videos.
Object Detection — GPU#
docker run --rm \
--device intel.com/gpu=card1 \
-v $(pwd)/models:/models \
-e MODELS_PATH=/models \
intel/dlstreamer:latest \
bash -c "\
gst-launch-1.0 \
urisourcebin buffer-size=4096 uri=https://github.com/intel-iot-devkit/sample-videos/raw/master/people-detection.mp4 \
! decodebin3 \
! gvadetect model=\$MODELS_PATH/public/yolox_s/FP16/yolox_s.xml model-proc=/opt/intel/dlstreamer/samples/model_proc/public/yolo-x.json device=GPU pre-process-backend=va-surface-sharing \
! queue \
! gvafpscounter \
! fakesink async=false"
Object Detection — CPU#
docker run --rm \
-v $(pwd)/models:/models \
-e MODELS_PATH=/models \
intel/dlstreamer:latest \
bash -c "\
gst-launch-1.0 \
urisourcebin buffer-size=4096 uri=https://github.com/intel-iot-devkit/sample-videos/raw/master/people-detection.mp4 \
! decodebin3 \
! gvadetect model=\$MODELS_PATH/public/yolox_s/FP16/yolox_s.xml model-proc=/opt/intel/dlstreamer/samples/model_proc/public/yolo-x.json device=CPU pre-process-backend=opencv \
! queue \
! gvafpscounter \
! fakesink async=false"
Object Detection — NPU#
docker run --rm \
--device intel.com/gpu=card1 \
--device intel.com/npu=npu0 \
-v $(pwd)/models:/models \
-e MODELS_PATH=/models \
intel/dlstreamer:latest \
bash -c "\
gst-launch-1.0 \
urisourcebin buffer-size=4096 uri=https://github.com/intel-iot-devkit/sample-videos/raw/master/people-detection.mp4 \
! decodebin3 \
! gvadetect model=\$MODELS_PATH/public/yolox_s/FP16/yolox_s.xml model-proc=/opt/intel/dlstreamer/samples/model_proc/public/yolo-x.json device=NPU pre-process-backend=va \
! queue \
! gvafpscounter \
! fakesink async=false"
Save Results to JSON#
docker run --rm \
--device intel.com/gpu=card1 \
-v $(pwd)/models:/models \
-e MODELS_PATH=/models \
-v /tmp/results:/results \
intel/dlstreamer:latest \
bash -c "\
gst-launch-1.0 \
urisourcebin buffer-size=4096 uri=https://github.com/intel-iot-devkit/sample-videos/raw/master/people-detection.mp4 \
! decodebin3 \
! gvadetect model=\$MODELS_PATH/public/yolox_s/FP16/yolox_s.xml model-proc=/opt/intel/dlstreamer/samples/model_proc/public/yolo-x.json device=GPU pre-process-backend=va-surface-sharing \
! queue \
! gvametaconvert add-tensor-data=true \
! gvametapublish file-format=json-lines file-path=/results/output.json \
! fakesink async=false"
Results are saved to /tmp/results/output.json on the host.
Use a Local Video File#
To use a local video instead of a remote URL, two things change from the examples above:
Add a volume mount for your video directory:
-v /path/to/videos:/videosUse
filesrc location=/videos/my-video.mp4as the source element instead ofurisourcebin ... uri=<URL>
docker run --rm \
--device intel.com/gpu=card1 \
-v $(pwd)/models:/models \
-e MODELS_PATH=/models \
-v /path/to/videos:/videos \
intel/dlstreamer:latest \
bash -c "\
gst-launch-1.0 \
filesrc location=/videos/my-video.mp4 \
! decodebin3 \
! gvadetect model=\$MODELS_PATH/public/yolox_s/FP16/yolox_s.xml model-proc=/opt/intel/dlstreamer/samples/model_proc/public/yolo-x.json device=GPU pre-process-backend=va-surface-sharing \
! queue \
! gvafpscounter \
! fakesink async=false"
Key Elements Reference#
Element |
Purpose |
Devices |
|---|---|---|
|
Object detection (YOLO, SSD, etc.) |
CPU, GPU, NPU |
|
Classification, segmentation, pose |
CPU, GPU, NPU |
|
Raw model inference |
CPU, GPU, NPU |
|
GenAI/VLM inference (image → text) |
CPU, GPU |
|
Object tracking across frames |
CPU |
|
Draw inference results on frames |
— |
|
Measure pipeline FPS |
— |
|
Convert metadata to JSON |
— |
|
Publish to file, MQTT, or Kafka |
— |
Pipeline Building Blocks#
Sources#
Use case |
Element |
|---|---|
Remote video |
|
Local file |
|
USB camera |
|
RTSP stream |
|
Device + Pre-process Combinations#
Device |
|
Notes |
|---|---|---|
|
|
No GPU needed |
|
|
Zero-copy decode → inference |
|
|
VA-API pre-processing |
Output Sinks#
Output |
Elements |
|---|---|
FPS only |
|
JSON file |
|
Display |
|
MP4 file |
|
Running in Kubernetes#
apiVersion: v1
kind: Pod
metadata:
name: dlstreamer-gpu
spec:
restartPolicy: Never
containers:
- name: dlstreamer
image: intel/dlstreamer:latest
command:
- bash
- -c
- |
gst-launch-1.0 \
urisourcebin buffer-size=4096 uri=https://github.com/intel-iot-devkit/sample-videos/raw/master/people-detection.mp4 \
! decodebin3 \
! gvadetect model=$MODELS_PATH/public/yolox_s/FP16/yolox_s.xml model-proc=/opt/intel/dlstreamer/samples/model_proc/public/yolo-x.json device=GPU pre-process-backend=va-surface-sharing \
! queue \
! gvafpscounter \
! fakesink async=false
env:
- name: MODELS_PATH
value: /models
resources:
limits:
gpu.intel.com/xe: "1"
volumeMounts:
- name: models
mountPath: /models
volumes:
- name: models
hostPath:
path: /path/to/dlstreamer/models
kubectl apply -f dlstreamer-gpu.yaml
kubectl wait pod/dlstreamer-gpu --for=jsonpath='{.status.phase}'=Succeeded --timeout=120s
kubectl logs dlstreamer-gpu
Troubleshooting#
Problem |
Solution |
|---|---|
“No such element ‘gvadetect’” |
Run |
GPU not available in container |
Check CDI: |
“Could not initialize element” |
Model file missing — re-run download script |
Low FPS on GPU |
Set |
Advanced: AI-Assisted Pipeline Generation#
For complex pipelines, you can use the DL Streamer Coding Agent — a Claude Code skill that generates complete, working DL Streamer applications from plain-English descriptions. Instead of manually wiring GStreamer elements, describe what you want and the agent builds, validates, and runs the app for you.
See the DL Streamer Coding Agent Guide for usage details, example prompts, and supported use cases.
References#
Container Device Interface Guide — CDI setup for GPU/NPU access