Extra binding patches for nvidia deepstream.
Project description
pyds_ext
Extra binding patches for nvidia deepstream
pybind11 wrapper to access Nvidia DeepStream metadata from Python.
- Tracker meta info (
NvDsPastFrame...
classes) - Detector and tracker bbox info (
NvDsObjectMeta.[tracker/detector]_bbox_info...
attrs) from Python. - Analytics Metadata (
NvDsAnalyticsFrameMeta
andNvDsAnalyticsObjInfo
) from Python. - Also install default
pyds
precompiled library from/opt/nvidia/deepstream/deepstream/lib
Installation
Prerequisites
-
python3.6
-
Deepstream v5.0
-
Jetson Xavier or Nvidia GPU (deepstream compatible)
-
[Option A] pep-517 compatible pip:
pip install "pip>=10"
-
[Option B] Only necessary for old
pip<10
:- pybind11:
- [Option B.1] You might try simply
pip install pybind11
. - [Option B.2] The recommended way is to build it from source
- [Option B.1] You might try simply
- pybind11:
Install package
pip install --upgrade pip>=10
pip install pyds_ext
Usage
This meta-package provides three packages:
pyds
: Standard pyds from/opt/nvidia/deepstream/deepstream/lib
.- pyds_object_meta: Enable
NvDsObjectMeta.tracker_bbox_info...
andNvDsObjectMeta.detector_bbox_info...
access. - pyds_tracker_meta: Enable
NvDsPastFrame...
access.
Standard pyds
See oficial documentation here
Object metadata
Use the following as a reference to extract bbox metadata:
import pyds_bbox_meta
def osd_sink_pad_buffer_probe(pad, info, u_data):
# ... code to acquire frame_meta
l_obj=frame_meta.obj_meta_list
while l_obj is not None:
try:
obj_meta=pyds_bbox_meta.NvDsObjectMeta.cast(l_obj.data)
except StopIteration:
break
tracker_width = obj_meta.tracker_bbox_info.org_bbox_coords.width
detector_width = obj_meta.detector_bbox_info.org_bbox_coords.width
print(f"tracker_width: {tracker_width}")
print(f"detector_width: {detector_width}")
try:
l_obj=l_obj.next
except StopIteration:
break
...
Tracker metadata
Ensure you have set enable-past-frame
property of the gst-nvtracker
plugin to 1
.
(See nvtracker plugin documentation.)
Use the following as a reference to extract tracker metadata:
import pyds_tracker_meta
def osd_sink_pad_buffer_probe(pad, info, u_data):
# ... code to acquire batch_meta
user_meta_list = batch_meta.batch_user_meta_list
while user_meta_list is not None:
user_meta = pyds.NvDsUserMeta.cast(user_meta_list.data)
print('user_meta:', user_meta)
print('user_meta.user_meta_data:', user_meta.user_meta_data)
print('user_meta.base_meta:', user_meta.base_meta)
if user_meta.base_meta.meta_type != pyds.NvDsMetaType.NVDS_TRACKER_PAST_FRAME_META:
continue
pfob = pyds_tracker_meta.NvDsPastFrameObjBatch_cast(user_meta.user_meta_data)
print('past_frame_object_batch:', pfob)
print(' list:')
for pfos in pyds_tracker_meta.NvDsPastFrameObjBatch_list(pfob):
print(' past_frame_object_stream:', pfos)
print(' streamID:', pfos.streamID)
print(' surfaceStreamID:', pfos.surfaceStreamID)
print(' list:')
for pfol in pyds_tracker_meta.NvDsPastFrameObjStream_list(pfos):
print(' past_frame_object_list:', pfol)
print(' numObj:', pfol.numObj)
print(' uniqueId:', pfol.uniqueId)
print(' classId:', pfol.classId)
print(' objLabel:', pfol.objLabel)
print(' list:')
for pfo in pyds_tracker_meta.NvDsPastFrameObjList_list(pfol):
print(' past_frame_object:', pfo)
print(' frameNum:', pfo.frameNum)
print(' tBbox.left:', pfo.tBbox.left)
print(' tBbox.width:', pfo.tBbox.width)
print(' tBbox.top:', pfo.tBbox.top)
print(' tBbox.right:', pfo.tBbox.height)
print(' confidence:', pfo.confidence)
print(' age:', pfo.age)
try:
user_meta_list = user_meta_list.next
except StopIteration:
break
Analytics metadata
import pyds_analytics_meta
def osd_sink_pad_buffer_probe(pad, info, u_data):
batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer))
print("----NvDsAnalytics Frame Meta----")
l_frame = batch_meta.frame_meta_list
# Iterate over list of FrameMeta
while l_frame is not None:
try:
# Casting l_frame.data to ipyds.NvDsFrameMeta
frame_meta = pyds.NvDsFrameMeta.cast(l_frame.data)
l_user = frame_meta.frame_user_meta_list
while l_user is not None:
try:
# Cast to NvDsUserMeta and check it either NvDsAnalyticsFrameMeta or not
user_meta = pyds.NvDsUserMeta.cast(l_user.data)
if user_meta.base_meta.meta_type != pyds.nvds_get_user_meta_type(
"NVIDIA.DSANALYTICSFRAME.USER_META"):
continue
user_meta_analytics = pyds_analytics_meta.NvDsAnalyticsFrameMeta.cast(user_meta.user_meta_data)
print('objCnt:', user_meta_analytics.objCnt)
print('objInROIcnt:', user_meta_analytics.objInROIcnt)
print('objLCCumCnt:', user_meta_analytics.objLCCumCnt)
print('objLCCurrCnt:', user_meta_analytics.objLCCurrCnt)
print('ocStatus:', user_meta_analytics.ocStatus)
print('unique_id:', user_meta_analytics.unique_id)
print(user_meta_analytics.objLCCumCnt)
except Exception as ex:
print('Exception', ex)
try:
l_user = l_user.next
except StopIteration:
break
except StopIteration:
break
print("----NvDsAnalytics Object Info----")
l_obj = frame_meta.obj_meta_list
while l_obj is not None:
try:
# Casting l_obj.data to pyds.NvDsObjectMeta
obj_meta = pyds.NvDsObjectMeta.cast(l_obj.data)
user_meta_list = obj_meta.obj_user_meta_list
while user_meta_list is not None:
try:
user_meta = pyds.NvDsUserMeta.cast(user_meta_list.data)
user_meta_data = user_meta.user_meta_data
if user_meta.base_meta.meta_type != pyds.nvds_get_user_meta_type(
"NVIDIA.DSANALYTICSOBJ.USER_META"):
continue
user_meta_analytics = pyds_analytics_meta.NvDsAnalyticsObjInfo.cast(user_meta.user_meta_data)
print('unique_id:', user_meta_analytics.unique_id)
print('lcStatus:', user_meta_analytics.lcStatus)
print('dirStatus:', user_meta_analytics.dirStatus)
print('ocStatus:', user_meta_analytics.ocStatus)
print('roiStatus:', user_meta_analytics.roiStatus)
except StopIteration:
break
try:
user_meta_list = user_meta_list.next
except StopIteration:
break
except StopIteration:
break
try:
l_obj = l_obj.next
except StopIteration:
break
# Get next FrameMeta in list
try:
l_frame=l_frame.next
except StopIteration:
break
NOTE: see pythiags for an easy-to-use API.
References
- tracker patch repo also available here
- bbox patch
- analytics patch repo also available here
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Hashes for pyds_ext-1.4.1-cp36-cp36m-manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 684e2a223872c2abf8c2f9c0f3a2de4a84a59d22ac3c064b3fc2e69ebe14e023 |
|
MD5 | 41fd4f78262c76061ea19e0331f0117a |
|
BLAKE2b-256 | 453ec50ca427ba84fd888919749ffe02b3917d99d10efca02e1d0fba848a6ce2 |