Клонировать метаданные в конвейере Deepstream в PythonPython

Программы на Python
Ответить
Anonymous
 Клонировать метаданные в конвейере Deepstream в Python

Сообщение Anonymous »

В настоящее время я реализую конвейер глубокого потока в Python с тройником следующим образом:
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»