matrice 1.0.99392__tar.gz → 1.0.99394__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. {matrice-1.0.99392/src/matrice.egg-info → matrice-1.0.99394}/PKG-INFO +1 -1
  2. {matrice-1.0.99392 → matrice-1.0.99394}/setup.py +1 -1
  3. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/vehicle_monitoring.py +159 -129
  4. {matrice-1.0.99392 → matrice-1.0.99394/src/matrice.egg-info}/PKG-INFO +1 -1
  5. {matrice-1.0.99392 → matrice-1.0.99394}/LICENSE.txt +0 -0
  6. {matrice-1.0.99392 → matrice-1.0.99394}/README.md +0 -0
  7. {matrice-1.0.99392 → matrice-1.0.99394}/setup.cfg +0 -0
  8. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/__init__.py +0 -0
  9. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/action.py +0 -0
  10. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/actionTracker.py +0 -0
  11. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/action_tracker.py +0 -0
  12. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/annotation.py +0 -0
  13. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/app_store.py +0 -0
  14. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/application.py +0 -0
  15. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/compute.py +0 -0
  16. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/compute_manager/__init__.py +0 -0
  17. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/compute_manager/action_instance.py +0 -0
  18. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/compute_manager/actions_manager.py +0 -0
  19. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/compute_manager/actions_scaledown_manager.py +0 -0
  20. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/compute_manager/instance_manager.py +0 -0
  21. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/compute_manager/instance_utils.py +0 -0
  22. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/compute_manager/prechecks.py +0 -0
  23. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/compute_manager/resources_tracker.py +0 -0
  24. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/compute_manager/scaling.py +0 -0
  25. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/compute_manager/shutdown_manager.py +0 -0
  26. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/compute_manager/task_utils.py +0 -0
  27. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/__init__.py +0 -0
  28. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/aug_server.py +0 -0
  29. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/aug_server_v2.py +0 -0
  30. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/__init__.py +0 -0
  31. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/base.py +0 -0
  32. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/__init__.py +0 -0
  33. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/bit_depth_reduction.py +0 -0
  34. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/blur.py +0 -0
  35. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/brightness_contrast.py +0 -0
  36. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/color_jitter.py +0 -0
  37. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/compression_artifacts.py +0 -0
  38. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/downscale_upscale.py +0 -0
  39. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/film_grain.py +0 -0
  40. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/flip.py +0 -0
  41. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/fog.py +0 -0
  42. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/horizontal_flip.py +0 -0
  43. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/hsv.py +0 -0
  44. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/iso_noise.py +0 -0
  45. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/low_light.py +0 -0
  46. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/posterize.py +0 -0
  47. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/rain.py +0 -0
  48. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/random_affine.py +0 -0
  49. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/salt_pepper.py +0 -0
  50. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/shadows.py +0 -0
  51. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/snow.py +0 -0
  52. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/speckle.py +0 -0
  53. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/augmentation_utils/strategies/sunflare.py +0 -0
  54. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/client.py +0 -0
  55. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/client_utils.py +0 -0
  56. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/create_dataset.py +0 -0
  57. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_augmentation.py +0 -0
  58. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_augmentor.py +0 -0
  59. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/__init__.py +0 -0
  60. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/imagenet_classification.py +0 -0
  61. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/labelbox_classification.py +0 -0
  62. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/labelbox_detection.py +0 -0
  63. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/mscoco_detection.py +0 -0
  64. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/pascalvoc_detection.py +0 -0
  65. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/unlabelled.py +0 -0
  66. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/video_davis_segmentation.py +0 -0
  67. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/video_detection_mscoco.py +0 -0
  68. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/video_imagenet_classification.py +0 -0
  69. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/video_kinetics_activity_recognition.py +0 -0
  70. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/video_mot_tracking.py +0 -0
  71. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/video_mscoco_detection.py +0 -0
  72. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/video_youtube_bb_tracking.py +0 -0
  73. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_formats/yolo_detection.py +0 -0
  74. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_labelling.py +0 -0
  75. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_prep.py +0 -0
  76. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/data_processor.py +0 -0
  77. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/image_augmentations.py +0 -0
  78. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/image_data_augmentation.py +0 -0
  79. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/new_data_augmentation.py +0 -0
  80. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/pipeline.py +0 -0
  81. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/server.py +0 -0
  82. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/server_utils.py +0 -0
  83. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/data_processing/video_server.py +0 -0
  84. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/dataset.py +0 -0
  85. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/__init__.py +0 -0
  86. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/aggregator/__init__.py +0 -0
  87. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/aggregator/aggregator.py +0 -0
  88. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/aggregator/analytics.py +0 -0
  89. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/aggregator/ingestor.py +0 -0
  90. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/aggregator/pipeline.py +0 -0
  91. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/aggregator/publisher.py +0 -0
  92. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/aggregator/synchronizer.py +0 -0
  93. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/client/__init__.py +0 -0
  94. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/client/auto_streaming/__init__.py +0 -0
  95. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/client/auto_streaming/auto_streaming.py +0 -0
  96. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/client/auto_streaming/auto_streaming_utils.py +0 -0
  97. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/client/client.py +0 -0
  98. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/client/client_stream_utils.py +0 -0
  99. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/client/client_utils.py +0 -0
  100. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/client/streaming_gateway/__init__.py +0 -0
  101. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/client/streaming_gateway/streaming_gateway.py +0 -0
  102. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/client/streaming_gateway/streaming_gateway_utils.py +0 -0
  103. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/client/streaming_gateway/streaming_results_handler.py +0 -0
  104. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/optimize/__init__.py +0 -0
  105. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/optimize/cache_manager.py +0 -0
  106. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/optimize/frame_comparators.py +0 -0
  107. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/optimize/frame_difference.py +0 -0
  108. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/optimize/transmission.py +0 -0
  109. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/__init__.py +0 -0
  110. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/inference/__init__.py +0 -0
  111. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/inference/batch_manager.py +0 -0
  112. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/inference/inference_interface.py +0 -0
  113. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/inference/model_manager.py +0 -0
  114. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/inference/triton_utils.py +0 -0
  115. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/proxy/__init__.py +0 -0
  116. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/proxy/proxy_interface.py +0 -0
  117. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/proxy/proxy_utils.py +0 -0
  118. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/server.py +0 -0
  119. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/stream/__init__.py +0 -0
  120. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/stream/inference_worker.py +0 -0
  121. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/stream/kafka_consumer_worker.py +0 -0
  122. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/stream/kafka_producer_worker.py +0 -0
  123. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/stream/stream_debug_logger.py +0 -0
  124. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/stream/stream_manager.py +0 -0
  125. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/server/stream/video_buffer.py +0 -0
  126. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/stream/__init__.py +0 -0
  127. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/stream/kafka_stream.py +0 -0
  128. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/stream/redis_stream.py +0 -0
  129. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/__init__.py +0 -0
  130. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/boundary_drawing_internal/__init__.py +0 -0
  131. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/boundary_drawing_internal/boundary_drawing_internal.py +0 -0
  132. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/boundary_drawing_internal/boundary_drawing_tool.py +0 -0
  133. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/boundary_drawing_internal/example_usage.py +0 -0
  134. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/__init__.py +0 -0
  135. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/advanced_tracker/__init__.py +0 -0
  136. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/advanced_tracker/base.py +0 -0
  137. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/advanced_tracker/config.py +0 -0
  138. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/advanced_tracker/kalman_filter.py +0 -0
  139. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/advanced_tracker/matching.py +0 -0
  140. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/advanced_tracker/strack.py +0 -0
  141. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/advanced_tracker/tracker.py +0 -0
  142. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/config.py +0 -0
  143. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/core/__init__.py +0 -0
  144. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/core/base.py +0 -0
  145. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/core/config.py +0 -0
  146. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/core/config_utils.py +0 -0
  147. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/ocr/__init__.py +0 -0
  148. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/ocr/easyocr_extractor.py +0 -0
  149. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/ocr/postprocessing.py +0 -0
  150. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/ocr/preprocessing.py +0 -0
  151. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/processor.py +0 -0
  152. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/test_cases/__init__.py +0 -0
  153. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/test_cases/run_tests.py +0 -0
  154. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/test_cases/test_advanced_customer_service.py +0 -0
  155. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/test_cases/test_basic_counting_tracking.py +0 -0
  156. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/test_cases/test_comprehensive.py +0 -0
  157. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/test_cases/test_config.py +0 -0
  158. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/test_cases/test_customer_service.py +0 -0
  159. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/test_cases/test_data_generators.py +0 -0
  160. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/test_cases/test_people_counting.py +0 -0
  161. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/test_cases/test_processor.py +0 -0
  162. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/test_cases/test_utilities.py +0 -0
  163. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/test_cases/test_utils.py +0 -0
  164. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/Histopathological_Cancer_Detection_img.py +0 -0
  165. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/__init__.py +0 -0
  166. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/abandoned_object_detection.py +0 -0
  167. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/advanced_customer_service.py +0 -0
  168. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/age_detection.py +0 -0
  169. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/anti_spoofing_detection.py +0 -0
  170. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/assembly_line_detection.py +0 -0
  171. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/banana_defect_detection.py +0 -0
  172. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/basic_counting_tracking.py +0 -0
  173. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/blood_cancer_detection_img.py +0 -0
  174. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/car_damage_detection.py +0 -0
  175. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/car_part_segmentation.py +0 -0
  176. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/car_service.py +0 -0
  177. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/cardiomegaly_classification.py +0 -0
  178. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/chicken_pose_detection.py +0 -0
  179. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/child_monitoring.py +0 -0
  180. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/color_detection.py +0 -0
  181. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/color_map_utils.py +0 -0
  182. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/concrete_crack_detection.py +0 -0
  183. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/crop_weed_detection.py +0 -0
  184. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/customer_service.py +0 -0
  185. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/defect_detection_products.py +0 -0
  186. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/distracted_driver_detection.py +0 -0
  187. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/drowsy_driver_detection.py +0 -0
  188. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/emergency_vehicle_detection.py +0 -0
  189. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/face_emotion.py +0 -0
  190. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/face_recognition.py +0 -0
  191. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/fashion_detection.py +0 -0
  192. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/field_mapping.py +0 -0
  193. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/fire_detection.py +0 -0
  194. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/flare_analysis.py +0 -0
  195. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/flower_segmentation.py +0 -0
  196. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/gas_leak_detection.py +0 -0
  197. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/gender_detection.py +0 -0
  198. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/human_activity_recognition.py +0 -0
  199. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/intrusion_detection.py +0 -0
  200. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/leaf.py +0 -0
  201. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/leaf_disease.py +0 -0
  202. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/leak_detection.py +0 -0
  203. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/license_plate_detection.py +0 -0
  204. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/license_plate_monitoring.py +0 -0
  205. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/litter_monitoring.py +0 -0
  206. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/mask_detection.py +0 -0
  207. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/parking.py +0 -0
  208. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/parking_space_detection.py +0 -0
  209. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/pedestrian_detection.py +0 -0
  210. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/people_counting.py +0 -0
  211. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/pipeline_detection.py +0 -0
  212. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/plaque_segmentation_img.py +0 -0
  213. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/pothole_segmentation.py +0 -0
  214. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/ppe_compliance.py +0 -0
  215. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/price_tag_detection.py +0 -0
  216. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/proximity_detection.py +0 -0
  217. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/road_lane_detection.py +0 -0
  218. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/road_traffic_density.py +0 -0
  219. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/road_view_segmentation.py +0 -0
  220. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/shelf_inventory_detection.py +0 -0
  221. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/shoplifting_detection.py +0 -0
  222. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/shopping_cart_analysis.py +0 -0
  223. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/skin_cancer_classification_img.py +0 -0
  224. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/smoker_detection.py +0 -0
  225. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/solar_panel.py +0 -0
  226. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/template_usecase.py +0 -0
  227. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/theft_detection.py +0 -0
  228. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/traffic_sign_monitoring.py +0 -0
  229. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/underwater_pollution_detection.py +0 -0
  230. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/warehouse_object_segmentation.py +0 -0
  231. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/waterbody_segmentation.py +0 -0
  232. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/weapon_detection.py +0 -0
  233. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/weld_defect_detection.py +0 -0
  234. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/windmill_maintenance.py +0 -0
  235. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/usecases/wound_segmentation.py +0 -0
  236. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/utils/__init__.py +0 -0
  237. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/utils/advanced_counting_utils.py +0 -0
  238. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/utils/advanced_helper_utils.py +0 -0
  239. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/utils/advanced_tracking_utils.py +0 -0
  240. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/utils/alerting_utils.py +0 -0
  241. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/utils/category_mapping_utils.py +0 -0
  242. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/utils/color_utils.py +0 -0
  243. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/utils/counting_utils.py +0 -0
  244. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/utils/filter_utils.py +0 -0
  245. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/utils/format_utils.py +0 -0
  246. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/utils/geometry_utils.py +0 -0
  247. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/utils/smoothing_utils.py +0 -0
  248. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deploy/utils/post_processing/utils/tracking_utils.py +0 -0
  249. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deployment/__init__.py +0 -0
  250. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deployment/camera_manager.py +0 -0
  251. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deployment/deployment.py +0 -0
  252. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deployment/inference_pipeline.py +0 -0
  253. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/deployment/streaming_gateway_manager.py +0 -0
  254. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/docker_utils.py +0 -0
  255. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/drift_monitor.py +0 -0
  256. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/exported_model.py +0 -0
  257. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/local_test.py +0 -0
  258. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/metrics_calculator.py +0 -0
  259. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/metrics_calculator_oop.py +0 -0
  260. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/model_store.py +0 -0
  261. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/models.py +0 -0
  262. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/pipeline.py +0 -0
  263. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/projects.py +0 -0
  264. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/rpc.py +0 -0
  265. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/scaling.py +0 -0
  266. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/session.py +0 -0
  267. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/testing.py +0 -0
  268. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/token_auth.py +0 -0
  269. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice/utils.py +0 -0
  270. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice.egg-info/SOURCES.txt +0 -0
  271. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice.egg-info/dependency_links.txt +0 -0
  272. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice.egg-info/requires.txt +0 -0
  273. {matrice-1.0.99392 → matrice-1.0.99394}/src/matrice.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: matrice
