streammux -> tee -> очередь1 -> детектор1 -> трекер1
-> очередь2 -> детектор2 -> трекер2
Проблема заключается в том, что в трекерах возникают ошибки несоответствия классов, что, как я предполагаю, связано с тем, что буфер метаданных используется совместно между ветвями.
Поэтому мне нужно клонировать метаданные для каждой ветки, чтобы они не мешали трекеру друг друга, но я не уверен, как это сделать. В настоящее время у меня есть функция проверки, которую я помещаю в очереди и вручную копирую все метаданные кадра в новый пакет_meta. но я не могу найти функцию, которая фактически перезаписывает метаданные для следующего нижестоящего элемента.
Код: Выделить всё
def clone_batch_meta_for_branch(self, pad, info, u_data):
gst_buffer = info.get_buffer()
if not gst_buffer:
print("Unable to get GstBuffer")
return self.gst.PadProbeReturn.OK
src_batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer))
if not src_batch_meta:
return self.gst.PadProbeReturn.OK
dst_batch_meta = pyds.nvds_create_batch_meta(src_batch_meta.max_frames_in_batch)
dst_batch_meta.num_frames_in_batch = src_batch_meta.num_frames_in_batch
l_frame = src_batch_meta.frame_meta_list
while l_frame is not None:
try:
src_frame_meta = pyds.NvDsFrameMeta.cast(l_frame.data)
except StopIteration:
break
dst_frame_meta = pyds.nvds_acquire_frame_meta_from_pool(dst_batch_meta)
dst_frame_meta.pad_index = src_frame_meta.pad_index
dst_frame_meta.batch_id = src_frame_meta.batch_id
dst_frame_meta.source_id = src_frame_meta.source_id
dst_frame_meta.source_frame_width = src_frame_meta.source_frame_width
dst_frame_meta.source_frame_height = src_frame_meta.source_frame_height
dst_frame_meta.buf_pts = src_frame_meta.buf_pts
dst_frame_meta.ntp_timestamp = src_frame_meta.ntp_timestamp
l_obj = src_frame_meta.obj_meta_list
while l_obj is not None:
try:
src_obj_meta = pyds.NvDsObjectMeta.cast(l_obj.data)
except StopIteration:
break
dst_obj_meta = pyds.nvds_acquire_obj_meta_from_pool(dst_batch_meta)
dst_obj_meta.rect_params.left = src_obj_meta.rect_params.left
dst_obj_meta.rect_params.top = src_obj_meta.rect_params.top
dst_obj_meta.rect_params.width = src_obj_meta.rect_params.width
dst_obj_meta.rect_params.height = src_obj_meta.rect_params.height
dst_obj_meta.class_id = src_obj_meta.class_id
dst_obj_meta.confidence = src_obj_meta.confidence
dst_obj_meta.obj_label = src_obj_meta.obj_label
pyds.nvds_add_obj_meta_to_frame(dst_frame_meta, dst_obj_meta, None)
try:
l_obj = l_obj.next
except StopIteration:
break
pyds.nvds_add_frame_meta_to_batch(dst_batch_meta, dst_frame_meta)
try:
l_frame = l_frame.next
except StopIteration:
break
#need to somehow write the dst_batch_meta to the buffer without messing with the parallel branch
return self.gst.PadProbeReturn.OK
Мой вариант плана Б — просто использовать несколько конвейеров, но это кажется беспорядочным решением.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -in-python
Мобильная версия