PyDs 7.1 Sgie: layer_info.buffer == None (bodypose)

• Hardware Platform: Jetson
• DeepStream Version: 7.1-triton
• Issue Type: SGIE buffer None



Hi everyone,

I’m building a DeepStream 7.1 Python pipeline on Jetson using JetPack 6.2. It’s based on the multi-input multi-output Python sample, and I’m using a custom SGIE model for 2.5D pose estimation (like OpenPose 25 keypoints + Z + confidence). The model outputs a single layer named pose25d with shape [1, 34, 4].

In the C++ code, everything works fine. I’m able to run tensor_meta->out_buf_ptrs_host, visualize the pose keypoints, and use them as expected.

im using the same config infer files:

However, i wanted the same in python..in the Python app, when I try to access the layer data like this:

def parse_pose_from_meta(frame_meta, obj_meta):

    ##PGIE
    class_id = obj_meta.class_id
    confidence = obj_meta.confidence
    if class_id == 0:
        left = int(obj_meta.rect_params.left)
        top = int(obj_meta.rect_params.top)
        width = int(obj_meta.rect_params.width)
        height = int(obj_meta.rect_params.height)
        print(left, top, width, height)         # outputs 1283 190 270 679 # ✅ Works



    ##SGIE
    # # # print(dir(obj_meta))
    # ls = ['base_meta', 'cast', 'class_id', 'classifier_meta_list', 'confidence', 'detector_bbox_info', 'mask_params', 
    # 'misc_obj_info', 'obj_label', 'obj_user_meta_list', 'object_id', 'parent', 'rect_params', 'reserved', 
    # 'text_params', 'tracker_bbox_info', 'tracker_confidence', 'unique_component_id']

    # for i in ls:
    #     print(f"Attribute {i}: {getattr(obj_meta, i)}")

    user_meta_list = obj_meta.obj_user_meta_list
    while user_meta_list is not None:
        user_meta = pyds.NvDsUserMeta.cast(user_meta_list.data)
        if user_meta and user_meta.base_meta.meta_type == pyds.NvDsMetaType.NVDSINFER_TENSOR_OUTPUT_META:
            tensor_meta = pyds.NvDsInferTensorMeta.cast(user_meta.user_meta_data)

            # # print(dir(tensor_meta))
            # ls2 =  ['cast', 'gpu_id', 'network_info', 'num_output_layers', 'out_buf_ptrs_dev', 'out_buf_ptrs_host', 'output_layers_info', 'priv_data']

            # for i in ls2:
            #     print(f"Attribute {i}: {getattr(tensor_meta, i)}")


            ptrs = tensor_meta.out_buf_ptrs_dev
            print(dir(ptrs))
            # print(dir(ptrs.cast))


            num_layers = tensor_meta.num_output_layers
            print(f"Found tensor meta with {num_layers} layers")

            for i in range(num_layers):
                layer_info = tensor_meta.output_layers_info(i)  
                layer_name = layer_info.layerName
                print(f"Layer {i}: {layer_name}")
                
                if layer_info.buffer is not None:
                    dims = layer_info.inferDims
                    print(f"{layer_name} shape: {[dims.numElements()]} ({dims.d[0]}x{dims.d[1]}x{dims.d[2]})")
                else:
                    print(f"{layer_name} buffer is None")
        user_meta_list = user_meta_list.next

 # Always prints None...

it outputs all the time, all the way buffer None:

Found tensor meta with 4 layers
Layer 0: pose2d
pose2d buffer is None
Layer 1: pose2d_org_img
pose2d_org_img buffer is None
Layer 2: pose25d
pose25d buffer is None
Layer 3: pose3d
pose3d buffer is None

layer_info.buffer is always None, even though in the C++ version, the buffer has valid values.


Things I’ve Checked:

  • SGIE model works in DeepStream C++ with custom parser
  • Tensor metadata (tensor_meta.num_output_layers) is correct
  • Layer name is correctly matched as pose25d
  • Model is ONNX and engine is generated correctly (verified with trtexec and in C++)
  • out_buf_ptrs_host in C++ has valid floats for all keypoints