3
- Version: 1.0.99392
3
+ Version: 1.0.99394
4
4
  Summary: SDK for connecting to matrice.ai services
5
5
  Home-page: https://github.com/matrice-ai/python-sdk
6
6
  Author: Matrice.ai
@@ -14,7 +14,7 @@ long_description = (here / "README.md").read_text(encoding="utf-8")
14
14
  setup(
15
15
  name="matrice",
16
16
 
17
- version = "1.0.99392",
17
+ version = "1.0.99394",
18
18
 
19
19
  description="SDK for connecting to matrice.ai services",
20
20
  long_description=long_description,
@@ -1,22 +1,24 @@
1
1
  from typing import Any, Dict, List, Optional, Tuple
2
+ from dataclasses import asdict
2
3
  import time
3
4
  from datetime import datetime, timezone
4
5
 
5
- from ..core.base import BaseProcessor, ProcessingContext, ProcessingResult, ConfigProtocol
6
+ from ..core.base import BaseProcessor, ProcessingContext, ProcessingResult, ConfigProtocol, ResultFormat
6
7
  from ..utils import (
7
8
  filter_by_confidence,
8
9
  filter_by_categories,
9
10
  apply_category_mapping,
10
11
  count_objects_by_category,
11
12
  count_objects_in_zones,
13
+ calculate_counting_summary,
12
14
  match_results_structure,
13
15
  bbox_smoothing,
14
16
  BBoxSmoothingConfig,
15
17
  BBoxSmoothingTracker
16
18
  )
17
- from ..utils.geometry_utils import point_in_polygon, get_bbox_bottom25_center
18
19
  from dataclasses import dataclass, field
19
20
  from ..core.config import BaseConfig, AlertConfig, ZoneConfig
21
+ from ..utils.geometry_utils import get_bbox_center, point_in_polygon, get_bbox_bottom25_center
20
22
 
21
23
  @dataclass
22
24
  class VehicleMonitoringConfig(BaseConfig):
@@ -30,24 +32,26 @@ class VehicleMonitoringConfig(BaseConfig):
30
32
  zone_config: Optional[ZoneConfig] = None
31
33
  usecase_categories: List[str] = field(
32
34
  default_factory=lambda: [
33
- "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat"
34
- ,"traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat"
35
- ,"dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella"
36
- ,"handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat"
37
- ,"baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup"
38
- ,"fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli"
39
- ,"carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch", "potted plant", "bed"
40
- ,"dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone"
41
- ,"microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors"
42
- ,"teddy bear", "hair drier", "toothbrush"
35
+ "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat",
36
+ "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog",
37
+ "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella",
38
+ "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite",
39
+ "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle",
40
+ "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich",
41
+ "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch",
42
+ "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote",
43
+ "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book",
44
+ "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush"
43
45
  ]
44
46
  )
45
47
  target_categories: List[str] = field(
46
- default_factory=lambda: ['car', 'bicycle', 'bus', 'motorcycle']
48
+ default_factory=lambda: [
49
+ 'car', 'bicycle', 'bus', 'truck', 'motorcycle']
47
50
  )
48
51
  alert_config: Optional[AlertConfig] = None
49
52
  index_to_category: Optional[Dict[int, str]] = field(
50
- default_factory=lambda:{0: "person", 1: "bicycle", 2: "car", 3: "motorcycle", 4: "airplane", 5: "bus",
53
+ default_factory=lambda: {
54
+ 0: "person", 1: "bicycle", 2: "car", 3: "motorcycle", 4: "airplane", 5: "bus",
51
55
  6: "train", 7: "truck", 8: "boat", 9: "traffic light", 10: "fire hydrant",
52
56
  11: "stop sign", 12: "parking meter", 13: "bench", 14: "bird", 15: "cat",
53
57
  16: "dog", 17: "horse", 18: "sheep", 19: "cow", 20: "elephant", 21: "bear",
@@ -62,7 +66,8 @@ class VehicleMonitoringConfig(BaseConfig):
62
66
  62: "tv", 63: "laptop", 64: "mouse", 65: "remote", 66: "keyboard",
63
67
  67: "cell phone", 68: "microwave", 69: "oven", 70: "toaster", 71: "sink",
64
68
  72: "refrigerator", 73: "book", 74: "clock", 75: "vase", 76: "scissors",
65
- 77: "teddy bear", 78: "hair drier", 79: "toothbrush"}
69
+ 77: "teddy bear", 78: "hair drier", 79: "toothbrush"
70
+ }
66
71
  )
67
72
 
68
73
  class VehicleMonitoringUseCase(BaseProcessor):
@@ -82,7 +87,7 @@ class VehicleMonitoringUseCase(BaseProcessor):
82
87
  self.category = "traffic"
83
88
  self.CASE_TYPE: Optional[str] = 'vehicle_monitoring'
84
89
  self.CASE_VERSION: Optional[str] = '1.0'
85
- self.target_categories = ['car', 'bicycle', 'bus', 'truck', 'motorbike']
90
+ self.target_categories = ['car', 'bicycle', 'bus', 'truck', 'motorcycle']
86
91
  self.smoothing_tracker = None
87
92
  self.tracker = None
88
93
  self._total_frame_counter = 0
@@ -95,10 +100,22 @@ class VehicleMonitoringUseCase(BaseProcessor):
95
100
  self._ascending_alert_list: List[int] = []
96
101
  self.current_incident_end_timestamp: str = "N/A"
97
102
  self.start_timer = None
103
+
104
+ # Track ID storage for total count calculation
105
+ self._total_track_ids = set() # Store all unique track IDs seen across calls
106
+ self._current_frame_track_ids = set() # Store track IDs from current frame
107
+ self._total_count = 0 # Cached total count
108
+ self._last_update_time = time.time() # Track when last updated
109
+
110
+ # Zone-based tracking storage
111
+ self._zone_current_track_ids = {} # zone_name -> set of current track IDs in zone
112
+ self._zone_total_track_ids = {} # zone_name -> set of all track IDs that have been in zone
113
+ self._zone_current_counts = {} # zone_name -> current count in zone
114
+ self._zone_total_counts = {} # zone_name -> total count that have been in zone
98
115
 
99
116
  def process(self, data: Any, config: ConfigProtocol, context: Optional[ProcessingContext] = None,
100
117
  stream_info: Optional[Dict[str, Any]] = None) -> ProcessingResult:
101
- # Note: start_time not used; keeping processing focused on zone-based counts
118
+ start_time = time.time()
102
119
  if not isinstance(config, VehicleMonitoringConfig):
103
120
  return self.create_error_result("Invalid config type", usecase=self.name, category=self.category, context=context)
104
121
  if context is None:
@@ -150,36 +167,7 @@ class VehicleMonitoringUseCase(BaseProcessor):
150
167
  except Exception as e:
151
168
  self.logger.warning(f"AdvancedTracker failed: {e}")
152
169
 
153
- # If zones are configured, keep only detections that fall inside any zone
154
- detections_for_counting = processed_data
155
- if getattr(config, 'zone_config', None) and getattr(config.zone_config, 'zones', None):
156
- zones = config.zone_config.zones
157
- in_zone_detections = []
158
- for det in processed_data:
159
- matched_zones = []
160
- for zone_name, zone_polygon in zones.items():
161
- if self._is_detection_in_zone(det, zone_polygon):
162
- matched_zones.append(zone_name)
163
- if matched_zones:
164
- det_copy = dict(det)
165
- det_copy['zones'] = matched_zones
166
- in_zone_detections.append(det_copy)
167
- detections_for_counting = in_zone_detections
168
-
169
- self._update_tracking_state(detections_for_counting)
170
- # Maintain cumulative per-zone unique track counts using canonicalized track_ids
171
- if getattr(config, 'zone_config', None) and getattr(config.zone_config, 'zones', None):
172
- if not hasattr(self, '_per_zone_total_track_ids'):
173
- self._per_zone_total_track_ids = {}
174
- for det in detections_for_counting:
175
- track_id = det.get('track_id')
176
- if track_id is None:
177
- continue
178
- category = det.get('category', 'unknown')
179
- for zone_name in det.get('zones', []):
180
- zone_map = self._per_zone_total_track_ids.setdefault(zone_name, {})
181
- cat_set = zone_map.setdefault(category, set())
182
- cat_set.add(track_id)
170
+ self._update_tracking_state(processed_data)
183
171
  self._total_frame_counter += 1
184
172
 
185
173
  frame_number = None
@@ -190,32 +178,41 @@ class VehicleMonitoringUseCase(BaseProcessor):
190
178
  if start_frame is not None and end_frame is not None and start_frame == end_frame:
191
179
  frame_number = start_frame
192
180
 
193
- # Compute zone-wise counts (and filter totals) if zones are provided
194
- zone_counts = {}
195
- if getattr(config, 'zone_config', None) and getattr(config.zone_config, 'zones', None):
196
- try:
197
- zone_counts = count_objects_in_zones(detections_for_counting, config.zone_config.zones)
198
- except Exception as e:
199
- self.logger.warning("Zone counting failed: %s", e)
200
- counting_summary = self._count_categories(detections_for_counting, config)
181
+ general_counting_summary = calculate_counting_summary(data)
182
+ counting_summary = self._count_categories(processed_data, config)
201
183
  total_counts = self.get_total_counts()
202
184
  counting_summary['total_counts'] = total_counts
203
- # Attach zone analysis to counting summary so it can be included in human text
204
- counting_summary['zone_analysis'] = zone_counts
205
- # Attach total zone analysis (unique canonical tracks per zone/category) if available
206
- if hasattr(self, '_per_zone_total_track_ids'):
207
- counting_summary['zone_analysis_total'] = {
208
- zone_name: {cat: len(ids) for cat, ids in cat_map.items()}
209
- for zone_name, cat_map in self._per_zone_total_track_ids.items()
210
- }
211
-
212
- alerts = self._check_alerts(counting_summary, frame_number, config)
213
- # predictions are not required in the current agg_summary; skip computing to avoid unused variable
214
-
215
- incidents_list = self._generate_incidents(counting_summary, alerts, config, frame_number, stream_info)
216
- tracking_stats_list = self._generate_tracking_stats(counting_summary, alerts, config, frame_number, stream_info)
217
- business_analytics_list = self._generate_business_analytics(counting_summary, alerts, config, stream_info, is_empty=True)
218
- summary_list = self._generate_summary(counting_summary, incidents_list, tracking_stats_list, business_analytics_list, alerts)
185
+ for detection in processed_data:
186
+ category = detection.get("category", "unknown")
187
+ counting_summary["categories"][category] = counting_summary["categories"].get(category, 0) + 1
188
+
189
+ zone_analysis = {}
190
+ if config.zone_config and config.zone_config.zones:
191
+ # Convert single frame to format expected by count_objects_in_zones
192
+ frame_data = processed_data #[frame_detections]
193
+ zone_analysis = count_objects_in_zones(frame_data, config.zone_config.zones)
194
+
195
+ # Update zone tracking with current frame data
196
+ if zone_analysis and config.enable_tracking:
197
+ enhanced_zone_analysis = self._update_zone_tracking(zone_analysis, processed_data, config)
198
+ # Merge enhanced zone analysis with original zone analysis
199
+ for zone_name, enhanced_data in enhanced_zone_analysis.items():
200
+ zone_analysis[zone_name] = enhanced_data
201
+
202
+ print("-----------------------------ZONEEEE-----------------------------------")
203
+ print(zone_analysis)
204
+ print("-----------------------------ZONEEEE-----------------------------------")
205
+
206
+ alerts = self._check_alerts(counting_summary,zone_analysis, frame_number, config)
207
+ predictions = self._extract_predictions(processed_data)
208
+
209
+ incidents_list = self._generate_incidents(counting_summary,zone_analysis, alerts, config, frame_number, stream_info)
210
+ tracking_stats_list = self._generate_tracking_stats(counting_summary,zone_analysis, alerts, config, frame_number, stream_info)
211
+ print("---------------------------TS--------------------------------------")
212
+ print(tracking_stats_list)
213
+ print("---------------------------TS--------------------------------------")
214
+ business_analytics_list = self._generate_business_analytics(counting_summary,zone_analysis, alerts, config, stream_info, is_empty=True)
215
+ summary_list = self._generate_summary(counting_summary,zone_analysis, incidents_list, tracking_stats_list, business_analytics_list, alerts)
219
216
 
220
217
  incidents = incidents_list[0] if incidents_list else {}
221
218
  tracking_stats = tracking_stats_list[0] if tracking_stats_list else {}
@@ -226,7 +223,7 @@ class VehicleMonitoringUseCase(BaseProcessor):
226
223
  "tracking_stats": tracking_stats,
227
224
  "business_analytics": business_analytics,
228
225
  "alerts": alerts,
229
- "zone_analysis": zone_counts,
226
+ "zone_analysis": zone_analysis,
230
227
  "human_text": summary}
