18 #include "metadatadoc.h"
28 template<
class T,
class ITERATOR>
56 template<
class T,
class META_CLS,
class ITERATOR>
59 return py::cast(std::vector<T>());
63 metadata.initiateIterator(begin.
get());
64 metadata.initiateIterator(
end.get());
65 while (!
end.get()->done()) ++
end;
70 template<
class META_CLS,
int N>
73 return py::cast(std::vector<UserMetadata>());
77 metadata.initiateIterator(begin.
get(), N);
78 metadata.initiateIterator(
end.get(), N);
79 while (!
end.get()->done()) ++
end;
84 template<
class META_CLS>
87 std::vector<deepstream::UserMetadata> results = {};
88 self.iterate([type, &results](
const UserMetadata& user_meta) {
89 StructureUserMetadata meta(user_meta);
90 if (meta.getStructureUserMetadata() && meta.getStructureUserMetatype() == type) {
91 results.emplace_back(user_meta);
108 std::vector<RoiMetadata> rois =
self.getRois();
114 py::list received(max_items);
117 for (
unsigned int i = 0; i < max_items; i++) {
118 received[i] = py::none();
122 for (
const RoiMetadata& roi : rois) {
124 std::vector<int> shape;
125 std::vector<std::vector<int>> bboxes;
126 std::vector<float> probs;
127 std::vector<std::vector<std::string>> labels;
128 std::vector<py::array_t<int>> seg_maps;
129 std::vector<int> objects;
130 int64_t timestamp = 0;
132 FrameMetadata frame_meta = roi.frameMetadata();
133 if (!frame_meta)
continue;
136 shape = {
static_cast<int>(frame_meta.pipelineHeight()),
137 static_cast<int>(frame_meta.pipelineWidth())};
140 roi.iterate([&](
const UserMetadata& user_meta) {
141 SegmentationUserMetadata seg_meta(user_meta);
144 shape = {
static_cast<int>(seg_meta.getHeight()),
145 static_cast<int>(seg_meta.getWidth())};
147 const int* class_map_data = seg_meta.getClassMap();
148 if (class_map_data) {
150 unsigned int height = seg_meta.getHeight();
151 unsigned int width = seg_meta.getWidth();
152 py::array_t<int> class_map({height,
width});
153 auto buf = class_map.mutable_unchecked<2>();
156 for (
unsigned int i = 0; i < height; i++) {
157 for (
unsigned int j = 0; j <
width; j++) {
158 buf(i, j) = class_map_data[i *
width + j];
161 seg_maps.push_back(class_map);
167 frame_meta.iterate([&](
const ObjectMetadata& object_meta) {
169 std::vector<std::string> obj_labels;
170 if (!object_meta.label().empty()) {
171 obj_labels.push_back(object_meta.label());
176 int left =
static_cast<int>(rect.
left);
177 int top =
static_cast<int>(rect.
top);
179 int height =
static_cast<int>(rect.
height);
182 shape = {
static_cast<int>(frame_meta.pipelineHeight()),
183 static_cast<int>(frame_meta.pipelineWidth())};
186 bboxes.push_back({left, top, left +
width, top + height});
189 probs.push_back(object_meta.confidence());
192 object_meta.iterate([&](
const ClassifierMetadata& classifier) {
193 for (
unsigned int i = 0; i < classifier.nLabels(); i++) {
194 obj_labels.push_back(classifier.getLabel(i));
198 labels.push_back(obj_labels);
199 objects.push_back(
static_cast<int>(object_meta.objectId()));
203 roi.iterate([&](
const ClassifierMetadata& classifier) {
204 std::vector<std::string> cls_labels;
205 for (
unsigned int i = 0; i < classifier.nLabels(); i++) {
206 cls_labels.push_back(classifier.getLabel(i));
208 if (!cls_labels.empty()) {
209 labels.push_back(cls_labels);
214 timestamp =
static_cast<int64_t
>(frame_meta.bufferPTS());
217 metadata[
"shape"] = shape;
218 metadata[
"bboxes"] = bboxes;
219 metadata[
"probs"] = probs;
220 metadata[
"labels"] = labels;
221 metadata[
"seg_maps"] = seg_maps;
222 metadata[
"objects"] = objects;
223 metadata[
"timestamp"] = timestamp;
226 unsigned int pad_index = frame_meta.padIndex();
227 if (pad_index < max_items) {
228 received[pad_index] = metadata;
241 if (
self.isAudioBatch()) {
246 py::list received(max_items);
249 for (
unsigned int i = 0; i < max_items; i++) {
250 received[i] = py::none();
254 self.iterate([&](
const FrameMetadata& frame_meta) {
256 std::vector<int> shape;
257 std::vector<std::vector<int>> bboxes;
258 std::vector<float> probs;
259 std::vector<std::vector<std::string>> labels;
260 std::vector<py::array_t<int>> seg_maps;
261 std::vector<int> objects;
262 int64_t timestamp = 0;
265 shape = {
static_cast<int>(frame_meta.pipelineHeight()),
266 static_cast<int>(frame_meta.pipelineWidth())};
269 frame_meta.iterate([&](
const ObjectMetadata& object_meta) {
271 std::vector<std::string> obj_labels;
272 if (!object_meta.label().empty()) {
273 obj_labels.push_back(object_meta.label());
278 int left =
static_cast<int>(rect.
left);
279 int top =
static_cast<int>(rect.
top);
281 int height =
static_cast<int>(rect.
height);
284 bboxes.push_back({left, top, left +
width, top + height});
287 probs.push_back(object_meta.confidence());
290 object_meta.iterate([&](
const ClassifierMetadata& classifier) {
291 for (
unsigned int i = 0; i < classifier.nLabels(); i++) {
292 obj_labels.push_back(classifier.getLabel(i));
296 labels.push_back(obj_labels);
297 objects.push_back(
static_cast<int>(object_meta.objectId()));
301 if (mask_params.
data !=
nullptr && mask_params.
size > 0) {
303 py::array_t<int> mask_array_int({mask_params.
height, mask_params.
width});
304 auto mask_buf = mask_array_int.mutable_unchecked<2>();
307 for (
unsigned int i = 0; i < mask_params.
height; i++) {
308 for (
unsigned int j = 0; j < mask_params.
width; j++) {
309 mask_buf(i, j) =
static_cast<int>(mask_params.
data[i * mask_params.
width + j]);
312 seg_maps.push_back(mask_array_int);
317 frame_meta.iterate([&](
const UserMetadata& user_meta) {
318 SegmentationUserMetadata seg_meta(user_meta);
321 shape = {
static_cast<int>(seg_meta.getHeight()),
322 static_cast<int>(seg_meta.getWidth())};
324 const int* class_map_data = seg_meta.getClassMap();
325 if (class_map_data) {
327 unsigned int height = seg_meta.getHeight();
328 unsigned int width = seg_meta.getWidth();
329 py::array_t<int> class_map({height,
width});
330 auto buf = class_map.mutable_unchecked<2>();
333 for (
unsigned int i = 0; i < height; i++) {
334 for (
unsigned int j = 0; j <
width; j++) {
335 buf(i, j) = class_map_data[i *
width + j];
338 seg_maps.push_back(class_map);
344 timestamp =
static_cast<int64_t
>(frame_meta.bufferPTS());
347 metadata[
"shape"] = shape;
348 metadata[
"bboxes"] = bboxes;
349 metadata[
"probs"] = probs;
350 metadata[
"labels"] = labels;
351 metadata[
"seg_maps"] = seg_maps;
352 metadata[
"objects"] = objects;
353 metadata[
"timestamp"] = timestamp;
356 unsigned int pad_index = frame_meta.padIndex();
357 if (pad_index < max_items) {
358 received[pad_index] = metadata;
370 py::list received(max_items);
371 for (
unsigned int i = 0; i < max_items; i++) {
372 received[i] = py::none();
375 self.iterate([&](
const AudioFrameMetadata& frame_meta) {
377 std::vector<int> shape = {
378 static_cast<int>(frame_meta.numSamplesPerFrame()),
379 static_cast<int>(frame_meta.numChannels())
381 std::vector<std::vector<int>> bboxes;
382 std::vector<float> probs;
383 std::vector<std::vector<std::string>> labels;
384 std::vector<py::array_t<int>> seg_maps;
385 std::vector<int> objects;
387 if (!frame_meta.classLabel().empty()) {
388 labels.push_back({frame_meta.classLabel()});
389 probs.push_back(frame_meta.confidence());
390 objects.push_back(frame_meta.classId());
393 frame_meta.iterate([&](
const ClassifierMetadata& classifier) {
394 std::vector<std::string> cls_labels;
395 for (
unsigned int i = 0; i < classifier.nLabels(); i++) {
396 cls_labels.push_back(classifier.getLabel(i));
398 if (!cls_labels.empty()) {
399 labels.push_back(cls_labels);
403 metadata[
"media_type"] =
"audio";
404 metadata[
"shape"] = shape;
405 metadata[
"bboxes"] = bboxes;
406 metadata[
"probs"] = probs;
407 metadata[
"labels"] = labels;
408 metadata[
"seg_maps"] = seg_maps;
409 metadata[
"objects"] = objects;
410 metadata[
"timestamp"] =
static_cast<int64_t
>(frame_meta.bufferPTS());
411 metadata[
"sample_rate"] = frame_meta.sampleRate();
412 metadata[
"num_channels"] = frame_meta.numChannels();
413 metadata[
"num_samples_per_frame"] = frame_meta.numSamplesPerFrame();
414 metadata[
"format"] = frame_meta.format();
415 metadata[
"layout"] = frame_meta.layout();
416 metadata[
"infer_done"] = frame_meta.inferDone();
417 metadata[
"class_id"] = frame_meta.classId();
418 metadata[
"class_label"] = frame_meta.classLabel();
419 metadata[
"confidence"] = frame_meta.confidence();
421 unsigned int pad_index = frame_meta.padIndex();
422 if (pad_index < max_items) {
423 received[pad_index] = metadata;
457 .def_property_readonly(
"n_frames", [](
const BatchMetadata&
self) {
458 return self.nFrames();
460 .def_property_readonly(
"is_audio", &BatchMetadata::isAudioBatch)
461 .def_property_readonly(
"frame_items", [](BatchMetadata&
self) -> py::object {
462 if (
self.isAudioBatch()) {
463 return py::cast(std::vector<FrameMetadata>());
465 return generate_iterator<FrameMetadata, BatchMetadata, FrameMetadata::Iterator>(
self);
466 }, py::keep_alive<0, 1>())
467 .def_property_readonly(
"audio_frame_items", [](BatchMetadata&
self) -> py::object {
468 if (!
self.isAudioBatch()) {
469 return py::cast(std::vector<AudioFrameMetadata>());
471 return generate_iterator<AudioFrameMetadata, BatchMetadata, AudioFrameMetadata::Iterator>(
self);
472 }, py::keep_alive<0, 1>())
473 .def_property_readonly(
"preprocess_batch_items", [](BatchMetadata&
self) {
474 return generate_usermeta_iterator<BatchMetadata, NVDS_PREPROCESS_BATCH_META>(
self);
475 }, py::keep_alive<0, 1>())
476 .def(
"retrieve_structure_usermeta", [](BatchMetadata&
self,
const std::string& type_name) {
477 return retrieve_structure_usermeta<BatchMetadata>(
self, type_name);
479 .def(
"user_meta_items", [](BatchMetadata&
self,
int meta_type) {
482 self.initiateIterator(begin.
get(), meta_type);
483 self.initiateIterator(
end.get(), meta_type);
484 while (!
end.get()->done()) ++
end;
487 py::arg(
"meta_type"), py::keep_alive<0, 1>())
488 .def(
"acquire_display_meta", [](BatchMetadata&
self) {
489 DisplayMetadata display_meta;
490 self.acquire(display_meta);
494 .def(
"acquire_frame_meta", [](BatchMetadata&
self) {
495 if (
self.isAudioBatch()) {
496 throw py::type_error(
"Use audio_frame_items to access audio frame metadata");
498 FrameMetadata frame_meta;
499 self.acquire(frame_meta);
503 .def(
"acquire_object_meta", [](BatchMetadata&
self) {
504 ObjectMetadata object_meta;
505 self.acquire(object_meta);
509 .def(
"acquire_event_message_meta", [](BatchMetadata&
self) {
510 EventMessageUserMetadata event_meta;
511 self.acquire(event_meta);
514 .def(
"acquire_preprocess_batch_meta", [](BatchMetadata&
self) {
515 PreprocessBatchUserMetadata preprocess_meta;
516 self.acquire(preprocess_meta);
517 return preprocess_meta;
519 .def(
"acquire_user_meta", [](BatchMetadata&
self) {
520 UserMetadata user_meta(
nullptr);
521 self.acquire(user_meta);
524 .def(
"acquire_obj_reid_meta", [](BatchMetadata&
self) {
525 ObjectReidUserMetadata reid_meta;
526 self.acquire(reid_meta);
529 .def(
"append", [](BatchMetadata&
self, py::object
object) {
530 if (py::isinstance<PreprocessBatchUserMetadata>(
object)) {
531 self.append(
object.cast<PreprocessBatchUserMetadata>());
533 throw py::type_error(
"Invalid type for BatchMetadata.append");
537 .def(
"__repr__", [](BatchMetadata&
self) {
538 std::string frame_items_repr =
"[]";
539 std::string audio_frame_items_repr =
"[]";
540 if (
self.isAudioBatch()) {
541 audio_frame_items_repr =
542 py::repr(generate_iterator<AudioFrameMetadata, BatchMetadata, AudioFrameMetadata::Iterator>(
self)).cast<std::string>();
545 py::repr(generate_iterator<FrameMetadata, BatchMetadata, FrameMetadata::Iterator>(
self)).cast<std::string>();
547 return "BatchMetadata(n_frames=" + std::to_string(
self.nFrames()) +
548 ", is_audio=" + std::string(
self.isAudioBatch() ?
"True" :
"False") +
549 ", frame_items=" + frame_items_repr +
550 ", audio_frame_items=" + audio_frame_items_repr +
551 ", preprocess_batch_items=" + py::repr(generate_usermeta_iterator<BatchMetadata, NVDS_PREPROCESS_BATCH_META>(
self)).cast<std::string>() +
")";
554 .def_property_readonly(
"frame_number", [](
const FrameMetadata&
self) {
555 return self.frameNum();
557 .def_property_readonly(
"pad_index", [](
const FrameMetadata&
self) {
558 return self.padIndex();
560 .def_property_readonly(
"batch_id", [](
const FrameMetadata&
self) {
561 return self.batchId();
563 .def_property_readonly(
"source_id", [](
const FrameMetadata&
self) {
564 return self.sourceId();
566 .def_property_readonly(
"source_width", [](
const FrameMetadata&
self) {
567 return self.sourceWidth();
569 .def_property_readonly(
"source_height", [](
const FrameMetadata&
self) {
570 return self.sourceHeight();
572 .def_property_readonly(
"pipeline_width", [](
const FrameMetadata&
self) {
573 return self.pipelineWidth();
575 .def_property_readonly(
"pipeline_height", [](
const FrameMetadata&
self) {
576 return self.pipelineHeight();
578 .def_property_readonly(
"buffer_pts", [](
const FrameMetadata&
self) {
579 return self.bufferPTS();
581 .def_property_readonly(
"ntp_timestamp", [](
const FrameMetadata&
self) {
582 return self.ntpTimestamp();
584 .def_property_readonly(
"object_items", [](FrameMetadata&
self) {
585 return generate_iterator<ObjectMetadata, FrameMetadata, ObjectMetadata::Iterator>(
self);
587 .def_property_readonly(
"tensor_items", [](FrameMetadata&
self) {
588 return generate_usermeta_iterator<FrameMetadata, NVDSINFER_TENSOR_OUTPUT_META>(
self);
590 .def_property_readonly(
"segmentation_items", [](FrameMetadata&
self) {
591 return generate_usermeta_iterator<FrameMetadata, NVDSINFER_SEGMENTATION_META>(
self);
593 .def_property_readonly(
"nvdsanalytics_frame_items", [](FrameMetadata&
self) {
594 return generate_usermeta_iterator<FrameMetadata, NVDS_USER_FRAME_META_NVDSANALYTICS>(
self);
596 .def(
"retrieve_structure_usermeta", [](FrameMetadata&
self,
const std::string& type_name){
597 return retrieve_structure_usermeta<FrameMetadata>(
self, type_name);
599 .def(
"user_meta_items", [](FrameMetadata&
self,
int meta_type) {
602 self.initiateIterator(begin.
get(), meta_type);
603 self.initiateIterator(
end.get(), meta_type);
604 while (!
end.get()->done()) ++
end;
607 py::arg(
"meta_type"), py::keep_alive<0, 1>())
608 .def(
"append", [](FrameMetadata&
self, py::object
object) {
609 if (py::isinstance<DisplayMetadata>(
object)){
610 self.append(
object.cast<DisplayMetadata>());
611 }
else if (py::isinstance<EventMessageUserMetadata>(
object)) {
612 self.append(
object.cast<EventMessageUserMetadata>());
613 }
else if (py::isinstance<ObjectMetadata>(
object)) {
614 self.append(
object.cast<ObjectMetadata>());
616 throw py::type_error(
"Invalid type for FrameMetadata.append");
619 .def(
"__repr__", [](FrameMetadata&
self) {
620 return "FrameMetadata(frame_number=" + std::to_string(
self.frameNum()) +
621 ", pad_index=" + std::to_string(
self.padIndex()) +
622 ", batch_id=" + std::to_string(
self.batchId()) +
623 ", source_id=" + std::to_string(
self.sourceId()) +
624 ", source_width=" + std::to_string(
self.sourceWidth()) +
625 ", source_height=" + std::to_string(
self.sourceHeight()) +
626 ", pipeline_width=" + std::to_string(
self.pipelineWidth()) +
627 ", pipeline_height=" + std::to_string(
self.pipelineHeight()) +
628 ", buffer_pts=" + std::to_string(
self.bufferPTS()) +
629 ", ntp_timestamp=" + std::to_string(
self.ntpTimestamp()) +
630 ", object_items=" + py::repr(generate_iterator<ObjectMetadata, FrameMetadata, ObjectMetadata::Iterator>(
self)).cast<std::string>() +
631 ", tensor_items=" + py::repr(generate_usermeta_iterator<FrameMetadata, NVDSINFER_TENSOR_OUTPUT_META>(
self)).cast<std::string>() +
632 ", segmentation_items=" + py::repr(generate_usermeta_iterator<FrameMetadata, NVDSINFER_SEGMENTATION_META>(
self)).cast<std::string>() +
633 ", nvdsanalytics_frame_items=" + py::repr(generate_usermeta_iterator<FrameMetadata, NVDS_USER_FRAME_META_NVDSANALYTICS>(
self)).cast<std::string>() +
")";
636 .def_property_readonly(
"frame_number", [](
const AudioFrameMetadata&
self) {
637 return self.frameNum();
639 .def_property_readonly(
"pad_index", [](
const AudioFrameMetadata&
self) {
640 return self.padIndex();
642 .def_property_readonly(
"batch_id", [](
const AudioFrameMetadata&
self) {
643 return self.batchId();
645 .def_property_readonly(
"source_id", [](
const AudioFrameMetadata&
self) {
646 return self.sourceId();
648 .def_property_readonly(
"sample_rate", [](
const AudioFrameMetadata&
self) {
649 return self.sampleRate();
651 .def_property_readonly(
"num_channels", [](
const AudioFrameMetadata&
self) {
652 return self.numChannels();
654 .def_property_readonly(
"num_samples_per_frame", [](
const AudioFrameMetadata&
self) {
655 return self.numSamplesPerFrame();
657 .def_property_readonly(
"format", [](
const AudioFrameMetadata&
self) {
658 return self.format();
660 .def_property_readonly(
"layout", [](
const AudioFrameMetadata&
self) {
661 return self.layout();
663 .def_property_readonly(
"buffer_pts", [](
const AudioFrameMetadata&
self) {
664 return self.bufferPTS();
666 .def_property_readonly(
"ntp_timestamp", [](
const AudioFrameMetadata&
self) {
667 return self.ntpTimestamp();
669 .def_property_readonly(
"infer_done", [](
const AudioFrameMetadata&
self) {
670 return self.inferDone();
672 .def_property_readonly(
"class_id", [](
const AudioFrameMetadata&
self) {
673 return self.classId();
675 .def_property_readonly(
"confidence", [](
const AudioFrameMetadata&
self) {
676 return self.confidence();
678 .def_property_readonly(
"class_label", [](
const AudioFrameMetadata&
self) {
679 return self.classLabel();
681 .def_property_readonly(
"classifier_items", [](AudioFrameMetadata&
self) {
682 return generate_iterator<ClassifierMetadata, AudioFrameMetadata, ClassifierMetadata::Iterator>(
self);
684 .def_property_readonly(
"tensor_items", [](AudioFrameMetadata&
self) {
685 return generate_usermeta_iterator<AudioFrameMetadata, NVDSINFER_TENSOR_OUTPUT_META>(
self);
687 .def(
"user_meta_items", [](AudioFrameMetadata&
self,
int meta_type) {
690 self.initiateIterator(begin.
get(), meta_type);
691 self.initiateIterator(
end.get(), meta_type);
692 while (!
end.get()->done()) ++
end;
695 py::arg(
"meta_type"), py::keep_alive<0, 1>())
696 .def(
"append", [](AudioFrameMetadata&
self, py::object
object) {
697 if (py::isinstance<EventMessageUserMetadata>(
object)) {
698 self.append(
object.cast<EventMessageUserMetadata>());
699 }
else if (py::isinstance<UserMetadata>(
object)) {
700 self.append(
object.cast<UserMetadata>());
702 throw py::type_error(
"Invalid type for AudioFrameMetadata.append");
705 .def(
"__repr__", [](AudioFrameMetadata&
self) {
706 return "AudioFrameMetadata(frame_number=" + std::to_string(
self.frameNum()) +
707 ", pad_index=" + std::to_string(
self.padIndex()) +
708 ", batch_id=" + std::to_string(
self.batchId()) +
709 ", source_id=" + std::to_string(
self.sourceId()) +
710 ", sample_rate=" + std::to_string(
self.sampleRate()) +
711 ", num_channels=" + std::to_string(
self.numChannels()) +
712 ", num_samples_per_frame=" + std::to_string(
self.numSamplesPerFrame()) +
713 ", class_id=" + std::to_string(
self.classId()) +
714 ", class_label=" + (
self.classLabel().empty() ?
"''" :
self.classLabel()) +
715 ", confidence=" + std::to_string(
self.confidence()) +
716 ", classifier_items=" + py::repr(generate_iterator<ClassifierMetadata, AudioFrameMetadata, ClassifierMetadata::Iterator>(
self)).cast<std::string>() +
")";
719 .def_property_readonly(
"n_rects", [](
const DisplayMetadata&
self) {
720 return self.nRects();
722 .def_property_readonly(
"n_labels", [](
const DisplayMetadata&
self) {
723 return self.nLabels();
725 .def_property_readonly(
"n_lines", [](
const DisplayMetadata&
self) {
726 return self.nLines();
728 .def_property_readonly(
"n_arrows", [](
const DisplayMetadata&
self) {
729 return self.nArrows();
731 .def_property_readonly(
"n_circles", [](
const DisplayMetadata&
self) {
732 return self.nCircles();
734 .def(
"add_text", [](DisplayMetadata&
self,
Text& item) {
749 .def(
"__repr__", [](DisplayMetadata&
self) {
750 return "DisplayMetadata(n_rects=" + std::to_string(
self.nRects()) +
751 ", n_labels=" + std::to_string(
self.nLabels()) +
752 ", n_lines=" + std::to_string(
self.nLines()) +
753 ", n_arrows=" + std::to_string(
self.nArrows()) +
754 ", n_circles=" + std::to_string(
self.nCircles()) +
")";
757 .def_property_readonly(
"label", &LabelInfo::label)
758 .def_property_readonly(
"class_id", &LabelInfo::classId)
759 .def_property_readonly(
"prob", &LabelInfo::prob)
760 .def_property_readonly(
"label_id", &LabelInfo::labelId)
761 .def_property_readonly(
"num_classes", &LabelInfo::numClasses)
762 .def(
"__repr__", [](LabelInfo&
self) {
763 return "LabelInfo(label=" +
self.label() +
764 ", class_id=" + std::to_string(
self.classId()) +
765 ", prob=" + std::to_string(
self.prob()) +
766 ", label_id=" + std::to_string(
self.labelId()) +
767 ", num_classes=" + std::to_string(
self.numClasses()) +
")";
770 .def_property_readonly(
"n_labels", &ClassifierMetadata::nLabels)
771 .def_property_readonly(
"unique_component_id", &ClassifierMetadata::uniqueComponentId)
775 .def(
"__repr__", [](ClassifierMetadata&
self) {
776 return "ClassifierMetadata(n_labels=" + std::to_string(
self.nLabels()) +
777 ", unique_component_id=" + std::to_string(
self.uniqueComponentId()) +
778 ", classifier_type=" +
self.classifierType() +
")";
781 .def_property(
"class_id", &ObjectMetadata::classId, &ObjectMetadata::setClassId)
782 .def_property(
"object_id", &ObjectMetadata::objectId, &ObjectMetadata::setObjectId)
783 .def_property(
"unique_component_id", &ObjectMetadata::uniqueComponentId, &ObjectMetadata::setUniqueComponentId)
784 .def_property(
"confidence", &ObjectMetadata::confidence, &ObjectMetadata::setConfidence)
785 .def_property(
"tracker_confidence", &ObjectMetadata::trackerConfidence, &ObjectMetadata::setTrackerConfidence)
786 .def_property(
"rect_params", &ObjectMetadata::rectParams, &ObjectMetadata::setRectParams, py::return_value_policy::reference_internal)
787 .def_property(
"mask_params", &ObjectMetadata::maskParams, &ObjectMetadata::setMaskParams, py::return_value_policy::reference_internal)
788 .def_property(
"text_params", &ObjectMetadata::textParams, &ObjectMetadata::setTextParams, py::return_value_policy::reference_internal)
789 .def_property(
"label", &ObjectMetadata::label, &ObjectMetadata::setLabel)
790 .def_property_readonly(
"classifier_items", [](ObjectMetadata&
self) {
791 return generate_iterator<ClassifierMetadata, ObjectMetadata, ClassifierMetadata::Iterator>(
self);
793 .def_property_readonly(
"tensor_items", [](ObjectMetadata&
self) {
794 return generate_usermeta_iterator<ObjectMetadata, NVDSINFER_TENSOR_OUTPUT_META>(
self);
796 .def_property_readonly(
"nvdsanalytics_obj_items", [](ObjectMetadata&
self) {
797 return generate_usermeta_iterator<ObjectMetadata, NVDS_USER_OBJ_META_NVDSANALYTICS>(
self);
799 .def_property_readonly(
"obj_reid_items", [](ObjectMetadata&
self) {
800 return generate_usermeta_iterator<ObjectMetadata, NVDS_TRACKER_OBJ_REID_META>(
self);
802 .def(
"user_meta_items", [](ObjectMetadata&
self,
int meta_type) {
805 self.initiateIterator(begin.
get(), meta_type);
806 self.initiateIterator(
end.get(), meta_type);
807 while (!
end.get()->done()) ++
end;
810 py::arg(
"meta_type"), py::keep_alive<0, 1>())
811 .def(
"append", [](ObjectMetadata&
self, UserMetadata& user_meta) {
812 self.append(user_meta);
814 .def_property(
"nv_bbox_info", [](
const ObjectMetadata&
self) {
819 d[
"width"] = b.
width;
822 }, [](ObjectMetadata&
self, py::dict d) {
824 b.
left = d[
"left"].cast<
float>();
825 b.
top = d[
"top"].cast<
float>();
826 b.
width = d[
"width"].cast<
float>();
827 b.
height = d[
"height"].cast<
float>();
828 self.setNvBboxInfo(b);
830 .def(
"__repr__", [](ObjectMetadata&
self) {
831 return "ObjectMetadata(class_id=" + std::to_string(
self.classId()) +
832 ", object_id=" + std::to_string(
self.objectId()) +
833 ", unique_component_id=" + std::to_string(
self.uniqueComponentId()) +
834 ", confidence=" + std::to_string(
self.confidence()) +
835 ", rect_params=" + py::repr(py::cast(
self.rectParams())).cast<std::string>() +
836 ", mask_params=" + py::repr(py::cast(
self.maskParams())).cast<std::string>() +
837 ", text_params=" + [&]() {
839 if (text_ptr ==
nullptr) {
840 return std::string(
"Text(null)");
846 return "Text(display_text='" + display_text_str +
847 "', x_offset=" + std::to_string(text.
x_offset) +
848 ", y_offset=" + std::to_string(text.
y_offset) +
849 ", font_name='" + font_name_str +
851 ", bg_color=" + py::repr(py::cast(text.
text_bg_clr)).cast<std::string>() +
")";
853 ", label=" + (
self.label().empty() ?
"''" :
self.label()) +
854 ", classifier_items=" + py::repr(generate_iterator<ClassifierMetadata, ObjectMetadata, ClassifierMetadata::Iterator>(
self)).cast<std::string>() +
855 ", tensor_items=" + py::repr(generate_usermeta_iterator<ObjectMetadata, NVDSINFER_TENSOR_OUTPUT_META>(
self)).cast<std::string>() +
856 ", nvdsanalytics_obj_items=" + py::repr(generate_usermeta_iterator<ObjectMetadata, NVDS_USER_OBJ_META_NVDSANALYTICS>(
self)).cast<std::string>() +
")";
859 .def_property(
"meta_type", &UserMetadata::metaType, &UserMetadata::setMetaType)
860 .def(
"set_user_data_json", [](UserMetadata&
self, py::object obj,
int meta_type) {
862 py::module_
json = py::module_::import(
"json");
863 py::str json_str =
json.attr(
"dumps")(obj);
864 std::string str = json_str.cast<std::string>();
866 char* c_str = strdup(str.c_str());
868 self.setMetaType(meta_type);
870 py::arg(
"data"), py::arg(
"meta_type"))
871 .def(
"get_user_data_json", [](UserMetadata&
self) -> py::object {
872 void*
data =
self.userData();
874 const char* json_str =
static_cast<const char*
>(
data);
876 py::module_
json = py::module_::import(
"json");
877 return json.attr(
"loads")(py::str(json_str));
881 .def(
"as_tensor_output", [](UserMetadata&
self) {
882 return TensorOutputUserMetadata(
self);
884 .def(
"as_segmentation", [](UserMetadata&
self) {
885 return SegmentationUserMetadata(
self);
887 .def(
"as_preprocess_batch", [](UserMetadata&
self) {
888 return PreprocessBatchUserMetadata(
self);
890 .def(
"as_nvdsanalytics_obj", [](UserMetadata&
self) {
891 return AnalyticsObjInfo(
self);
893 .def(
"as_nvdsanalytics_frame", [](UserMetadata&
self) {
894 return AnalyticsFrameMeta(
self);
896 .def(
"as_structure_str", [](UserMetadata&
self) -> std::string {
897 StructureUserMetadata meta(
self);
898 const auto *structure = (
const GstStructure*)meta.getStructureUserMetadata();
899 if (!structure)
return "";
902 auto name = gst_structure_get_name(structure);
903 if (name ==
nullptr)
return "";
906 GstStructure *converted = gst_structure_new_empty(name);
907 gint n_fields = gst_structure_n_fields(structure);
908 for (gint i = 0; i < n_fields; i++) {
909 const gchar *field_name = gst_structure_nth_field_name(structure, i);
910 const GValue *value = gst_structure_get_value(structure, field_name);
911 if (value && G_VALUE_TYPE(value) == G_TYPE_POINTER) {
913 gpointer ptr = g_value_get_pointer(value);
914 guint64 ptr_as_uint64 = (guint64)(uintptr_t)ptr;
915 gst_structure_set(converted, field_name, G_TYPE_UINT64, ptr_as_uint64, NULL);
918 gst_structure_set_value(converted, field_name, value);
922 gchar* str = gst_structure_to_string(converted);
923 gst_structure_free(converted);
926 std::string result(str);
930 .def(
"as_obj_reid", [](UserMetadata&
self) {
931 return ObjectReidUserMetadata(
self);
933 .def(
"__bool__", [](UserMetadata&
self) {
return (
bool)
self; });
935 .def_property_readonly(
"feature_size", &ObjectReidUserMetadata::featureSize)
936 .def_property_readonly(
"feature_vector", [](ObjectReidUserMetadata&
self) {
937 const float*
data =
self.featureVector();
938 unsigned int size =
self.featureSize();
940 return py::array_t<float>();
942 return py::array_t<float>(
948 .def(
"set_feature_vector", [](ObjectReidUserMetadata&
self, py::array_t<float> features) {
949 auto buf = features.request();
951 throw std::runtime_error(
"Feature vector must be 1-dimensional");
953 self.setFeatureVector(
static_cast<float*
>(buf.ptr), buf.shape[0]);
956 .def(
"__repr__", [](ObjectReidUserMetadata&
self) {
957 return "ObjectReidUserMetadata(feature_size=" + std::to_string(
self.featureSize()) +
")";
960 .def(
"generate", [](EventMessageUserMetadata&
self,
961 const ObjectMetadata& object_meta,
962 const FrameMetadata& frame_meta,
963 const std::string& sensor,
964 const std::string& uri,
965 const std::vector<std::string>& labels) {
966 self.generate(object_meta, frame_meta, sensor, uri, labels);
968 py::arg(
"object_meta"), py::arg(
"frame_meta"), py::arg(
"sensor")=
"N/A", py::arg(
"uri")=
"N/A", py::arg(
"labels")=std::vector<std::string>())
969 .def(
"generate", [](EventMessageUserMetadata&
self,
970 const AudioFrameMetadata& audio_frame_meta,
971 const std::string& sensor,
972 const std::string& uri) {
973 self.generate(audio_frame_meta, sensor, uri);
975 py::arg(
"audio_frame_meta"), py::arg(
"sensor")=
"N/A", py::arg(
"uri")=
"N/A");
977 .def_property_readonly(
"unique_id", [](
const TensorOutputUserMetadata&
self) {
978 return self.uniqueId();
980 .def(
"get_layers", [](TensorOutputUserMetadata&
self) {
981 std::unordered_map<std::string, TensorWrapper> outputs;
982 auto layers =
self.getLayers();
983 for (
auto it = layers.begin(); it != layers.end(); it++) {
984 outputs[it->first] = TensorWrapper(it->second);
988 .def(
"__repr__", [](TensorOutputUserMetadata&
self) {
989 return "TensorOutputUserMetadata(unique_id=" + std::to_string(
self.uniqueId()) +
")";
992 .def_property_readonly(
"unique_id", [](
const SegmentationUserMetadata&
self) {
993 return self.uniqueId();
995 .def_property_readonly(
"classes", [](SegmentationUserMetadata&
self) {
996 return self.getClasses();
998 .def_property_readonly(
"width", [](SegmentationUserMetadata&
self) {
999 return self.getWidth();
1001 .def_property_readonly(
"height", [](SegmentationUserMetadata&
self) {
1002 return self.getHeight();
1004 .def_property_readonly(
"class_map", [](SegmentationUserMetadata&
self) {
1005 const int*
data =
self.getClassMap();
1007 return py::array_t<int>();
1009 return py::array_t<int>(
1010 {
self.getHeight(),
self.getWidth()},
1011 {
self.getWidth() *
sizeof(
int),
sizeof(
int)},
1015 .def_property_readonly(
"class_probabilities_map", [](SegmentationUserMetadata&
self) {
1016 const float*
data =
self.getClassProbabilitiesMap();
1018 return py::array_t<float>();
1020 return py::array_t<float>(
1021 {
self.getHeight(),
self.getWidth(),
self.getClasses()},
1022 {
self.getWidth() *
self.getClasses() *
sizeof(
float),
self.getClasses() *
sizeof(
float),
sizeof(
float)},
1026 .def(
"__repr__", [](SegmentationUserMetadata&
self) {
1027 const int* class_map_data =
self.getClassMap();
1028 py::array_t<int> class_map;
1029 if (!class_map_data) {
1030 class_map = py::array_t<int>();
1032 class_map = py::array_t<int>(
1033 {
self.getHeight(),
self.getWidth()},
1034 {
self.getWidth() *
sizeof(
int),
sizeof(
int)},
1038 const float* class_probabilities_map_data =
self.getClassProbabilitiesMap();
1039 py::array_t<float> class_probabilities_map;
1040 if (!class_probabilities_map_data) {
1041 class_probabilities_map = py::array_t<float>();
1043 class_probabilities_map = py::array_t<float>(
1044 {
self.getHeight(),
self.getWidth(),
self.getClasses()},
1045 {
self.getWidth() *
self.getClasses() *
sizeof(
float),
self.getClasses() *
sizeof(
float),
sizeof(
float)},
1046 class_probabilities_map_data
1050 return "SegmentationUserMetadata(unique_id=" + std::to_string(
self.uniqueId()) +
1051 ", classes=" + std::to_string(
self.getClasses()) +
1052 ", width=" + std::to_string(
self.getWidth()) +
1053 ", height=" + std::to_string(
self.getHeight()) +
1054 ", class_map=" + py::repr(class_map).cast<std::string>() +
1055 ", class_probabilities_map=" + py::repr(class_probabilities_map).cast<std::string>() +
")";
1058 .def_property_readonly(
"roi", [](
const RoiMetadata&
self) {
1059 return self.rectParams();
1061 .def_property_readonly(
"frame_meta", [](
const RoiMetadata&
self) {
1062 return self.frameMetadata();
1064 .def_property_readonly(
"tensor_items", [](RoiMetadata&
self) {
1065 return generate_usermeta_iterator<RoiMetadata, NVDSINFER_TENSOR_OUTPUT_META>(
self);
1067 .def_property_readonly(
"classifier_items", [](RoiMetadata&
self) {
1068 return generate_iterator<ClassifierMetadata, RoiMetadata, ClassifierMetadata::Iterator>(
self);
1070 .def_property_readonly(
"segmentation_items", [](RoiMetadata&
self) {
1071 return generate_usermeta_iterator<RoiMetadata, NVDSINFER_SEGMENTATION_META>(
self);
1073 .def_property_readonly(
"object_meta", [](
const RoiMetadata&
self) {
1074 return self.objectMetadata();
1076 .def(
"__repr__", [](RoiMetadata&
self) {
1077 std::string object_meta_str =
"null";
1078 auto object_meta =
self.objectMetadata();
1080 object_meta_str = py::repr(py::cast(object_meta)).cast<std::string>();
1082 return "RoiMetadata(roi=" + py::repr(py::cast(
self.rectParams())).cast<std::string>() +
1083 ", frame_meta=" + py::repr(py::cast(
self.frameMetadata())).cast<std::string>() +
1084 ", classifier_items=" + py::repr(generate_iterator<ClassifierMetadata, RoiMetadata, ClassifierMetadata::Iterator>(
self)).cast<std::string>() +
1085 ", segmentation_items=" + py::repr(generate_usermeta_iterator<RoiMetadata, NVDSINFER_SEGMENTATION_META>(
self)).cast<std::string>() +
1086 ", object_meta=" + object_meta_str +
")";
1089 .def_property_readonly(
"name", [](PreprocessTensorMetadata&
self) {
1090 return self.getName();
1092 .def_property_readonly(
"meta_id", [](PreprocessTensorMetadata&
self) {
1093 return self.getMetaId();
1095 .def_property_readonly(
"tensor", [](PreprocessTensorMetadata&
self) {
1098 .def(
"__repr__", [](PreprocessTensorMetadata&
self) {
1099 std::string tensor_str =
"null";
1100 std::unique_ptr<Tensor> tensor_ptr(
self.getTensor());
1101 if (tensor_ptr !=
nullptr) {
1103 tensor_str = py::repr(py::cast(temp_wrapper, py::return_value_policy::reference)).cast<std::string>();
1106 return "PreprocessTensorMetadata(name=" +
self.getName() +
1107 ", meta_id=" + std::to_string(
self.getMetaId()) +
1108 ", tensor=" + tensor_str +
")";
1111 .def_property_readonly(
"rois", [](PreprocessBatchUserMetadata&
self) {
1112 return self.getRois();
1114 .def_property_readonly(
"preprocess_tensor_meta", [](PreprocessBatchUserMetadata&
self) {
1115 return self.getPreprocessTensorMetadata();
1117 .def(
"set_preprocessed_tensor", [](PreprocessBatchUserMetadata&
self, std::string name,
unsigned int meta_id,
unsigned int unique_id,
TensorWrapper& tensor) {
1118 self.initPreprocessTensorMetadata(name, meta_id, unique_id, tensor.
release());
1121 py::arg(
"max_items"))
1122 .def(
"__repr__", [](PreprocessBatchUserMetadata&
self) {
1123 std::string preprocess_tensor_meta_str =
"null";
1124 auto preprocess_tensor_meta =
self.getPreprocessTensorMetadata();
1125 if (preprocess_tensor_meta) {
1126 preprocess_tensor_meta_str = py::repr(py::cast(preprocess_tensor_meta)).cast<std::string>();
1128 return "PreprocessBatchUserMetadata(rois=" + py::repr(py::cast(
self.getRois())).cast<std::string>() +
1129 ", preprocess_tensor_meta=" + preprocess_tensor_meta_str +
")";
1132 .def_property_readonly(
"roi_status", [](AnalyticsObjInfo&
self) {
1133 return self.getRoiStatus();
1135 .def_property_readonly(
"oc_status", [](AnalyticsObjInfo&
self) {
1136 return self.getOcStatus();
1138 .def_property_readonly(
"lc_status", [](AnalyticsObjInfo&
self) {
1139 return self.getLcStatus();
1141 .def_property_readonly(
"dir_status", [](AnalyticsObjInfo&
self) {
1142 return self.getDirStatus();
1144 .def_property_readonly(
"unique_id", [](AnalyticsObjInfo&
self) {
1145 return self.getUniqueId();
1147 .def_property_readonly(
"obj_status", [](AnalyticsObjInfo&
self) {
1148 return self.getObjStatus();
1150 .def(
"__repr__", [](AnalyticsObjInfo&
self) {
1151 return "AnalyticsObjInfo(roi_status=" + py::repr(py::cast(
self.getRoiStatus())).cast<std::string>() +
1152 ", oc_status=" + py::repr(py::cast(
self.getOcStatus())).cast<std::string>() +
1153 ", lc_status=" + py::repr(py::cast(
self.getLcStatus())).cast<std::string>() +
1154 ", dir_status=" +
self.getDirStatus() +
1155 ", unique_id=" + std::to_string(
self.getUniqueId()) +
1156 ", obj_status=" +
self.getObjStatus() +
")";
1159 .def_property_readonly(
"oc_status", [](AnalyticsFrameMeta&
self) {
1160 return self.getOcStatus();
1162 .def_property_readonly(
"obj_in_roi_cnt", [](AnalyticsFrameMeta&
self) {
1163 return self.getObjInROIcnt();
1165 .def_property_readonly(
"obj_lc_curr_cnt", [](AnalyticsFrameMeta&
self) {
1166 return self.getObjLCCurrCnt();
1168 .def_property_readonly(
"obj_lc_cum_cnt", [](AnalyticsFrameMeta&
self) {
1169 return self.getObjLCCumCnt();
1171 .def_property_readonly(
"unique_id", [](AnalyticsFrameMeta&
self) {
1172 return self.getUniqueId();
1174 .def_property_readonly(
"obj_cnt", [](AnalyticsFrameMeta&
self) {
1175 return self.getObjCnt();
1177 .def(
"__repr__", [](AnalyticsFrameMeta&
self) {
1178 return "AnalyticsFrameMeta(oc_status=" + py::repr(py::cast(
self.getOcStatus())).cast<std::string>() +
1179 ", obj_in_roi_cnt=" + py::repr(py::cast(
self.getObjInROIcnt())).cast<std::string>() +
1180 ", obj_lc_curr_cnt=" + py::repr(py::cast(
self.getObjLCCurrCnt())).cast<std::string>() +
1181 ", obj_lc_cum_cnt=" + py::repr(py::cast(
self.getObjLCCumCnt())).cast<std::string>() +
1182 ", unique_id=" + std::to_string(
self.getUniqueId()) +
1183 ", obj_cnt=" + py::repr(py::cast(
self.getObjCnt())).cast<std::string>() +
")";
1185 py::class_<ObjectVisibilityUserMetadata, UserMetadata>(m,
"ObjectVisibilityUserMetadata")
1186 .def(py::init<const UserMetadata&>())
1187 .def_property_readonly(
"visibility", &ObjectVisibilityUserMetadata::getVisibility);
1188 py::class_<ObjectImageFootLocationUserMetadata, UserMetadata>(m,
"ObjectImageFootLocationUserMetadata")
1189 .def(py::init<const UserMetadata&>())
1190 .def_property_readonly(
"image_foot_location", [](ObjectImageFootLocationUserMetadata&
self) {
1191 auto loc =
self.getImageFootLocation();
1194 d[
"y"] = loc.second;
1197 py::class_<ObjectWorldFootLocationUserMetadata, UserMetadata>(m,
"ObjectWorldFootLocationUserMetadata")
1198 .def(py::init<const UserMetadata&>())
1199 .def_property_readonly(
"world_foot_location", [](ObjectWorldFootLocationUserMetadata&
self) {
1200 auto loc =
self.getWorldFootLocation();
1203 d[
"y"] = loc.second;
1206 py::class_<ObjectConvexHullUserMetadata, UserMetadata>(m,
"ObjectConvexHullUserMetadata")
1207 .def(py::init<const UserMetadata&>())
1208 .def_property_readonly(
"convex_hull", [](ObjectConvexHullUserMetadata&
self) {
1210 for (
auto& pt :
self.getConvexHull()) {
1211 points.append(py::make_tuple(pt.first, pt.second));
1215 py::class_<Object3DBBoxUserMetadata, UserMetadata>(m,
"Object3DBBoxUserMetadata")
1216 .def(py::init<const UserMetadata&>())
1217 .def_property_readonly(
"bbox_3d", [](Object3DBBoxUserMetadata&
self) {
1220 if (!bbox)
return d;
1221 d[
"x_centre"] = bbox->
xCentre;
1222 d[
"y_centre"] = bbox->
yCentre;
1223 d[
"z_centre"] = bbox->
zCentre;
1224 d[
"x_len"] = bbox->
xLen;
1225 d[
"y_len"] = bbox->
yLen;
1226 d[
"z_len"] = bbox->
zLen;
1227 d[
"x_rot"] = bbox->
xRot;
1228 d[
"y_rot"] = bbox->
yRot;
1229 d[
"z_rot"] = bbox->
zRot;
1230 d[
"x_vel"] = bbox->
xVel;
1231 d[
"y_vel"] = bbox->
yVel;
1232 d[
"z_vel"] = bbox->
zVel;
1235 py::class_<TrackerPastFrameUserMetadata, UserMetadata>(m,
"TrackerPastFrameUserMetadata")
1236 .def(py::init<const UserMetadata&>())
1237 .def_property_readonly(
"past_frame_data", [](TrackerPastFrameUserMetadata&
self) {
1240 if (!batch)
return streams;
1241 for (uint32_t si = 0; si < batch->
numFilled; si++) {
1244 for (uint32_t li = 0; li < s->
numFilled; li++) {
1247 for (uint32_t oi = 0; oi < obj->
numObj; oi++) {
1259 fd[
"tracker_state"] =
static_cast<int>(f->
trackerState);
1266 od[
"label"] = std::string(obj->
objLabel);
1267 od[
"frames"] = frames;
1272 sd[
"objects"] = objects;