My Question:

Is there an additional step or setting in the DeepStream Python pipeline to ensure layer_info.buffer is filled correctly for SGIE outputs?

Or should I be accessing tensor_meta.out_buf_ptrs_host directly from Python using ctypes or another method?

i want to access the SGIE output tensor values in pyds

Any help would be appreciated. I can also share my config file and parser if needed.

Thanks in advance!

Please use get_nvds_LayerInfo to get layer info, Otherwise it is invalid

infer_meta = pyds.NvDsInferTensorMeta.cast(user_meta.user_meta_data)
print(f"[DBG] num_output_layers={infer_meta.num_output_layers}")
for layer_idx in range(infer_meta.num_output_layers):
       layer = pyds.get_nvds_LayerInfo(infer_meta, layer_idx)
       array = layer_tensor_to_ndarray(layer)
        print(f"[DBG] {layer.layerName} layer_info.buffer address = {type(array)}")

This is similar to this topic

great thanks <3…it worked.. really tysm @junshengy <3
this was the output..

[DBG] num_output_layers=4
[DBG] pose2d layer_info.buffer address = <class 'numpy.ndarray'>
[9.4125000e+01 1.2062500e+02 4.0551758e-01 1.0856250e+02 1.2187500e+02
 2.8491211e-01 8.5312500e+01 1.2018750e+02 2.0593262e-01 9.3437500e+01
 8.5187500e+01 5.1806641e-01 1.2450000e+02 1.7412500e+02 3.1616211e-01
 1.1681250e+02 1.7187500e+02 2.3132324e-01 9.7687500e+01 5.5281250e+01
 3.2421875e-01 1.0668750e+02 1.9112500e+02 1.9079590e-01 1.0262500e+02
 1.7712500e+02 2.7441406e-01 1.2612500e+02 2.1550000e+02 3.3569336e-01
 1.2318750e+02 2.1025000e+02 2.5854492e-01 1.2900000e+02 2.1812500e+02
 3.4619141e-01 1.1850000e+02 2.0412500e+02 2.3266602e-01 1.1118750e+02
 2.1937500e+02 3.0908203e-01 1.0800000e+02 2.0912500e+02 2.8613281e-01
 9.9312500e+01 4.4906250e+01 2.9101562e-01 9.9687500e+01 4.0093750e+01
 2.8588867e-01 9.9562500e+01 4.0031250e+01 3.3593750e-01 9.8375000e+01
 4.2906250e+01 2.8344727e-01 9.3937500e+01 4.1500000e+01 3.6865234e-01
 1.1456250e+02 6.0218750e+01 2.6562500e-01 7.9500000e+01 5.9406250e+01
 2.5732422e-01 8.9500000e+01 9.2625000e+01 1.4843750e-01 7.3937500e+01
 9.2812500e+01 1.6870117e-01 9.0812500e+01 1.1375000e+02 1.4233398e-01
 9.0062500e+01 1.1343750e+02 1.2780762e-01 9.3187500e+01 1.1418750e+02
 1.3964844e-01 9.1250000e+01 1.1637500e+02 1.3525391e-01 9.5250000e+01
 1.1131250e+02 1.2194824e-01 9.0250000e+01 1.1350000e+02 1.2976074e-01
 9.4937500e+01 1.1193750e+02 1.2042236e-01 9.1250000e+01 1.1606250e+02
 1.4123535e-01 9.5187500e+01 1.1037500e+02 1.2133789e-01 9.0500000e+01
 1.1406250e+02 1.5356445e-01]
