def pgie_src_pad_buffer_probe(pad, info, u_data): frame_number = 0 gst_buffer = info.get_buffer() if not gst_buffer: print("Unable to get GstBuffer ") return # Retrieve batch metadata from the gst_buffer # Note that pyds.gst_buffer_get_nvds_batch_meta() expects the # C address of gst_buffer as input, which is obtained with hash(gst_buffer) 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: # Note that l_frame.data needs a cast to pyds.NvDsFrameMeta # The casting is done by pyds.NvDsFrameMeta.cast() # The casting also keeps ownership of the underlying memory # in the C code, so the Python garbage collector will leave # it alone. frame_meta = pyds.NvDsFrameMeta.cast(l_frame.data) except StopIteration: break frame_number = frame_meta.frame_num l_user = frame_meta.frame_user_meta_list print(l_user) while l_user is not None: try: # Note that l_user.data needs a cast to pyds.NvDsUserMeta # The casting also keeps ownership of the underlying memory # in the C code, so the Python garbage collector will leave # it alone. user_meta = pyds.NvDsUserMeta.cast(l_user.data) except StopIteration: break if (user_meta.base_meta.meta_type != pyds.NvDsMetaType.NVDSINFER_TENSOR_OUTPUT_META): continue tensor_meta = pyds.NvDsInferTensorMeta.cast( user_meta.user_meta_data) layers_info = [] layer = pyds.get_nvds_LayerInfo(tensor_meta, 0) if layer.buffer: ptr = ctypes.cast(pyds.get_ptr(layer.buffer), ctypes.POINTER(ctypes.c_float)) v = np.ctypeslib.as_array(ptr, shape=(5, )) prediction = int(np.argmax(np.array(v).squeeze(), axis=0)) classification = CLASSES[prediction] classifications[frame_number] = classification try: l_user = l_user.next except StopIteration: break fps_streams["stream{0}".format(frame_meta.pad_index)].get_fps() try: l_frame = l_frame.next except StopIteration: break return Gst.PadProbeReturn.OK
def sgie_sink_pad_buffer_probe(pad, info, u_data): frame_number = 0 num_rects = 0 gst_buffer = info.get_buffer() if not gst_buffer: print("Unable to get GstBuffer ") return # Retrieve batch metadata from the gst_buffer # Note that pyds.gst_buffer_get_nvds_batch_meta() expects the # C address of gst_buffer as input, which is obtained with hash(gst_buffer) 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: # Note that l_frame.data needs a cast to pyds.NvDsFrameMeta # The casting is done by pyds.NvDsFrameMeta.cast() # The casting also keeps ownership of the underlying memory # in the C code, so the Python garbage collector will leave # it alone. frame_meta = pyds.NvDsFrameMeta.cast(l_frame.data) except StopIteration: break frame_number = frame_meta.frame_num num_rects = frame_meta.num_obj_meta 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) except StopIteration: break l_user = obj_meta.obj_user_meta_list # if obj_meta.class_id == SGIE_CLASS_ID_FACE: # print(f'obj_meta.obj_user_meta_list {l_user}') while l_user is not None: try: # Casting l_user.data to pyds.NvDsUserMeta user_meta = pyds.NvDsUserMeta.cast(l_user.data) except StopIteration: break if (user_meta.base_meta.meta_type != pyds.NvDsMetaType.NVDSINFER_TENSOR_OUTPUT_META): continue # Converting to tensor metadata # Casting user_meta.user_meta_data to NvDsInferTensorMeta tensor_meta = pyds.NvDsInferTensorMeta.cast( user_meta.user_meta_data) # Get output layer as NvDsInferLayerInfo layer = pyds.get_nvds_LayerInfo(tensor_meta, 0) # Convert NvDsInferLayerInfo buffer to numpy array ptr = ctypes.cast(pyds.get_ptr(layer.buffer), ctypes.POINTER(ctypes.c_float)) v = np.ctypeslib.as_array(ptr, shape=(128, )) # Pridict face neme yhat = v.reshape((1, -1)) face_to_predict_embedding = normalize_vectors(yhat) result = predict_using_classifier(faces_embeddings, labels, face_to_predict_embedding) result = (str(result).title()) # print('Predicted name: %s' % result) # Generate classifer metadata and attach to obj_meta # Get NvDsClassifierMeta object classifier_meta = pyds.nvds_acquire_classifier_meta_from_pool( batch_meta) # Pobulate classifier_meta data with pridction result classifier_meta.unique_component_id = tensor_meta.unique_id label_info = pyds.nvds_acquire_label_info_meta_from_pool( batch_meta) label_info.result_prob = 0 label_info.result_class_id = 0 pyds.nvds_add_label_info_meta_to_classifier( classifier_meta, label_info) pyds.nvds_add_classifier_meta_to_object( obj_meta, classifier_meta) display_text = pyds.get_string( obj_meta.text_params.display_text) obj_meta.text_params.display_text = f'{display_text} {result}' try: l_user = l_user.next except StopIteration: break try: l_obj = l_obj.next except StopIteration: break try: l_frame = l_frame.next except StopIteration: break return Gst.PadProbeReturn.OK
def osd_sink_pad_buffer_probe(pad, info, u_data): frame_number = 0 #Intiallizing object counter with 0. obj_counter = { PGIE_CLASS_ID_PERSON: 0, PGIE_CLASS_ID_FACE: 0, } num_rects = 0 gst_buffer = info.get_buffer() if not gst_buffer: print("Unable to get GstBuffer ") return # Retrieve batch metadata from the gst_buffer # Note that pyds.gst_buffer_get_nvds_batch_meta() expects the # C address of gst_buffer as input, which is obtained with hash(gst_buffer) 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: # Note that l_frame.data needs a cast to pyds.NvDsFrameMeta # The casting is done by pyds.NvDsFrameMeta.cast() # The casting also keeps ownership of the underlying memory # in the C code, so the Python garbage collector will leave # it alone. frame_meta = pyds.NvDsFrameMeta.cast(l_frame.data) except StopIteration: break frame_number = frame_meta.frame_num num_rects = frame_meta.num_obj_meta 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) except StopIteration: break obj_counter[obj_meta.class_id] += 1 l_user = obj_meta.obj_user_meta_list # print(l_user) while l_user is not None: print('Inside l_user = obj_meta.obj_user_meta_list Loop') try: # Casting l_obj.data to pyds.NvDsObjectMeta user_meta = pyds.NvDsUserMeta.cast(l_user.data) except StopIteration: break if (user_meta.base_meta.meta_type != pyds.NvDsMetaType.NVDSINFER_TENSOR_OUTPUT_META): continue tensor_meta = pyds.NvDsInferTensorMeta.cast( user_meta.user_meta_data) # Boxes in the tensor meta should be in network resolution which is # found in tensor_meta.network_info. Use this info to scale boxes to # the input frame resolution. layers_info = [] for i in range(tensor_meta.num_output_layers): layer = pyds.get_nvds_LayerInfo(tensor_meta, i) layers_info.append(layer) print(f'Layer: {i}, Layer name: {layer.layerName}') try: l_user = l_user.next except StopIteration: break try: l_obj = l_obj.next except StopIteration: break # Acquiring a display meta object. The memory ownership remains in # the C code so downstream plugins can still access it. Otherwise # the garbage collector will claim it when this probe function exits. display_meta = pyds.nvds_acquire_display_meta_from_pool(batch_meta) display_meta.num_labels = 1 py_nvosd_text_params = display_meta.text_params[0] # Setting display text to be shown on screen # Note that the pyds module allocates a buffer for the string, and the # memory will not be claimed by the garbage collector. # Reading the display_text field here will return the C address of the # allocated string. Use pyds.get_string() to get the string content. py_nvosd_text_params.display_text = "Frame Number={} Number of Objects={} Person_count={} Face_count={}".format( frame_number, num_rects, obj_counter[PGIE_CLASS_ID_PERSON], obj_counter[PGIE_CLASS_ID_FACE]) # Now set the offsets where the string should appear py_nvosd_text_params.x_offset = 10 py_nvosd_text_params.y_offset = 12 # Font , font-color and font-size py_nvosd_text_params.font_params.font_name = "Serif" py_nvosd_text_params.font_params.font_size = 10 # set(red, green, blue, alpha); set to White py_nvosd_text_params.font_params.font_color.set(1.0, 1.0, 1.0, 1.0) # Text background color py_nvosd_text_params.set_bg_clr = 1 # set(red, green, blue, alpha); set to Black py_nvosd_text_params.text_bg_clr.set(0.0, 0.0, 0.0, 1.0) # Using pyds.get_string() to get display_text as string print(pyds.get_string(py_nvosd_text_params.display_text)) pyds.nvds_add_display_meta_to_frame(frame_meta, display_meta) try: l_frame = l_frame.next except StopIteration: break return Gst.PadProbeReturn.OK
def pgie_src_pad_buffer_probe(pad, info, u_data, label_path): gst_buffer = info.get_buffer() if not gst_buffer: print("Unable to get GstBuffer ") return # Retrieve batch metadata from the gst_buffer # Note that pyds.gst_buffer_get_nvds_batch_meta() expects the # C address of gst_buffer as input, which is obtained with hash(gst_buffer) batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer)) l_frame = batch_meta.frame_meta_list detection_params = DetectionParam(CLASS_NB, ACCURACY_ALL_CLASS) box_size_param = BoxSizeParam(IMAGE_HEIGHT, IMAGE_WIDTH, MIN_BOX_WIDTH, MIN_BOX_HEIGHT) nms_param = NmsParam(TOP_K, IOU_THRESHOLD) label_names = get_label_names_from_file(label_path) while l_frame is not None: try: # Note that l_frame.data needs a cast to pyds.NvDsFrameMeta # The casting also keeps ownership of the underlying memory # in the C code, so the Python garbage collector will leave # it alone. 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: # Note that l_user.data needs a cast to pyds.NvDsUserMeta # The casting also keeps ownership of the underlying memory # in the C code, so the Python garbage collector will leave # it alone. user_meta = pyds.NvDsUserMeta.cast(l_user.data) except StopIteration: break if (user_meta.base_meta.meta_type != pyds.NvDsMetaType.NVDSINFER_TENSOR_OUTPUT_META): continue tensor_meta = pyds.NvDsInferTensorMeta.cast( user_meta.user_meta_data) # Boxes in the tensor meta should be in network resolution which is # found in tensor_meta.network_info. Use this info to scale boxes to # the input frame resolution. layers_info = [] for i in range(tensor_meta.num_output_layers): layer = pyds.get_nvds_LayerInfo(tensor_meta, i) layers_info.append(layer) frame_object_list = nvds_infer_parse_custom_tf_ssd( layers_info, detection_params, box_size_param, nms_param) try: l_user = l_user.next except StopIteration: break for frame_object in frame_object_list: add_obj_meta_to_frame(frame_object, batch_meta, frame_meta, label_names) try: l_frame = l_frame.next except StopIteration: break return Gst.PadProbeReturn.OK