Download dlstreamer_sample.py from Intel/object-classification: direct link, hf CLI and curl.
- Browser
- Download file 2.79 kB
-
https://huggingface.co/Intel/object-classification/resolve/main/dlstreamer_sample.py
- Command line
-
hf download hf://Intel/object-classification/dlstreamer_sample.py
-
curl -L -o dlstreamer_sample.py https://huggingface.co/Intel/object-classification/resolve/main/dlstreamer_sample.py
2.79 kB
| # SPDX-License-Identifier: MIT | |
| # Copyright (C) Intel Corporation | |
| # | |
| # Object Classification: DLStreamer pipeline sample. | |
| # See README.md for prerequisites and inputs. Run: python3 dlstreamer_sample.py | |
| import gi | |
| gi.require_version("Gst", "1.0") | |
| gi.require_version("GstAnalytics", "1.0") | |
| from gi.repository import Gst, GLib, GstAnalytics | |
| Gst.init([]) | |
| INPUT_VIDEO = "test_video.mp4" | |
| # Traffic-relevant COCO labels grouped into higher-level city categories. | |
| CATEGORY_BY_LABEL = { | |
| "person": "People", | |
| "bicycle": "Vehicles", | |
| "car": "Vehicles", | |
| "motorcycle": "Vehicles", | |
| "bus": "Vehicles", | |
| "train": "Vehicles", | |
| "truck": "Vehicles", | |
| } | |
| # Select the model: "yolo26n" (default) or "detr-resnet-50". | |
| MODEL = "yolo26n" | |
| # For CPU: change device=GPU to device=CPU. | |
| # For NPU: change device=GPU to device=NPU (batch-size=1, nireq=4 recommended). | |
| # gvawatermark displ-cfg: | |
| # show-roi=... draws only the traffic-relevant classes (person + vehicles), | |
| # so non-traffic detections such as handbag/backpack are not boxed. | |
| # font-scale=1.5 enlarges the label text for better visualization. | |
| pipeline_str = ( | |
| f"filesrc location={INPUT_VIDEO} ! decodebin3 ! " | |
| "videoconvert ! " | |
| f"gvadetect model={MODEL}_openvino_model/{MODEL}.xml " | |
| "device=GPU " | |
| "threshold=0.4 ! queue ! " | |
| "gvawatermark " | |
| "displ-cfg=show-roi=person:bicycle:car:motorcycle:bus:train:truck,font-scale=2.5 ! " | |
| "videoconvert ! video/x-raw,format=I420 ! " | |
| "openh264enc ! h264parse ! " | |
| "mp4mux ! filesink name=sink location=output_dlstreamer.mp4" | |
| ) | |
| pipeline = Gst.parse_launch(pipeline_str) | |
| totals = {"People": 0, "Vehicles": 0} | |
| def on_buffer(pad, info): | |
| buf = info.get_buffer() | |
| rmeta = GstAnalytics.buffer_get_analytics_relation_meta(buf) | |
| if rmeta is None: | |
| return Gst.PadProbeReturn.OK | |
| counts = {"People": 0, "Vehicles": 0} | |
| idx = 1 | |
| while True: | |
| ok, od = rmeta.get_od_mtd(idx) | |
| if not ok: | |
| break | |
| label = GLib.quark_to_string(od.get_obj_type()) | |
| category = CATEGORY_BY_LABEL.get(label) | |
| if category is not None: | |
| counts[category] += 1 | |
| totals[category] += 1 | |
| idx += 1 | |
| if counts["People"] or counts["Vehicles"]: | |
| print(f"frame: People={counts['People']} Vehicles={counts['Vehicles']}", | |
| flush=True) | |
| return Gst.PadProbeReturn.OK | |
| sink = pipeline.get_by_name("sink") | |
| sink_pad = sink.get_static_pad("sink") | |
| sink_pad.add_probe(Gst.PadProbeType.BUFFER, on_buffer) | |
| pipeline.set_state(Gst.State.PLAYING) | |
| bus = pipeline.get_bus() | |
| bus.timed_pop_filtered( | |
| Gst.CLOCK_TIME_NONE, | |
| Gst.MessageType.EOS | Gst.MessageType.ERROR, | |
| ) | |
| pipeline.set_state(Gst.State.NULL) | |
| print(f"Summary: People={totals['People']} Vehicles={totals['Vehicles']}") | |