[DBG] pose2d_org_img layer_info.buffer address = <class 'numpy.ndarray'>
[0.         0.         0.40551758 0.         0.         0.2849121
 0.         0.         0.20593262 0.         0.         0.5180664
 0.         0.         0.3161621  0.         0.         0.23132324
 0.         0.         0.32421875 0.         0.         0.1907959
 0.         0.         0.27441406 0.         0.         0.33569336
 0.         0.         0.25854492 0.         0.         0.3461914
 0.         0.         0.23266602 0.         0.         0.30908203
 0.         0.         0.2861328  0.         0.         0.29101562
 0.         0.         0.28588867 0.         0.         0.3359375
 0.         0.         0.28344727 0.         0.         0.36865234
 0.         0.         0.265625   0.         0.         0.25732422
 0.         0.         0.1484375  0.         0.         0.16870117
 0.         0.         0.14233398 0.         0.         0.12780762
 0.         0.         0.13964844 0.         0.         0.1352539
 0.         0.         0.12194824 0.         0.         0.12976074
 0.         0.         0.12042236 0.         0.         0.14123535
 0.         0.         0.12133789 0.         0.         0.15356445]
[DBG] pose25d layer_info.buffer address = <class 'numpy.ndarray'>
[ 9.4125000e+01  1.2062500e+02  5.5742264e-04  4.0551758e-01
  1.0856250e+02  1.2187500e+02  7.4462891e-03  2.8491211e-01
  8.5312500e+01  1.2018750e+02 -2.9479980e-02  2.0593262e-01
  9.3437500e+01  8.5187500e+01  5.6884766e-02  5.1806641e-01
  1.2450000e+02  1.7412500e+02  3.6895752e-02  3.1616211e-01
  1.1681250e+02  1.7187500e+02  3.3905029e-02  2.3132324e-01
  9.7687500e+01  5.5281250e+01  1.5539551e-01  3.2421875e-01
  1.0668750e+02  1.9112500e+02  1.3867188e-01  1.9079590e-01
  1.0262500e+02  1.7712500e+02  4.1412354e-02  2.7441406e-01
  1.2612500e+02  2.1550000e+02  1.7419434e-01  3.3569336e-01
  1.2318750e+02  2.1025000e+02  1.3854980e-01  2.5854492e-01
  1.2900000e+02  2.1812500e+02  2.0117188e-01  3.4619141e-01
  1.1850000e+02  2.0412500e+02  9.3933105e-02  2.3266602e-01
  1.1118750e+02  2.1937500e+02  1.5161133e-01  3.0908203e-01
  1.0800000e+02  2.0912500e+02  1.2768555e-01  2.8613281e-01
  9.9312500e+01  4.4906250e+01  2.4389648e-01  2.9101562e-01
  9.9687500e+01  4.0093750e+01  2.1166992e-01  2.8588867e-01
  9.9562500e+01  4.0031250e+01  2.2656250e-01  3.3593750e-01
  9.8375000e+01  4.2906250e+01  2.1545410e-01  2.8344727e-01
  9.3937500e+01  4.1500000e+01  2.3474121e-01  3.6865234e-01
  1.1456250e+02  6.0218750e+01  1.1566162e-01  2.6562500e-01
  7.9500000e+01  5.9406250e+01  1.9824219e-01  2.5732422e-01
  8.9500000e+01  9.2625000e+01  1.4062500e-01  1.4843750e-01
  7.3937500e+01  9.2812500e+01  8.7219238e-02  1.6870117e-01
  9.0812500e+01  1.1375000e+02  2.3645020e-01  1.4233398e-01
  9.0062500e+01  1.1343750e+02  1.4807129e-01  1.2780762e-01
  9.3187500e+01  1.1418750e+02  2.8149414e-01  1.3964844e-01
  9.1250000e+01  1.1637500e+02  1.6381836e-01  1.3525391e-01
  9.5250000e+01  1.1131250e+02  2.8857422e-01  1.2194824e-01
  9.0250000e+01  1.1350000e+02  2.2448730e-01  1.2976074e-01
  9.4937500e+01  1.1193750e+02  2.6318359e-01  1.2042236e-01
  9.1250000e+01  1.1606250e+02  2.0947266e-01  1.4123535e-01
  9.5187500e+01  1.1037500e+02  2.7563477e-01  1.2133789e-01
  9.0500000e+01  1.1406250e+02  2.3364258e-01  1.5356445e-01]
[DBG] pose3d layer_info.buffer address = <class 'numpy.ndarray'>
[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan]