def meta_copy_func(data, user_data): logging.debug("meta_copy_func: BEGIN") # Cast data to pyds.NvDsUserMeta user_meta = pyds.NvDsUserMeta.cast(data) src_meta_data = user_meta.user_meta_data # Cast src_meta_data to pyds.NvDsEventMsgMeta srcmeta = pyds.NvDsEventMsgMeta.cast(src_meta_data) # Duplicate the memory contents of srcmeta to dstmeta # First use pyds.get_ptr() to get the C address of srcmeta, then # use pyds.memdup() to allocate dstmeta and copy srcmeta into it. # pyds.memdup returns C address of the allocated duplicate. dstmeta_ptr = pyds.memdup(pyds.get_ptr(srcmeta), sys.getsizeof(pyds.NvDsEventMsgMeta)) # Cast the duplicated memory to pyds.NvDsEventMsgMeta dstmeta = pyds.NvDsEventMsgMeta.cast(dstmeta_ptr) # Duplicate contents of ts field. Note that reading srcmeta.ts # returns its C address. This allows to memory operations to be # performed on it. dstmeta.ts = pyds.strdup(srcmeta.ts) # Copy the sensorStr. This field is a string property. # The getter (read) returns its C address. The setter (write) # takes string as input, allocates a string buffer and copies # the input string into it. # pyds.get_string() takes C address of a string and returns # the reference to a string object and the assignment inside the binder copies content. dstmeta.sensorStr = pyds.get_string(srcmeta.sensorStr) if srcmeta.objSignature.size > 0: dstmeta.objSignature.signature = pyds.memdup( srcmeta.objSignature.signature, srcMeta.objSignature.size) dstmeta.objSignature.size = srcmeta.objSignature.size if srcmeta.extMsgSize > 0: if srcmeta.objType == pyds.NvDsObjectType.NVDS_OBJECT_TYPE_VEHICLE: srcobj = pyds.NvDsVehicleObject.cast(srcmeta.extMsg) obj = pyds.alloc_nvds_vehicle_object() obj.type = pyds.get_string(srcobj.type) obj.make = pyds.get_string(srcobj.make) obj.model = pyds.get_string(srcobj.model) obj.color = pyds.get_string(srcobj.color) obj.license = pyds.get_string(srcobj.license) obj.region = pyds.get_string(srcobj.region) dstmeta.extMsg = obj dstmeta.extMsgSize = sys.getsizeof(pyds.NvDsVehicleObject) elif srcmeta.objType == pyds.NvDsObjectType.NVDS_OBJECT_TYPE_PERSON: srcobj = pyds.NvDsPersonObject.cast(srcmeta.extMsg) obj = pyds.alloc_nvds_person_object() obj.age = srcobj.age obj.gender = pyds.get_string(srcobj.gender) obj.cap = pyds.get_string(srcobj.cap) obj.hair = pyds.get_string(srcobj.hair) obj.apparel = pyds.get_string(srcobj.apparel) dstmeta.extMsg = obj dstmeta.extMsgSize = sys.getsizeof(pyds.NvDsVehicleObject) logging.debug("meta_copy_func: END") return dstmeta
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