Skip to main content

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 and NvDsAnalyticsObjInfo) from Python.
  • Also install default pyds precompiled library from /opt/nvidia/deepstream/deepstream/lib

Installation

Prerequisites

  1. python3.6

  2. Deepstream v5.0

  3. Jetson Xavier or Nvidia GPU (deepstream compatible)

  4. [Option A] pep-517 compatible pip:

    pip install "pip>=10"
    
  5. [Option B] Only necessary for old pip<10:

Install package

pip install --upgrade pip>=10
pip install pyds_ext

Usage

This meta-package provides three packages:

  1. pyds: Standard pyds from /opt/nvidia/deepstream/deepstream/lib.
  2. pyds_object_meta: Enable NvDsObjectMeta.tracker_bbox_info... and NvDsObjectMeta.detector_bbox_info... access.
  3. 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

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

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

pyds_ext-1.4.2-cp36-cp36m-manylinux2014_x86_64.whl (574.6 kB view hashes)

Uploaded CPython 3.6m

pyds_ext-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl (458.5 kB view hashes)

Uploaded CPython 3.6m

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page