231
228
  }
232
229
 
@@ -239,6 +236,84 @@ class VehicleMonitoringUseCase(BaseProcessor):
239
236
  )
240
237
  return result
241
238
 
239
+ def _update_zone_tracking(self, zone_analysis: Dict[str, Dict[str, int]], detections: List[Dict], config: VehicleMonitoringConfig) -> Dict[str, Dict[str, Any]]:
240
+ """
241
+ Update zone tracking with current frame data.
242
+
243
+ Args:
244
+ zone_analysis: Current zone analysis results
245
+ detections: List of detections with track IDs
246
+
247
+ Returns:
248
+ Enhanced zone analysis with tracking information
249
+ """
250
+ if not zone_analysis or not config.zone_config or not config.zone_config.zones:
251
+ return {}
252
+
253
+ enhanced_zone_analysis = {}
254
+ zones = config.zone_config.zones
255
+
256
+ # Get current frame track IDs in each zone
257
+ current_frame_zone_tracks = {}
258
+
259
+ # Initialize zone tracking for all zones
260
+ for zone_name in zones.keys():
261
+ current_frame_zone_tracks[zone_name] = set()
262
+ if zone_name not in self._zone_current_track_ids:
263
+ self._zone_current_track_ids[zone_name] = set()
264
+ if zone_name not in self._zone_total_track_ids:
265
+ self._zone_total_track_ids[zone_name] = set()
266
+
267
+ # Check each detection against each zone
268
+ for detection in detections:
269
+ track_id = detection.get("track_id")
270
+ if track_id is None:
271
+ continue
272
+
273
+ # Get detection bbox
274
+ bbox = detection.get("bounding_box", detection.get("bbox"))
275
+ if not bbox:
276
+ continue
277
+
278
+ # Get detection center point
279
+ center_point = get_bbox_bottom25_center(bbox) #get_bbox_center(bbox)
280
+
281
+ # Check which zone this detection is in using actual zone polygons
282
+ for zone_name, zone_polygon in zones.items():
283
+ # Convert polygon points to tuples for point_in_polygon function
284
+ # zone_polygon format: [[x1, y1], [x2, y2], [x3, y3], ...]
285
+ polygon_points = [(point[0], point[1]) for point in zone_polygon]
286
+
287
+ # Check if detection center is inside the zone polygon using ray casting algorithm
288
+ if point_in_polygon(center_point, polygon_points):
289
+ current_frame_zone_tracks[zone_name].add(track_id)
290
+
291
+ # Update zone tracking for each zone
292
+ for zone_name, zone_counts in zone_analysis.items():
293
+ # Get current frame tracks for this zone
294
+ current_tracks = current_frame_zone_tracks.get(zone_name, set())
295
+
296
+ # Update current zone tracks
297
+ self._zone_current_track_ids[zone_name] = current_tracks
298
+
299
+ # Update total zone tracks (accumulate all track IDs that have been in this zone)
300
+ self._zone_total_track_ids[zone_name].update(current_tracks)
301
+
302
+ # Update counts
303
+ self._zone_current_counts[zone_name] = len(current_tracks)
304
+ self._zone_total_counts[zone_name] = len(self._zone_total_track_ids[zone_name])
305
+
306
+ # Create enhanced zone analysis
307
+ enhanced_zone_analysis[zone_name] = {
308
+ "current_count": self._zone_current_counts[zone_name],
309
+ "total_count": self._zone_total_counts[zone_name],
310
+ "current_track_ids": list(current_tracks),
311
+ "total_track_ids": list(self._zone_total_track_ids[zone_name]),
312
+ "original_counts": zone_counts # Preserve original zone counts
313
+ }
314
+
315
+ return enhanced_zone_analysis
316
+
242
317
  def _normalize_yolo_results(self, data: Any, index_to_category: Optional[Dict[int, str]] = None) -> Any:
