matrice-analytics 0.1.82__tar.gz → 0.1.115__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.
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/PKG-INFO +1 -1
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/matrice_analytics.egg-info/PKG-INFO +1 -1
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/matrice_analytics.egg-info/SOURCES.txt +7 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/__init__.py +28 -3
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/advanced_tracker/config.py +8 -4
- matrice_analytics-0.1.115/src/matrice_analytics/post_processing/advanced_tracker/track_class_aggregator.py +128 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/advanced_tracker/tracker.py +22 -1
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/config.py +18 -2
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/core/config.py +146 -4
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/face_reg/face_recognition.py +849 -84
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/face_reg/face_recognition_client.py +116 -4
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/face_reg/people_activity_logging.py +44 -14
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/post_processor.py +16 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/__init__.py +12 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/advanced_customer_service.py +913 -500
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/color_detection.py +19 -18
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/fire_detection.py +142 -32
- matrice_analytics-0.1.115/src/matrice_analytics/post_processing/usecases/footfall.py +898 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/license_plate_monitoring.py +257 -142
- matrice_analytics-0.1.115/src/matrice_analytics/post_processing/usecases/parking_lot_analytics.py +1137 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/people_counting.py +66 -33
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/vehicle_monitoring.py +79 -70
- matrice_analytics-0.1.115/src/matrice_analytics/post_processing/usecases/vehicle_monitoring_drone_view.py +1250 -0
- matrice_analytics-0.1.115/src/matrice_analytics/post_processing/usecases/vehicle_monitoring_parking_lot.py +1044 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/weapon_detection.py +2 -1
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/__init__.py +5 -0
- matrice_analytics-0.1.115/src/matrice_analytics/post_processing/utils/agnostic_nms.py +759 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/alert_instance_utils.py +148 -32
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/business_metrics_manager_utils.py +268 -19
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/incident_manager_utils.py +364 -43
- matrice_analytics-0.1.115/src/matrice_analytics/post_processing/utils/parking_analytics_tracker.py +359 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/LICENSE.txt +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/README.md +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/matrice_analytics.egg-info/dependency_links.txt +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/matrice_analytics.egg-info/not-zip-safe +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/matrice_analytics.egg-info/top_level.txt +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/pyproject.toml +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/setup.cfg +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/setup.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/boundary_drawing_internal/README.md +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/boundary_drawing_internal/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/boundary_drawing_internal/boundary_drawing_internal.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/boundary_drawing_internal/boundary_drawing_tool.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/boundary_drawing_internal/boundary_tool_template.html +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/boundary_drawing_internal/example_usage.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/boundary_drawing_internal/usage/README.md +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/boundary_drawing_internal/usage/boundary_drawer_launcher.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/boundary_drawing_internal/usage/simple_boundary_launcher.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/README.md +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/advanced_tracker/README.md +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/advanced_tracker/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/advanced_tracker/base.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/advanced_tracker/kalman_filter.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/advanced_tracker/matching.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/advanced_tracker/strack.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/core/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/core/base.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/core/config_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/face_reg/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/face_reg/compare_similarity.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/face_reg/embedding_manager.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/easyocr_extractor.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/cli/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/cli/cli.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/cli/dataset_stats.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/cli/export.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/cli/train.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/cli/utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/cli/valid.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/cli/validate_dataset.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/cli/visualize_augmentation.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/cli/visualize_predictions.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/core/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/core/process.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/core/types.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/core/utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/inference/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/inference/config.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/inference/hub.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/inference/plate_recognizer.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/py.typed +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/data/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/data/augmentation.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/data/dataset.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/model/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/model/config.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/model/layers.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/model/loss.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/model/metric.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/model/model_builders.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/model/model_schema.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/utilities/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/utilities/backend_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/fast_plate_ocr_py38/train/utilities/utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/postprocessing.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/ocr/preprocessing.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/test_cases/__init__.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/test_cases/run_tests.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/test_cases/test_advanced_customer_service.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/test_cases/test_basic_counting_tracking.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/test_cases/test_comprehensive.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/test_cases/test_config.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/test_cases/test_customer_service.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/test_cases/test_data_generators.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/test_cases/test_people_counting.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/test_cases/test_processor.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/test_cases/test_usecases.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/test_cases/test_utilities.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/test_cases/test_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/Histopathological_Cancer_Detection_img.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/abandoned_object_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/age_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/age_gender_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/anti_spoofing_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/assembly_line_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/banana_defect_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/basic_counting_tracking.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/blood_cancer_detection_img.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/car_damage_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/car_part_segmentation.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/car_service.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/cardiomegaly_classification.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/cell_microscopy_segmentation.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/chicken_pose_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/child_monitoring.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/color/clip.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/color/clip_processor/merges.txt +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/color/clip_processor/preprocessor_config.json +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/color/clip_processor/special_tokens_map.json +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/color/clip_processor/tokenizer.json +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/color/clip_processor/tokenizer_config.json +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/color/clip_processor/vocab.json +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/color/color_map_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/color/color_mapper.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/color_map_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/concrete_crack_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/crop_weed_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/customer_service.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/defect_detection_products.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/distracted_driver_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/drone_traffic_monitoring.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/drowsy_driver_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/dwell_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/emergency_vehicle_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/face_emotion.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/face_recognition.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/fashion_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/field_mapping.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/flare_analysis.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/flower_segmentation.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/gas_leak_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/gender_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/human_activity_recognition.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/intrusion_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/leaf.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/leaf_disease.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/leak_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/license_plate_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/litter_monitoring.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/mask_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/natural_disaster.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/parking.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/parking_space_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/pcb_defect_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/pedestrian_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/people_counting_bckp.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/people_tracking.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/pipeline_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/plaque_segmentation_img.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/pothole_segmentation.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/ppe_compliance.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/price_tag_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/proximity_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/road_lane_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/road_traffic_density.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/road_view_segmentation.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/shelf_inventory_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/shoplifting_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/shopping_cart_analysis.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/skin_cancer_classification_img.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/smoker_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/solar_panel.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/suspicious_activity_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/template_usecase.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/theft_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/traffic_sign_monitoring.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/underground_pipeline_defect_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/underwater_pollution_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/warehouse_object_segmentation.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/waterbody_segmentation.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/weld_defect_detection.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/wildlife_monitoring.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/windmill_maintenance.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/usecases/wound_segmentation.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/advanced_counting_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/advanced_helper_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/advanced_tracking_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/alerting_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/category_mapping_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/color_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/counting_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/filter_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/format_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/geometry_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/smoothing_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/post_processing/utils/tracking_utils.py +0 -0
- {matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/src/matrice_analytics/py.typed +0 -0
{matrice_analytics-0.1.82 → matrice_analytics-0.1.115}/matrice_analytics.egg-info/SOURCES.txt
RENAMED
|
@@ -29,6 +29,7 @@ src/matrice_analytics/post_processing/advanced_tracker/config.py
|
|
|
29
29
|
src/matrice_analytics/post_processing/advanced_tracker/kalman_filter.py
|
|
30
30
|
src/matrice_analytics/post_processing/advanced_tracker/matching.py
|
|
31
31
|
src/matrice_analytics/post_processing/advanced_tracker/strack.py
|
|
32
|
+
src/matrice_analytics/post_processing/advanced_tracker/track_class_aggregator.py
|
|
32
33
|
src/matrice_analytics/post_processing/advanced_tracker/tracker.py
|
|
33
34
|
src/matrice_analytics/post_processing/core/__init__.py
|
|
34
35
|
src/matrice_analytics/post_processing/core/base.py
|
|
@@ -127,6 +128,7 @@ src/matrice_analytics/post_processing/usecases/field_mapping.py
|
|
|
127
128
|
src/matrice_analytics/post_processing/usecases/fire_detection.py
|
|
128
129
|
src/matrice_analytics/post_processing/usecases/flare_analysis.py
|
|
129
130
|
src/matrice_analytics/post_processing/usecases/flower_segmentation.py
|
|
131
|
+
src/matrice_analytics/post_processing/usecases/footfall.py
|
|
130
132
|
src/matrice_analytics/post_processing/usecases/gas_leak_detection.py
|
|
131
133
|
src/matrice_analytics/post_processing/usecases/gender_detection.py
|
|
132
134
|
src/matrice_analytics/post_processing/usecases/human_activity_recognition.py
|
|
@@ -140,6 +142,7 @@ src/matrice_analytics/post_processing/usecases/litter_monitoring.py
|
|
|
140
142
|
src/matrice_analytics/post_processing/usecases/mask_detection.py
|
|
141
143
|
src/matrice_analytics/post_processing/usecases/natural_disaster.py
|
|
142
144
|
src/matrice_analytics/post_processing/usecases/parking.py
|
|
145
|
+
src/matrice_analytics/post_processing/usecases/parking_lot_analytics.py
|
|
143
146
|
src/matrice_analytics/post_processing/usecases/parking_space_detection.py
|
|
144
147
|
src/matrice_analytics/post_processing/usecases/pcb_defect_detection.py
|
|
145
148
|
src/matrice_analytics/post_processing/usecases/pedestrian_detection.py
|
|
@@ -168,6 +171,8 @@ src/matrice_analytics/post_processing/usecases/traffic_sign_monitoring.py
|
|
|
168
171
|
src/matrice_analytics/post_processing/usecases/underground_pipeline_defect_detection.py
|
|
169
172
|
src/matrice_analytics/post_processing/usecases/underwater_pollution_detection.py
|
|
170
173
|
src/matrice_analytics/post_processing/usecases/vehicle_monitoring.py
|
|
174
|
+
src/matrice_analytics/post_processing/usecases/vehicle_monitoring_drone_view.py
|
|
175
|
+
src/matrice_analytics/post_processing/usecases/vehicle_monitoring_parking_lot.py
|
|
171
176
|
src/matrice_analytics/post_processing/usecases/warehouse_object_segmentation.py
|
|
172
177
|
src/matrice_analytics/post_processing/usecases/waterbody_segmentation.py
|
|
173
178
|
src/matrice_analytics/post_processing/usecases/weapon_detection.py
|
|
@@ -188,6 +193,7 @@ src/matrice_analytics/post_processing/utils/__init__.py
|
|
|
188
193
|
src/matrice_analytics/post_processing/utils/advanced_counting_utils.py
|
|
189
194
|
src/matrice_analytics/post_processing/utils/advanced_helper_utils.py
|
|
190
195
|
src/matrice_analytics/post_processing/utils/advanced_tracking_utils.py
|
|
196
|
+
src/matrice_analytics/post_processing/utils/agnostic_nms.py
|
|
191
197
|
src/matrice_analytics/post_processing/utils/alert_instance_utils.py
|
|
192
198
|
src/matrice_analytics/post_processing/utils/alerting_utils.py
|
|
193
199
|
src/matrice_analytics/post_processing/utils/business_metrics_manager_utils.py
|
|
@@ -198,5 +204,6 @@ src/matrice_analytics/post_processing/utils/filter_utils.py
|
|
|
198
204
|
src/matrice_analytics/post_processing/utils/format_utils.py
|
|
199
205
|
src/matrice_analytics/post_processing/utils/geometry_utils.py
|
|
200
206
|
src/matrice_analytics/post_processing/utils/incident_manager_utils.py
|
|
207
|
+
src/matrice_analytics/post_processing/utils/parking_analytics_tracker.py
|
|
201
208
|
src/matrice_analytics/post_processing/utils/smoothing_utils.py
|
|
202
209
|
src/matrice_analytics/post_processing/utils/tracking_utils.py
|
|
@@ -84,7 +84,8 @@ from .usecases.field_mapping import FieldMappingConfig, FieldMappingUseCase
|
|
|
84
84
|
from .usecases.leaf_disease import LeafDiseaseDetectionConfig, LeafDiseaseDetectionUseCase
|
|
85
85
|
from .usecases.parking import ParkingConfig
|
|
86
86
|
from .usecases.abandoned_object_detection import AbandonedObjectConfig
|
|
87
|
-
|
|
87
|
+
from .usecases.footfall import FootFallConfig
|
|
88
|
+
from .usecases.vehicle_monitoring import VehicleMonitoringConfig
|
|
88
89
|
|
|
89
90
|
from .usecases.weld_defect_detection import WeldDefectConfig
|
|
90
91
|
from .usecases.weapon_detection import WeaponDetectionConfig
|
|
@@ -128,7 +129,10 @@ from .usecases.pcb_defect_detection import PCBDefectConfig, PCBDefectUseCase
|
|
|
128
129
|
from .usecases.underground_pipeline_defect_detection import UndergroundPipelineDefectConfig,UndergroundPipelineDefectUseCase
|
|
129
130
|
from .usecases.suspicious_activity_detection import SusActivityConfig, SusActivityUseCase
|
|
130
131
|
from .usecases.natural_disaster import NaturalDisasterConfig, NaturalDisasterUseCase
|
|
131
|
-
|
|
132
|
+
from .usecases.footfall import FootFallUseCase
|
|
133
|
+
from .usecases.vehicle_monitoring_parking_lot import VehicleMonitoringParkingLotUseCase, VehicleMonitoringParkingLotConfig
|
|
134
|
+
from .usecases.vehicle_monitoring_drone_view import VehicleMonitoringDroneViewUseCase, VehicleMonitoringDroneViewConfig
|
|
135
|
+
from .usecases.parking_lot_analytics import ParkingLotAnalyticsConfig, ParkingLotAnalyticsUseCase
|
|
132
136
|
#Put all IMAGE based usecases here
|
|
133
137
|
from .usecases.blood_cancer_detection_img import BloodCancerDetectionConfig, BloodCancerDetectionUseCase
|
|
134
138
|
from .usecases.skin_cancer_classification_img import SkinCancerClassificationConfig, SkinCancerClassificationUseCase
|
|
@@ -205,6 +209,10 @@ from .usecases import (
|
|
|
205
209
|
|
|
206
210
|
SusActivityUseCase,
|
|
207
211
|
NaturalDisasterUseCase,
|
|
212
|
+
FootFallUseCase,
|
|
213
|
+
VehicleMonitoringParkingLotUseCase,
|
|
214
|
+
VehicleMonitoringDroneViewUseCase,
|
|
215
|
+
ParkingLotAnalyticsUseCase,
|
|
208
216
|
|
|
209
217
|
#Put all IMAGE based usecases here
|
|
210
218
|
BloodCancerDetectionUseCase,
|
|
@@ -286,6 +294,10 @@ _pcb_defect_detection = PCBDefectUseCase()
|
|
|
286
294
|
_underground_pipeline_defect = UndergroundPipelineDefectUseCase()
|
|
287
295
|
_suspicious_activity_detection = SusActivityUseCase()
|
|
288
296
|
_natural_disaster = NaturalDisasterUseCase()
|
|
297
|
+
_footfall = FootFallUseCase()
|
|
298
|
+
_vehicle_monitoring_parking_lot = VehicleMonitoringParkingLotUseCase()
|
|
299
|
+
_vehicle_monitoring_drone_view = VehicleMonitoringDroneViewUseCase()
|
|
300
|
+
_parking_lot_analytics = ParkingLotAnalyticsUseCase()
|
|
289
301
|
|
|
290
302
|
# Face recognition with embeddings
|
|
291
303
|
_face_recognition = FaceRecognitionEmbeddingUseCase()
|
|
@@ -370,6 +382,10 @@ registry.register_use_case(_pcb_defect_detection.category, _pcb_defect_detection
|
|
|
370
382
|
registry.register_use_case(_underground_pipeline_defect.category, _underground_pipeline_defect.name, UndergroundPipelineDefectUseCase)
|
|
371
383
|
registry.register_use_case(_suspicious_activity_detection.category, _suspicious_activity_detection.name, SusActivityUseCase)
|
|
372
384
|
registry.register_use_case(_natural_disaster.category, _natural_disaster.name, NaturalDisasterUseCase)
|
|
385
|
+
registry.register_use_case(_footfall.category, _footfall.name, FaceEmotionUseCase)
|
|
386
|
+
registry.register_use_case(_vehicle_monitoring_parking_lot.category, _vehicle_monitoring_parking_lot.name, VehicleMonitoringParkingLotUseCase)
|
|
387
|
+
registry.register_use_case(_vehicle_monitoring_drone_view.category, _vehicle_monitoring_drone_view.name, VehicleMonitoringDroneViewUseCase)
|
|
388
|
+
registry.register_use_case(_parking_lot_analytics.category, _parking_lot_analytics.name, ParkingLotAnalyticsUseCase)
|
|
373
389
|
|
|
374
390
|
#Put all IMAGE based usecases here
|
|
375
391
|
registry.register_use_case(_blood_cancer_detection.category, _blood_cancer_detection.name, BloodCancerDetectionUseCase)
|
|
@@ -574,7 +590,11 @@ __all__ = [
|
|
|
574
590
|
'UndergroundPipelineDefectConfig',
|
|
575
591
|
'SusActivityConfig',
|
|
576
592
|
'NaturalDisasterConfig',
|
|
577
|
-
'VehiclePeopleDroneMonitoringConfig'
|
|
593
|
+
'VehiclePeopleDroneMonitoringConfig',
|
|
594
|
+
'FootFallConfig',
|
|
595
|
+
'VehicleMonitoringParkingLotConfig',
|
|
596
|
+
'VehicleMonitoringDroneViewConfig',
|
|
597
|
+
'ParkingLotAnalyticsConfig',
|
|
578
598
|
#Put all IMAGE based usecase CONFIGS here
|
|
579
599
|
'BloodCancerDetectionConfig',
|
|
580
600
|
'SkinCancerClassificationConfig',
|
|
@@ -648,6 +668,10 @@ __all__ = [
|
|
|
648
668
|
'UndergroundPipelineDefectUseCase',
|
|
649
669
|
'SusActivityUseCase',
|
|
650
670
|
'NaturalDisasterUseCase',
|
|
671
|
+
'FootFallUseCase',
|
|
672
|
+
'VehicleMonitoringParkingLotUseCase',
|
|
673
|
+
'VehicleMonitoringDroneViewUseCase',
|
|
674
|
+
'ParkingLotAnalyticsUseCase',
|
|
651
675
|
|
|
652
676
|
#Put all IMAGE based usecases here
|
|
653
677
|
'BloodCancerDetectionUseCase',
|
|
@@ -710,6 +734,7 @@ __all__ = [
|
|
|
710
734
|
'detect_line_crossings',
|
|
711
735
|
'analyze_track_movements',
|
|
712
736
|
'filter_tracks_by_duration',
|
|
737
|
+
'ParkingAnalyticsTracker',
|
|
713
738
|
|
|
714
739
|
# New utilities
|
|
715
740
|
'create_people_counting_config',
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Configuration classes for advanced tracker.
|
|
3
|
-
|
|
4
3
|
This module provides configuration classes for the advanced tracker,
|
|
5
4
|
including parameters for tracking algorithms and thresholds.
|
|
6
5
|
"""
|
|
@@ -8,7 +7,6 @@ including parameters for tracking algorithms and thresholds.
|
|
|
8
7
|
from dataclasses import dataclass, field
|
|
9
8
|
from typing import Optional
|
|
10
9
|
|
|
11
|
-
|
|
12
10
|
@dataclass
|
|
13
11
|
class TrackerConfig:
|
|
14
12
|
"""
|
|
@@ -46,6 +44,10 @@ class TrackerConfig:
|
|
|
46
44
|
smoothing_window_size: int = 20
|
|
47
45
|
smoothing_cooldown_frames: int = 5
|
|
48
46
|
|
|
47
|
+
# Class aggregation settings
|
|
48
|
+
enable_class_aggregation: bool = False
|
|
49
|
+
class_aggregation_window_size: int = 30
|
|
50
|
+
|
|
49
51
|
def __post_init__(self):
|
|
50
52
|
"""Validate configuration parameters."""
|
|
51
53
|
if not 0.0 <= self.track_high_thresh <= 1.0:
|
|
@@ -72,6 +74,8 @@ class TrackerConfig:
|
|
|
72
74
|
if self.output_format not in ["tracking", "detection"]:
|
|
73
75
|
raise ValueError(f"Invalid output_format: {self.output_format}")
|
|
74
76
|
|
|
75
|
-
# Calculate max_time_lost if not explicitly set
|
|
76
77
|
if self.max_time_lost == 30: # Default value
|
|
77
|
-
self.max_time_lost = int(self.frame_rate / 30.0 * self.track_buffer)
|
|
78
|
+
self.max_time_lost = int(self.frame_rate / 30.0 * self.track_buffer)
|
|
79
|
+
|
|
80
|
+
if self.class_aggregation_window_size <= 0:
|
|
81
|
+
raise ValueError(f"class_aggregation_window_size must be positive, got {self.class_aggregation_window_size}")
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Track class aggregation for object tracking.
|
|
3
|
+
|
|
4
|
+
This module provides a sliding-window-based mechanism to aggregate class labels
|
|
5
|
+
across frames, reducing label flickering in tracking outputs through temporal voting.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Any, Dict
|
|
9
|
+
from collections import deque, Counter
|
|
10
|
+
import logging
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class TrackClassAggregator:
|
|
16
|
+
"""
|
|
17
|
+
Maintains per-track sliding windows of class labels and returns the most frequent.
|
|
18
|
+
|
|
19
|
+
This aggregator reduces class label flickering in tracking results by applying
|
|
20
|
+
temporal voting based on historical observations within a sliding window.
|
|
21
|
+
|
|
22
|
+
Attributes:
|
|
23
|
+
window_size (int): Maximum number of frames to keep in the sliding window.
|
|
24
|
+
track_windows (Dict[int, deque]): Per-track sliding windows of class labels.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__(self, window_size: int = 30):
|
|
28
|
+
"""
|
|
29
|
+
Initialize the TrackClassAggregator.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
window_size (int): Number of recent frames to consider for aggregation.
|
|
33
|
+
Must be positive. Larger windows provide more stability but slower
|
|
34
|
+
adaptation to genuine class changes.
|
|
35
|
+
"""
|
|
36
|
+
if window_size <= 0:
|
|
37
|
+
raise ValueError(f"window_size must be positive, got {window_size}")
|
|
38
|
+
|
|
39
|
+
self.window_size = window_size
|
|
40
|
+
self.track_windows: Dict[int, deque] = {}
|
|
41
|
+
|
|
42
|
+
def update_and_aggregate(self, track_id: int, observed_class: Any) -> Any:
|
|
43
|
+
"""
|
|
44
|
+
Update the sliding window for a track and return the aggregated class label.
|
|
45
|
+
|
|
46
|
+
This method:
|
|
47
|
+
1. Adds the new observation to the track's window
|
|
48
|
+
2. Maintains window size by removing oldest entries if needed
|
|
49
|
+
3. Returns the most frequent class in the window
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
track_id (int): Unique identifier for the track.
|
|
53
|
+
observed_class (Any): The class label observed in the current frame.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
Any: The aggregated class label (most frequent in the window).
|
|
57
|
+
If there's a tie, returns the most recent among tied classes.
|
|
58
|
+
"""
|
|
59
|
+
# Initialize window for new tracks
|
|
60
|
+
if track_id not in self.track_windows:
|
|
61
|
+
self.track_windows[track_id] = deque(maxlen=self.window_size)
|
|
62
|
+
|
|
63
|
+
# Add current observation
|
|
64
|
+
window = self.track_windows[track_id]
|
|
65
|
+
window.append(observed_class)
|
|
66
|
+
|
|
67
|
+
# Return most frequent class
|
|
68
|
+
if len(window) == 0:
|
|
69
|
+
return observed_class
|
|
70
|
+
|
|
71
|
+
# Count frequencies and return most common
|
|
72
|
+
class_counts = Counter(window)
|
|
73
|
+
most_common = class_counts.most_common(1)[0][0]
|
|
74
|
+
|
|
75
|
+
return most_common
|
|
76
|
+
|
|
77
|
+
def get_aggregated_class(self, track_id: int, fallback_class: Any) -> Any:
|
|
78
|
+
"""
|
|
79
|
+
Get the aggregated class for a track without updating the window.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
track_id (int): Unique identifier for the track.
|
|
83
|
+
fallback_class (Any): Class to return if track has no history.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
Any: The aggregated class label, or fallback_class if no history exists.
|
|
87
|
+
"""
|
|
88
|
+
if track_id not in self.track_windows:
|
|
89
|
+
return fallback_class
|
|
90
|
+
|
|
91
|
+
window = self.track_windows[track_id]
|
|
92
|
+
if len(window) == 0:
|
|
93
|
+
return fallback_class
|
|
94
|
+
|
|
95
|
+
class_counts = Counter(window)
|
|
96
|
+
return class_counts.most_common(1)[0][0]
|
|
97
|
+
|
|
98
|
+
def remove_track(self, track_id: int) -> None:
|
|
99
|
+
"""
|
|
100
|
+
Remove a track's window from memory.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
track_id (int): Unique identifier for the track to remove.
|
|
104
|
+
"""
|
|
105
|
+
if track_id in self.track_windows:
|
|
106
|
+
del self.track_windows[track_id]
|
|
107
|
+
|
|
108
|
+
def remove_tracks(self, track_ids: list) -> None:
|
|
109
|
+
"""
|
|
110
|
+
Remove multiple tracks' windows from memory (batch operation).
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
track_ids (list): List of track IDs to remove.
|
|
114
|
+
"""
|
|
115
|
+
for track_id in track_ids:
|
|
116
|
+
self.remove_track(track_id)
|
|
117
|
+
|
|
118
|
+
def reset(self) -> None:
|
|
119
|
+
"""Clear all track windows."""
|
|
120
|
+
self.track_windows.clear()
|
|
121
|
+
|
|
122
|
+
def get_active_track_count(self) -> int:
|
|
123
|
+
"""Get the number of tracks currently being aggregated."""
|
|
124
|
+
return len(self.track_windows)
|
|
125
|
+
|
|
126
|
+
def __repr__(self) -> str:
|
|
127
|
+
"""String representation for debugging."""
|
|
128
|
+
return f"TrackClassAggregator(window_size={self.window_size}, active_tracks={len(self.track_windows)})"
|
|
@@ -34,6 +34,7 @@ class AdvancedTracker:
|
|
|
34
34
|
config (TrackerConfig): Tracker configuration.
|
|
35
35
|
max_time_lost (int): The maximum frames for a track to be considered as 'lost'.
|
|
36
36
|
kalman_filter (KalmanFilterXYAH): Kalman Filter object.
|
|
37
|
+
class_smoother (Optional[ClassSmoother]): Optional class smoother for class label smoothing over flicker.
|
|
37
38
|
"""
|
|
38
39
|
|
|
39
40
|
def __init__(self, config: TrackerConfig):
|
|
@@ -53,6 +54,11 @@ class AdvancedTracker:
|
|
|
53
54
|
self.kalman_filter = self.get_kalmanfilter()
|
|
54
55
|
self.reset_id()
|
|
55
56
|
|
|
57
|
+
self.class_aggregator = None
|
|
58
|
+
if config.enable_class_aggregation:
|
|
59
|
+
from .track_class_aggregator import TrackClassAggregator
|
|
60
|
+
self.class_aggregator = TrackClassAggregator(window_size=config.class_aggregation_window_size)
|
|
61
|
+
|
|
56
62
|
def update(self, detections: Union[List[Dict], Dict[str, List[Dict]]],
|
|
57
63
|
img: Optional[np.ndarray] = None) -> Union[List[Dict], Dict[str, List[Dict]]]:
|
|
58
64
|
"""
|
|
@@ -186,7 +192,15 @@ class AdvancedTracker:
|
|
|
186
192
|
}
|
|
187
193
|
|
|
188
194
|
detections.append(detection)
|
|
189
|
-
|
|
195
|
+
|
|
196
|
+
if self.class_aggregator is not None:
|
|
197
|
+
for detection in detections:
|
|
198
|
+
aggregated_class = self.class_aggregator.update_and_aggregate(
|
|
199
|
+
track_id=detection['track_id'],
|
|
200
|
+
observed_class=detection['category']
|
|
201
|
+
)
|
|
202
|
+
detection['category'] = aggregated_class
|
|
203
|
+
|
|
190
204
|
return detections
|
|
191
205
|
|
|
192
206
|
def _perform_tracking_update(self, detections: List[STrack],
|
|
@@ -296,6 +310,10 @@ class AdvancedTracker:
|
|
|
296
310
|
|
|
297
311
|
if len(self.removed_stracks) > 1000:
|
|
298
312
|
self.removed_stracks = self.removed_stracks[-999:]
|
|
313
|
+
|
|
314
|
+
# Clean up aggregator windows for removed tracks
|
|
315
|
+
if self.class_aggregator is not None and removed_stracks:
|
|
316
|
+
self.class_aggregator.remove_tracks([t.track_id for t in removed_stracks])
|
|
299
317
|
|
|
300
318
|
return [x for x in self.tracked_stracks if x.is_activated]
|
|
301
319
|
|
|
@@ -327,6 +345,9 @@ class AdvancedTracker:
|
|
|
327
345
|
self.frame_id = 0
|
|
328
346
|
self.kalman_filter = self.get_kalmanfilter()
|
|
329
347
|
self.reset_id()
|
|
348
|
+
|
|
349
|
+
if self.class_aggregator is not None:
|
|
350
|
+
self.class_aggregator.reset()
|
|
330
351
|
|
|
331
352
|
@staticmethod
|
|
332
353
|
def joint_stracks(tlista: List[STrack], tlistb: List[STrack]) -> List[STrack]:
|
|
@@ -7,11 +7,13 @@ APP_NAME_TO_USECASE = {
|
|
|
7
7
|
"pipeline_detection": "pipeline_detection",
|
|
8
8
|
"vehicle_monitoring": "vehicle_monitoring",
|
|
9
9
|
"Vehicle Type Monitoring": "vehicle_monitoring",
|
|
10
|
+
"Vehicle Monitoring": "vehicle_monitoring",
|
|
11
|
+
"vehicle-monitoring": "vehicle_monitoring",
|
|
10
12
|
"weapon_detection": "weapon_detection",
|
|
11
13
|
"traffic_sign_monitoring": "traffic_sign_monitoring",
|
|
12
14
|
"flare_analysis": "flare_analysis",
|
|
13
15
|
"ppe_compliance": "ppe_compliance",
|
|
14
|
-
"
|
|
16
|
+
"Customer Activity Analysis": "advanced_customer_service",
|
|
15
17
|
"assembly_line_detection": "assembly_line_detection",
|
|
16
18
|
"crop_weed_detection" : "crop_weed_detection",
|
|
17
19
|
"emergency_vehicle_detection": "emergency_vehicle_detection",
|
|
@@ -65,6 +67,12 @@ APP_NAME_TO_USECASE = {
|
|
|
65
67
|
"underground_pipeline_defect" : "underground_pipeline_defect",
|
|
66
68
|
"suspicious_activity_detection": "suspicious_activity_detection",
|
|
67
69
|
"natural_disaster_detection": "natural_disaster_detection",
|
|
70
|
+
"Foot Fall": "footfall",
|
|
71
|
+
"Parking Lot Vehicle Monitoring": "vehicle_monitoring_parking_lot",
|
|
72
|
+
"vehicle_monitoring_parking_lot": "vehicle_monitoring_parking_lot",
|
|
73
|
+
"Vehicle Monitoring Parking Lot": "vehicle_monitoring_parking_lot",
|
|
74
|
+
"Drone view vehicle monitoring": "vehicle_monitoring_drone_view",
|
|
75
|
+
"Parking Lot Analytics": "parking_lot_analytics",
|
|
68
76
|
}
|
|
69
77
|
|
|
70
78
|
APP_NAME_TO_CATEGORY = {
|
|
@@ -76,11 +84,13 @@ APP_NAME_TO_CATEGORY = {
|
|
|
76
84
|
"pipeline_detection": "pipeline_detection",
|
|
77
85
|
"vehicle_monitoring": "traffic",
|
|
78
86
|
"Vehicle Type Monitoring": "traffic",
|
|
87
|
+
"Vehicle Monitoring": "traffic",
|
|
88
|
+
"vehicle-monitoring": "traffic",
|
|
79
89
|
"weapon_detection": "security",
|
|
80
90
|
"traffic_sign_monitoring": "traffic",
|
|
81
91
|
"flare_analysis": "flare_detection",
|
|
82
92
|
"ppe_compliance": "security",
|
|
83
|
-
"
|
|
93
|
+
"Customer Activity Analysis": "sales",
|
|
84
94
|
"assembly_line_detection": "manufacturing",
|
|
85
95
|
"crop_weed_detection": "agriculture",
|
|
86
96
|
"emergency_vehicle_detection": "traffic",
|
|
@@ -135,6 +145,12 @@ APP_NAME_TO_CATEGORY = {
|
|
|
135
145
|
"underground_pipeline_defect" : "general",
|
|
136
146
|
"suspicious_activity_detection": "security",
|
|
137
147
|
"natural_disaster_detection": "environmental",
|
|
148
|
+
"Foot Fall": "retail",
|
|
149
|
+
"Parking Lot Vehicle Monitoring": "traffic",
|
|
150
|
+
"vehicle_monitoring_parking_lot": "traffic",
|
|
151
|
+
"Vehicle Monitoring Parking Lot": "traffic",
|
|
152
|
+
"Drone view vehicle monitoring": "traffic",
|
|
153
|
+
"Parking Lot Analytics": "traffic",
|
|
138
154
|
}
|
|
139
155
|
|
|
140
156
|
def get_usecase_from_app_name(app_name: str) -> str:
|
|
@@ -352,14 +352,19 @@ class AlertConfig:
|
|
|
352
352
|
@dataclass
|
|
353
353
|
class PeopleCountingConfig(BaseConfig):
|
|
354
354
|
"""Configuration for people counting use case."""
|
|
355
|
-
|
|
355
|
+
|
|
356
356
|
# Smoothing configuration
|
|
357
357
|
enable_smoothing: bool = True
|
|
358
358
|
smoothing_algorithm: str = "observability" # "window" or "observability"
|
|
359
359
|
smoothing_window_size: int = 20
|
|
360
360
|
smoothing_cooldown_frames: int = 5
|
|
361
361
|
smoothing_confidence_range_factor: float = 0.5
|
|
362
|
-
|
|
362
|
+
|
|
363
|
+
# ====== PERFORMANCE: Tracker selection (both disabled by default for max throughput) ======
|
|
364
|
+
enable_advanced_tracker: bool = False # Heavy O(n³) tracker - enable only when tracking quality is critical
|
|
365
|
+
enable_simple_tracker: bool = False # Lightweight O(n) tracker - fast but no cross-frame persistence
|
|
366
|
+
# ====== END PERFORMANCE CONFIG ======
|
|
367
|
+
|
|
363
368
|
# Zone configuration
|
|
364
369
|
zone_config: Optional[ZoneConfig] = None
|
|
365
370
|
|
|
@@ -901,6 +906,10 @@ class ConfigManager:
|
|
|
901
906
|
'underground_pipeline_defect' : None,
|
|
902
907
|
'suspicious_activity_detection': None,
|
|
903
908
|
'natural_disaster_detection': None,
|
|
909
|
+
'footfall': None,
|
|
910
|
+
'vehicle_monitoring_parking_lot': None,
|
|
911
|
+
'vehicle_monitoring_drone_view': None,
|
|
912
|
+
'parking_lot_analytics': None,
|
|
904
913
|
|
|
905
914
|
#Put all image based usecases here::
|
|
906
915
|
'blood_cancer_detection_img': None,
|
|
@@ -1405,7 +1414,39 @@ class ConfigManager:
|
|
|
1405
1414
|
return NaturalDisasterConfig
|
|
1406
1415
|
except ImportError:
|
|
1407
1416
|
return None
|
|
1408
|
-
|
|
1417
|
+
|
|
1418
|
+
def footfall_detection_config_class(self):
|
|
1419
|
+
"""Register a configuration class for a use case."""
|
|
1420
|
+
try:
|
|
1421
|
+
from ..usecases.footfall import FootFallConfig
|
|
1422
|
+
return FootFallConfig
|
|
1423
|
+
except ImportError:
|
|
1424
|
+
return None
|
|
1425
|
+
|
|
1426
|
+
def vehicle_monitoring_parking_lot_config_class(self):
|
|
1427
|
+
"""Register a configuration class for a use case."""
|
|
1428
|
+
try:
|
|
1429
|
+
from ..usecases.vehicle_monitoring_parking_lot import VehicleMonitoringParkingLotConfig
|
|
1430
|
+
return VehicleMonitoringParkingLotConfig
|
|
1431
|
+
except ImportError:
|
|
1432
|
+
return None
|
|
1433
|
+
|
|
1434
|
+
def vehicle_monitoring_drone_view_config_class(self):
|
|
1435
|
+
"""Register a configuration class for a use case."""
|
|
1436
|
+
try:
|
|
1437
|
+
from ..usecases.vehicle_monitoring_drone_view import VehicleMonitoringDroneViewConfig
|
|
1438
|
+
return VehicleMonitoringDroneViewConfig
|
|
1439
|
+
except ImportError:
|
|
1440
|
+
return None
|
|
1441
|
+
|
|
1442
|
+
def parking_lot_analytics_config_class(self):
|
|
1443
|
+
"""Register a configuration class for a use case."""
|
|
1444
|
+
try:
|
|
1445
|
+
from ..usecases.parking_lot_analytics import ParkingLotAnalyticsConfig
|
|
1446
|
+
return ParkingLotAnalyticsConfig
|
|
1447
|
+
except ImportError:
|
|
1448
|
+
return None
|
|
1449
|
+
|
|
1409
1450
|
#put all image based usecases here::
|
|
1410
1451
|
def blood_cancer_detection_config_class(self):
|
|
1411
1452
|
"""Register a configuration class for a use case."""
|
|
@@ -2009,15 +2050,27 @@ class ConfigManager:
|
|
|
2009
2050
|
from ..usecases.vehicle_monitoring import VehicleMonitoringConfig
|
|
2010
2051
|
|
|
2011
2052
|
# Handle nested configurations
|
|
2053
|
+
zone_config = kwargs.pop("zone_config", None)
|
|
2054
|
+
# VehicleMonitoringConfig expects zone_config as Dict, not ZoneConfig object
|
|
2055
|
+
# If it's a ZoneConfig object, convert it to dict
|
|
2056
|
+
if zone_config and hasattr(zone_config, 'to_dict'):
|
|
2057
|
+
zone_config = zone_config.to_dict()
|
|
2058
|
+
elif zone_config and isinstance(zone_config, ZoneConfig):
|
|
2059
|
+
zone_config = {"zones": zone_config.zones} if zone_config.zones else None
|
|
2060
|
+
|
|
2012
2061
|
alert_config = kwargs.pop("alert_config", None)
|
|
2013
2062
|
if alert_config and isinstance(alert_config, dict):
|
|
2014
2063
|
alert_config = AlertConfig(**alert_config)
|
|
2015
2064
|
|
|
2065
|
+
# Filter kwargs to only include valid parameters
|
|
2066
|
+
filtered_kwargs = self._filter_kwargs_for_config(VehicleMonitoringConfig, kwargs)
|
|
2067
|
+
|
|
2016
2068
|
config = VehicleMonitoringConfig(
|
|
2017
2069
|
category=category or "traffic",
|
|
2018
2070
|
usecase=usecase,
|
|
2071
|
+
zone_config=zone_config,
|
|
2019
2072
|
alert_config=alert_config,
|
|
2020
|
-
**
|
|
2073
|
+
**filtered_kwargs
|
|
2021
2074
|
)
|
|
2022
2075
|
|
|
2023
2076
|
elif usecase == "drone_traffic_monitoring":
|
|
@@ -2684,6 +2737,70 @@ class ConfigManager:
|
|
|
2684
2737
|
**kwargs
|
|
2685
2738
|
)
|
|
2686
2739
|
|
|
2740
|
+
elif usecase == "footfall":
|
|
2741
|
+
# Import here to avoid circular import
|
|
2742
|
+
from ..usecases.footfall import FootFallConfig
|
|
2743
|
+
|
|
2744
|
+
# Handle nested configurations
|
|
2745
|
+
alert_config = kwargs.pop("alert_config", None)
|
|
2746
|
+
if alert_config and isinstance(alert_config, dict):
|
|
2747
|
+
alert_config = AlertConfig(**alert_config)
|
|
2748
|
+
|
|
2749
|
+
config = FootFallConfig(
|
|
2750
|
+
category=category or "retail",
|
|
2751
|
+
usecase=usecase,
|
|
2752
|
+
alert_config=alert_config,
|
|
2753
|
+
**kwargs
|
|
2754
|
+
)
|
|
2755
|
+
|
|
2756
|
+
elif usecase == "vehicle_monitoring_parking_lot":
|
|
2757
|
+
# Import here to avoid circular import
|
|
2758
|
+
from ..usecases.vehicle_monitoring_parking_lot import VehicleMonitoringParkingLotConfig
|
|
2759
|
+
|
|
2760
|
+
# Handle nested configurations
|
|
2761
|
+
alert_config = kwargs.pop("alert_config", None)
|
|
2762
|
+
if alert_config and isinstance(alert_config, dict):
|
|
2763
|
+
alert_config = AlertConfig(**alert_config)
|
|
2764
|
+
|
|
2765
|
+
config = VehicleMonitoringParkingLotConfig(
|
|
2766
|
+
category=category or "traffic",
|
|
2767
|
+
usecase=usecase,
|
|
2768
|
+
alert_config=alert_config,
|
|
2769
|
+
**kwargs
|
|
2770
|
+
)
|
|
2771
|
+
|
|
2772
|
+
elif usecase == "vehicle_monitoring_drone_view":
|
|
2773
|
+
# Import here to avoid circular import
|
|
2774
|
+
from ..usecases.vehicle_monitoring_drone_view import VehicleMonitoringDroneViewConfig
|
|
2775
|
+
|
|
2776
|
+
# Handle nested configurations
|
|
2777
|
+
alert_config = kwargs.pop("alert_config", None)
|
|
2778
|
+
if alert_config and isinstance(alert_config, dict):
|
|
2779
|
+
alert_config = AlertConfig(**alert_config)
|
|
2780
|
+
|
|
2781
|
+
config = VehicleMonitoringDroneViewConfig(
|
|
2782
|
+
category=category or "traffic",
|
|
2783
|
+
usecase=usecase,
|
|
2784
|
+
alert_config=alert_config,
|
|
2785
|
+
**kwargs
|
|
2786
|
+
)
|
|
2787
|
+
|
|
2788
|
+
elif usecase == "parking_lot_analytics":
|
|
2789
|
+
# Import here to avoid circular import
|
|
2790
|
+
from ..usecases.parking_lot_analytics import ParkingLotAnalyticsConfig
|
|
2791
|
+
|
|
2792
|
+
# Handle nested configurations
|
|
2793
|
+
alert_config = kwargs.pop("alert_config", None)
|
|
2794
|
+
if alert_config and isinstance(alert_config, dict):
|
|
2795
|
+
alert_config = AlertConfig(**alert_config)
|
|
2796
|
+
|
|
2797
|
+
config = ParkingLotAnalyticsConfig(
|
|
2798
|
+
category=category or "traffic",
|
|
2799
|
+
usecase=usecase,
|
|
2800
|
+
alert_config=alert_config,
|
|
2801
|
+
**kwargs
|
|
2802
|
+
)
|
|
2803
|
+
|
|
2687
2804
|
#Add IMAGE based usecases here::
|
|
2688
2805
|
elif usecase == "blood_cancer_detection_img":
|
|
2689
2806
|
# Import here to avoid circular import
|
|
@@ -3234,6 +3351,31 @@ class ConfigManager:
|
|
|
3234
3351
|
from ..usecases.natural_disaster import NaturalDisasterConfig
|
|
3235
3352
|
default_config = NaturalDisasterConfig()
|
|
3236
3353
|
return default_config.to_dict()
|
|
3354
|
+
|
|
3355
|
+
elif usecase == "footfall":
|
|
3356
|
+
# Import here to avoid circular import
|
|
3357
|
+
from ..usecases.footfall import FootFallConfig
|
|
3358
|
+
default_config = FootFallConfig()
|
|
3359
|
+
return default_config.to_dict()
|
|
3360
|
+
|
|
3361
|
+
elif usecase == "vehicle_monitoring_parking_lot":
|
|
3362
|
+
# Import here to avoid circular import
|
|
3363
|
+
from ..usecases.vehicle_monitoring_parking_lot import VehicleMonitoringParkingLotConfig
|
|
3364
|
+
default_config = VehicleMonitoringParkingLotConfig()
|
|
3365
|
+
return default_config.to_dict()
|
|
3366
|
+
|
|
3367
|
+
elif usecase == "vehicle_monitoring_drone_view":
|
|
3368
|
+
# Import here to avoid circular import
|
|
3369
|
+
from ..usecases.vehicle_monitoring_drone_view import VehicleMonitoringDroneViewConfig
|
|
3370
|
+
default_config = VehicleMonitoringDroneViewConfig()
|
|
3371
|
+
return default_config.to_dict()
|
|
3372
|
+
|
|
3373
|
+
elif usecase == "parking_lot_analytics":
|
|
3374
|
+
# Import here to avoid circular import
|
|
3375
|
+
from ..usecases.parking_lot_analytics import ParkingLotAnalyticsConfig
|
|
3376
|
+
default_config = ParkingLotAnalyticsConfig()
|
|
3377
|
+
return default_config.to_dict()
|
|
3378
|
+
|
|
3237
3379
|
|
|
3238
3380
|
elif usecase == "underground_pipeline_defect":
|
|
3239
3381
|
# Import here to avoid circular import
|