Please provide complete information as applicable to your setup.
• Hardware Platform (Jetson / GPU) - dGPU (RTX2070)
• DeepStream Version - 5.0
• TensorRT Version - 7.0.0
• NVIDIA GPU Driver Version (valid for GPU only) - 440
Hi
I am trying to get new analytics plugin working in python and based on CPP example have been able to create a app, and on running i can see the analytics happening on screen, but have been unable to get the meta data of plugin, i am sharing the probe function which i have taken reference to port to python along with my python function.
/* nvdsanalytics_src_pad_buffer_probe will extract metadata received on tiler sink pad
* and extract nvanalytics metadata etc. */
static GstPadProbeReturn
nvdsanalytics_src_pad_buffer_probe (GstPad * pad, GstPadProbeInfo * info,
gpointer u_data)
{
GstBuffer *buf = (GstBuffer *) info->data;
guint num_rects = 0;
NvDsObjectMeta *obj_meta = NULL;
guint vehicle_count = 0;
guint person_count = 0;
NvDsMetaList * l_frame = NULL;
NvDsMetaList * l_obj = NULL;
NvDsBatchMeta *batch_meta = gst_buffer_get_nvds_batch_meta (buf);
for (l_frame = batch_meta->frame_meta_list; l_frame != NULL;
l_frame = l_frame->next) {
NvDsFrameMeta *frame_meta = (NvDsFrameMeta *) (l_frame->data);
std::stringstream out_string;
vehicle_count = 0;
num_rects = 0;
person_count = 0;
for (l_obj = frame_meta->obj_meta_list; l_obj != NULL;
l_obj = l_obj->next) {
obj_meta = (NvDsObjectMeta *) (l_obj->data);
if (obj_meta->class_id == PGIE_CLASS_ID_VEHICLE) {
vehicle_count++;
num_rects++;
}
if (obj_meta->class_id == PGIE_CLASS_ID_PERSON) {
person_count++;
num_rects++;
}
// Access attached user meta for each object
for (NvDsMetaList *l_user_meta = obj_meta->obj_user_meta_list; l_user_meta != NULL;
l_user_meta = l_user_meta->next) {
NvDsUserMeta *user_meta = (NvDsUserMeta *) (l_user_meta->data);
if(user_meta->base_meta.meta_type == NVDS_USER_OBJ_META_NVDSANALYTICS)
{
NvDsAnalyticsObjInfo * user_meta_data = (NvDsAnalyticsObjInfo *)user_meta->user_meta_data;
if (user_meta_data->dirStatus.length()){
g_print ("object %lu moving in %s\n", obj_meta->object_id, user_meta_data->dirStatus.c_str());
}
}
}
}
/* Iterate user metadata in frames to search analytics metadata */
for (NvDsMetaList * l_user = frame_meta->frame_user_meta_list;
l_user != NULL; l_user = l_user->next) {
NvDsUserMeta *user_meta = (NvDsUserMeta *) l_user->data;
if (user_meta->base_meta.meta_type != NVDS_USER_FRAME_META_NVDSANALYTICS)
continue;
/* convert to metadata */
NvDsAnalyticsFrameMeta *meta =
(NvDsAnalyticsFrameMeta *) user_meta->user_meta_data;
/* Get the labels from nvdsanalytics config file */
for (std::pair<std::string, uint32_t> status : meta->objInROIcnt){
out_string << "Objs in ROI ";
out_string << status.first;
out_string << " = ";
out_string << status.second;
}
for (std::pair<std::string, uint32_t> status : meta->objLCCumCnt){
out_string << " LineCrossing Cumulative ";
out_string << status.first;
out_string << " = ";
out_string << status.second;
}
for (std::pair<std::string, uint32_t> status : meta->objLCCurrCnt){
out_string << " LineCrossing Current Frame ";
out_string << status.first;
out_string << " = ";
out_string << status.second;
}
for (std::pair<std::string, bool> status : meta->ocStatus){
out_string << " Overcrowding status ";
out_string << status.first;
out_string << " = ";
out_string << status.second;
}
}
g_print ("Frame Number = %d of Stream = %d, Number of objects = %d "
"Vehicle Count = %d Person Count = %d %s\n",
frame_meta->frame_num, frame_meta->pad_index,
num_rects, vehicle_count, person_count, out_string.str().c_str());
}
return GST_PAD_PROBE_OK;
}
python code
# nvdsanalytics_src_pad_buffer_probe
# tiler_sink_pad_buffer_probe will extract metadata received on tiler src pad
# and update params for drawing rectangle, object information etc.
def nvdsanalytics_src_pad_buffer_probe(pad,info,u_data):
gst_buffer = info.get_buffer()
if not gst_buffer:
print("Unable to get GstBuffer ")
return
batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer))
l_frame = batch_meta.frame_meta_list
while l_frame is not None:
try:
frame_meta = pyds.NvDsFrameMeta.cast(l_frame.data)
except StopIteration:
break
l_user = frame_meta.frame_user_meta_list
while l_user is not None:
try:
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
meta = pyds.NvDsAnalyticsFrameMeta()
print(meta.objInROIcnt)
except StopIteration:
break
try:
l_user=l_user.next
except sStopIteration:
break
try:
l_frame=l_frame.next
except StopIteration:
break
return Gst.PadProbeReturn.OK
I am not able to understand how to implement this as no casting function is available for NvDsAnalyticsFrameMeta and stuck on this line
NvDsAnalyticsFrameMeta *meta =(NvDsAnalyticsFrameMeta *) user_meta->user_meta_data;
Or am i doing something wrong here ?