243
318
  """
244
319
  Normalize YOLO-style outputs to internal detection schema:
@@ -312,7 +387,7 @@ class VehicleMonitoringUseCase(BaseProcessor):
312
387
  return normalized_dict
313
388
  return data
314
389
 
315
- def _check_alerts(self, summary: dict, frame_number: Any, config: VehicleMonitoringConfig) -> List[Dict]:
390
+ def _check_alerts(self, summary: dict, zone_analysis: Dict, frame_number: Any, config: VehicleMonitoringConfig) -> List[Dict]:
316
391
  def get_trend(data, lookback=900, threshold=0.6):
317
392
  window = data[-lookback:] if len(data) >= lookback else data
318
393
  if len(window) < 2:
@@ -345,7 +420,7 @@ class VehicleMonitoringUseCase(BaseProcessor):
345
420
  "threshold_level": threshold,
346
421
  "ascending": get_trend(self._ascending_alert_list, lookback=900, threshold=0.8),
347
422
  "settings": {t: v for t, v in zip(getattr(config.alert_config, 'alert_type', ['Default']),
348
- getattr(config.alert_config, 'alert_value', ['JSON']))}
423
+ getattr(config.alert_config, 'alert_value', ['JSON']))}
349
424
  })
350
425
  elif category in per_category_count and per_category_count[category] > threshold:
351
426
  alerts.append({
@@ -355,12 +430,12 @@ class VehicleMonitoringUseCase(BaseProcessor):
355
430
  "threshold_level": threshold,
356
431
  "ascending": get_trend(self._ascending_alert_list, lookback=900, threshold=0.8),
357
432
  "settings": {t: v for t, v in zip(getattr(config.alert_config, 'alert_type', ['Default']),
358
- getattr(config.alert_config, 'alert_value', ['JSON']))}
433
+ getattr(config.alert_config, 'alert_value', ['JSON']))}
359
434
  })
360
435
  return alerts
361
436
 
362
- def _generate_incidents(self, counting_summary: Dict, alerts: List, config: VehicleMonitoringConfig,
363
- frame_number: Optional[int] = None, stream_info: Optional[Dict[str, Any]] = None) -> List[Dict]:
437
+ def _generate_incidents(self, counting_summary: Dict, zone_analysis: Dict, alerts: List, config: VehicleMonitoringConfig,
438
+ frame_number: Optional[int] = None, stream_info: Optional[Dict[str, Any]] = None) -> List[Dict]:
364
439
  incidents = []
365
440
  total_detections = counting_summary.get("total_count", 0)
366
441
  current_timestamp = self._get_current_timestamp_str(stream_info)
@@ -446,7 +521,7 @@ class VehicleMonitoringUseCase(BaseProcessor):
446
521
  incidents.append({})
447
522
  return incidents
448
523
 
449
- def _generate_tracking_stats(self, counting_summary: Dict, alerts: List, config: VehicleMonitoringConfig,
524
+ def _generate_tracking_stats(self, counting_summary: Dict, zone_analysis: Dict, alerts: List, config: VehicleMonitoringConfig,
450
525
  frame_number: Optional[int] = None, stream_info: Optional[Dict[str, Any]] = None) -> List[Dict]:
451
526
  camera_info = self.get_camera_info_from_stream(stream_info)
452
527
  tracking_stats = []
@@ -486,55 +561,17 @@ class VehicleMonitoringUseCase(BaseProcessor):
486
561
  "threshold_level": config.alert_config.count_thresholds if hasattr(config.alert_config, 'count_thresholds') else {},
487
562
  "ascending": True,
488
563
  "settings": {t: v for t, v in zip(getattr(config.alert_config, 'alert_type', ['Default']),
489
- getattr(config.alert_config, 'alert_value', ['JSON']))}
564
+ getattr(config.alert_config, 'alert_value', ['JSON']))}
490
565
  })
491
566
 
492
567
  human_text_lines = [f"Tracking Statistics:"]
493
568
  human_text_lines.append(f"CURRENT FRAME @ {current_timestamp}")
494
569
  for cat, count in per_category_count.items():
495
- if cat in ['car', 'bicycle', 'bus', 'motorcycle']:
496
- human_text_lines.append(f"\t{cat}: {count}")
497
- else:
498
- human_text_lines.append("No Detections in Frame")
499
- # Append zone analysis for the current frame if available
500
- zone_analysis = counting_summary.get("zone_analysis", {})
501
- if zone_analysis:
502
- human_text_lines.append("ZONE ANALYSIS (CURRENT FRAME):")
503
- for zone_name, cat_counts in zone_analysis.items():
504
- if isinstance(cat_counts, dict):
505
- total_in_zone = sum(cat_counts.values())
506
- car_count = (
507
- cat_counts.get('car', 0)
508
- + cat_counts.get('truck', 0)
509
- )
510
- if car_count > 0:
511
- human_text_lines.append(f"\t{zone_name}: total={total_in_zone} (car: {car_count})")
512
- else:
513
- human_text_lines.append(f"\t{zone_name}: total={total_in_zone}")
514
- else:
515
- human_text_lines.append(f"\t{zone_name}: total=0")
570
+ human_text_lines.append(f"\t{cat}: {count}")
516
571
  human_text_lines.append(f"TOTAL SINCE {start_timestamp}")
517
572
  for cat, count in total_counts_dict.items():
518
- if cat in ['car', 'bicycle', 'bus', 'motorcycle']:
519
- if count > 0:
520
- human_text_lines.append(f"\t{cat}: {count}")
521
- # Append zone analysis totals across time if available
522
- zone_analysis_total = counting_summary.get("zone_analysis_total", {})
523
- if zone_analysis_total:
524
- human_text_lines.append("ZONE ANALYSIS (TOTAL SINCE START):")
525
- for zone_name, cat_counts in zone_analysis_total.items():
526
- if isinstance(cat_counts, dict):
527
- total_in_zone = sum(cat_counts.values())
528
- car_count = (
529
- cat_counts.get('car', 0)
530
- + cat_counts.get('truck', 0)
531
- )
532
- if car_count > 0:
533
- human_text_lines.append(f"\t{zone_name}: total={total_in_zone} (car: {car_count})")
534
- else:
535
- human_text_lines.append(f"\t{zone_name}: total={total_in_zone}")
536
- else:
537
- human_text_lines.append(f"\t{zone_name}: total=0")
573
+ if count > 0:
574
+ human_text_lines.append(f"\t{cat}: {count}")
538
575
  if alerts:
539
576
  for alert in alerts:
540
577
  human_text_lines.append(f"Alerts: {alert.get('settings', {})} sent @ {current_timestamp}")
@@ -558,12 +595,12 @@ class VehicleMonitoringUseCase(BaseProcessor):
558
595
  tracking_stats.append(tracking_stat)
559
596
  return tracking_stats
560
597
 
561
- def _generate_business_analytics(self, counting_summary: Dict, alerts: Any, config: VehicleMonitoringConfig,
598
+ def _generate_business_analytics(self, counting_summary: Dict, zone_analysis: Dict, alerts: Any, config: VehicleMonitoringConfig,
562
599
  stream_info: Optional[Dict[str, Any]] = None, is_empty=False) -> List[Dict]:
563
600
  if is_empty:
564
601
  return []
565
602
 
566
- def _generate_summary(self, summary: dict, incidents: List, tracking_stats: List, business_analytics: List, alerts: List) -> List[str]:
603
+ def _generate_summary(self, summary: dict, zone_analysis: Dict, incidents: List, tracking_stats: List, business_analytics: List, alerts: List) -> List[str]:
567
604
  """
568
605
  Generate a human_text string for the tracking_stat, incident, business analytics and alerts.
569
606
  """
@@ -823,13 +860,6 @@ class VehicleMonitoringUseCase(BaseProcessor):
823
860
  union_area = area1 + area2 - inter_area
824
861
  return (inter_area / union_area) if union_area > 0 else 0.0
825
862
 
826
- def _is_detection_in_zone(self, detection: Dict[str, Any], zone_polygon: List[List[float]]) -> bool:
827
- bbox = detection.get("bounding_box", detection.get("bbox"))
828
- if not bbox:
829
- return False
830
- bottom25_center = get_bbox_bottom25_center(bbox)
831
- return point_in_polygon(bottom25_center, [(p[0], p[1]) for p in zone_polygon])
832
-
833
863
  def _merge_or_register_track(self, raw_id: Any, bbox: Any) -> Any:
834
864
  if raw_id is None or bbox is None:
835
865
  return raw_id
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: matrice
3
- Version: 1.0.99392
3
+ Version: 1.0.99394
4
4
  Summary: SDK for connecting to matrice.ai services
5
5
  Home-page: https://github.com/matrice-ai/python-sdk
6
6
  Author: Matrice.ai
File without changes
File without changes
File without changes