matrice-analytics 0.1.106__py3-none-any.whl → 0.1.124__py3-none-any.whl

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 (24) hide show
  1. matrice_analytics/post_processing/__init__.py +22 -0
  2. matrice_analytics/post_processing/config.py +15 -0
  3. matrice_analytics/post_processing/core/config.py +107 -1
  4. matrice_analytics/post_processing/face_reg/face_recognition.py +2 -2
  5. matrice_analytics/post_processing/post_processor.py +16 -0
  6. matrice_analytics/post_processing/usecases/__init__.py +9 -0
  7. matrice_analytics/post_processing/usecases/crowdflow.py +1088 -0
  8. matrice_analytics/post_processing/usecases/footfall.py +103 -62
  9. matrice_analytics/post_processing/usecases/license_plate_monitoring.py +2 -1
  10. matrice_analytics/post_processing/usecases/parking_lot_analytics.py +1137 -0
  11. matrice_analytics/post_processing/usecases/vehicle_monitoring.py +30 -4
  12. matrice_analytics/post_processing/usecases/vehicle_monitoring_drone_view.py +33 -6
  13. matrice_analytics/post_processing/usecases/vehicle_monitoring_parking_lot.py +18 -2
  14. matrice_analytics/post_processing/usecases/vehicle_monitoring_wrong_way.py +1021 -0
  15. matrice_analytics/post_processing/utils/alert_instance_utils.py +18 -5
  16. matrice_analytics/post_processing/utils/business_metrics_manager_utils.py +25 -2
  17. matrice_analytics/post_processing/utils/incident_manager_utils.py +12 -1
  18. matrice_analytics/post_processing/utils/parking_analytics_tracker.py +359 -0
  19. matrice_analytics/post_processing/utils/wrong_way_tracker.py +670 -0
  20. {matrice_analytics-0.1.106.dist-info → matrice_analytics-0.1.124.dist-info}/METADATA +1 -1
  21. {matrice_analytics-0.1.106.dist-info → matrice_analytics-0.1.124.dist-info}/RECORD +24 -19
  22. {matrice_analytics-0.1.106.dist-info → matrice_analytics-0.1.124.dist-info}/WHEEL +0 -0
  23. {matrice_analytics-0.1.106.dist-info → matrice_analytics-0.1.124.dist-info}/licenses/LICENSE.txt +0 -0
  24. {matrice_analytics-0.1.106.dist-info → matrice_analytics-0.1.124.dist-info}/top_level.txt +0 -0
@@ -86,6 +86,7 @@ from .usecases.parking import ParkingConfig
86
86
  from .usecases.abandoned_object_detection import AbandonedObjectConfig
87
87
  from .usecases.footfall import FootFallConfig
88
88
  from .usecases.vehicle_monitoring import VehicleMonitoringConfig
89
+ from .usecases.crowdflow import CrowdflowConfig
89
90
 
90
91
  from .usecases.weld_defect_detection import WeldDefectConfig
91
92
  from .usecases.weapon_detection import WeaponDetectionConfig
@@ -132,6 +133,9 @@ from .usecases.natural_disaster import NaturalDisasterConfig, NaturalDisasterUse
132
133
  from .usecases.footfall import FootFallUseCase
133
134
  from .usecases.vehicle_monitoring_parking_lot import VehicleMonitoringParkingLotUseCase, VehicleMonitoringParkingLotConfig
134
135
  from .usecases.vehicle_monitoring_drone_view import VehicleMonitoringDroneViewUseCase, VehicleMonitoringDroneViewConfig
136
+ from .usecases.parking_lot_analytics import ParkingLotAnalyticsConfig, ParkingLotAnalyticsUseCase
137
+ from .usecases.vehicle_monitoring_wrong_way import VehicleMonitoringWrongWayConfig, VehicleMonitoringWrongWayUseCase
138
+ from .usecases.crowdflow import CrowdflowUseCase
135
139
 
136
140
  #Put all IMAGE based usecases here
137
141
  from .usecases.blood_cancer_detection_img import BloodCancerDetectionConfig, BloodCancerDetectionUseCase
@@ -212,6 +216,9 @@ from .usecases import (
212
216
  FootFallUseCase,
213
217
  VehicleMonitoringParkingLotUseCase,
214
218
  VehicleMonitoringDroneViewUseCase,
219
+ ParkingLotAnalyticsUseCase,
220
+ VehicleMonitoringWrongWayUseCase,
221
+ CrowdflowUseCase,
215
222
 
216
223
  #Put all IMAGE based usecases here
217
224
  BloodCancerDetectionUseCase,
@@ -296,6 +303,9 @@ _natural_disaster = NaturalDisasterUseCase()
296
303
  _footfall = FootFallUseCase()
297
304
  _vehicle_monitoring_parking_lot = VehicleMonitoringParkingLotUseCase()
298
305
  _vehicle_monitoring_drone_view = VehicleMonitoringDroneViewUseCase()
306
+ _parking_lot_analytics = ParkingLotAnalyticsUseCase()
307
+ _vehicle_monitoring_wrong_way = VehicleMonitoringWrongWayUseCase()
308
+ _crowdflow= CrowdflowUseCase()
299
309
 
300
310
  # Face recognition with embeddings
301
311
  _face_recognition = FaceRecognitionEmbeddingUseCase()
@@ -383,6 +393,9 @@ registry.register_use_case(_natural_disaster.category, _natural_disaster.name, N
383
393
  registry.register_use_case(_footfall.category, _footfall.name, FaceEmotionUseCase)
384
394
  registry.register_use_case(_vehicle_monitoring_parking_lot.category, _vehicle_monitoring_parking_lot.name, VehicleMonitoringParkingLotUseCase)
385
395
  registry.register_use_case(_vehicle_monitoring_drone_view.category, _vehicle_monitoring_drone_view.name, VehicleMonitoringDroneViewUseCase)
396
+ registry.register_use_case(_parking_lot_analytics.category, _parking_lot_analytics.name, ParkingLotAnalyticsUseCase)
397
+ registry.register_use_case(_vehicle_monitoring_wrong_way.category, _vehicle_monitoring_wrong_way.name, VehicleMonitoringWrongWayUseCase)
398
+ registry.register_use_case(_crowdflow.category, _crowdflow.name, CrowdflowUseCase )
386
399
 
387
400
  #Put all IMAGE based usecases here
388
401
  registry.register_use_case(_blood_cancer_detection.category, _blood_cancer_detection.name, BloodCancerDetectionUseCase)
@@ -591,6 +604,10 @@ __all__ = [
591
604
  'FootFallConfig',
592
605
  'VehicleMonitoringParkingLotConfig',
593
606
  'VehicleMonitoringDroneViewConfig',
607
+ 'ParkingLotAnalyticsConfig',
608
+ 'VehicleMonitoringWrongWayConfig',
609
+
610
+ 'CrowdflowConfig'
594
611
  #Put all IMAGE based usecase CONFIGS here
595
612
  'BloodCancerDetectionConfig',
596
613
  'SkinCancerClassificationConfig',
@@ -667,6 +684,9 @@ __all__ = [
667
684
  'FootFallUseCase',
668
685
  'VehicleMonitoringParkingLotUseCase',
669
686
  'VehicleMonitoringDroneViewUseCase',
687
+ 'ParkingLotAnalyticsUseCase',
688
+ 'VehicleMonitoringWrongWayUseCase',
689
+ 'CrowdflowUseCase'
670
690
 
671
691
  #Put all IMAGE based usecases here
672
692
  'BloodCancerDetectionUseCase',
@@ -729,6 +749,8 @@ __all__ = [
729
749
  'detect_line_crossings',
730
750
  'analyze_track_movements',
731
751
  'filter_tracks_by_duration',
752
+ 'ParkingAnalyticsTracker',
753
+ 'WrongWayDetectionTracker',
732
754
 
733
755
  # New utilities
734
756
  'create_people_counting_config',
@@ -7,6 +7,8 @@ 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",
@@ -66,8 +68,14 @@ APP_NAME_TO_USECASE = {
66
68
  "suspicious_activity_detection": "suspicious_activity_detection",
67
69
  "natural_disaster_detection": "natural_disaster_detection",
68
70
  "Foot Fall": "footfall",
71
+ "Crowdflow": "crowdflow",
69
72
  "Parking Lot Vehicle Monitoring": "vehicle_monitoring_parking_lot",
73
+ "vehicle_monitoring_parking_lot": "vehicle_monitoring_parking_lot",
74
+ "Vehicle Monitoring Parking Lot": "vehicle_monitoring_parking_lot",
70
75
  "Drone view vehicle monitoring": "vehicle_monitoring_drone_view",
76
+ "Parking Lot Analytics": "parking_lot_analytics",
77
+ "Vehicle Monitoring Wrong Way": "vehicle_monitoring_wrong_way",
78
+
71
79
  }
72
80
 
73
81
  APP_NAME_TO_CATEGORY = {
@@ -79,6 +87,8 @@ APP_NAME_TO_CATEGORY = {
79
87
  "pipeline_detection": "pipeline_detection",
80
88
  "vehicle_monitoring": "traffic",
81
89
  "Vehicle Type Monitoring": "traffic",
90
+ "Vehicle Monitoring": "traffic",
91
+ "vehicle-monitoring": "traffic",
82
92
  "weapon_detection": "security",
83
93
  "traffic_sign_monitoring": "traffic",
84
94
  "flare_analysis": "flare_detection",
@@ -139,8 +149,13 @@ APP_NAME_TO_CATEGORY = {
139
149
  "suspicious_activity_detection": "security",
140
150
  "natural_disaster_detection": "environmental",
141
151
  "Foot Fall": "retail",
152
+ "Crowdflow": "retail",
142
153
  "Parking Lot Vehicle Monitoring": "traffic",
154
+ "vehicle_monitoring_parking_lot": "traffic",
155
+ "Vehicle Monitoring Parking Lot": "traffic",
143
156
  "Drone view vehicle monitoring": "traffic",
157
+ "Parking Lot Analytics": "traffic",
158
+ "Vehicle Monitoring Wrong Way": "traffic",
144
159
  }
145
160
 
146
161
  def get_usecase_from_app_name(app_name: str) -> str:
@@ -909,6 +909,9 @@ class ConfigManager:
909
909
  'footfall': None,
910
910
  'vehicle_monitoring_parking_lot': None,
911
911
  'vehicle_monitoring_drone_view': None,
912
+ 'parking_lot_analytics': None,
913
+ 'vehicle_monitoring_wrong_way': None,
914
+ 'crowdflow': None,
912
915
 
913
916
  #Put all image based usecases here::
914
917
  'blood_cancer_detection_img': None,
@@ -1438,6 +1441,31 @@ class ConfigManager:
1438
1441
  except ImportError:
1439
1442
  return None
1440
1443
 
1444
+ def parking_lot_analytics_config_class(self):
1445
+ """Register a configuration class for a use case."""
1446
+ try:
1447
+ from ..usecases.parking_lot_analytics import ParkingLotAnalyticsConfig
1448
+ return ParkingLotAnalyticsConfig
1449
+ except ImportError:
1450
+ return None
1451
+
1452
+ def crowdflow_detection_config_class(self):
1453
+ """Register a configuration class for a use case."""
1454
+ try:
1455
+ from ..usecases.crowdflow import CrowdflowConfig
1456
+ return CrowdflowConfig
1457
+ except ImportError:
1458
+ return None
1459
+
1460
+
1461
+ def vehicle_monitoring_wrong_way_config_class(self):
1462
+ """Register a configuration class for a use case."""
1463
+ try:
1464
+ from ..usecases.vehicle_monitoring_wrong_way import VehicleMonitoringWrongWayConfig
1465
+ return VehicleMonitoringWrongWayConfig
1466
+ except ImportError:
1467
+ return None
1468
+
1441
1469
  #put all image based usecases here::
1442
1470
  def blood_cancer_detection_config_class(self):
1443
1471
  """Register a configuration class for a use case."""
@@ -2041,15 +2069,27 @@ class ConfigManager:
2041
2069
  from ..usecases.vehicle_monitoring import VehicleMonitoringConfig
2042
2070
 
2043
2071
  # Handle nested configurations
2072
+ zone_config = kwargs.pop("zone_config", None)
2073
+ # VehicleMonitoringConfig expects zone_config as Dict, not ZoneConfig object
2074
+ # If it's a ZoneConfig object, convert it to dict
2075
+ if zone_config and hasattr(zone_config, 'to_dict'):
2076
+ zone_config = zone_config.to_dict()
2077
+ elif zone_config and isinstance(zone_config, ZoneConfig):
2078
+ zone_config = {"zones": zone_config.zones} if zone_config.zones else None
2079
+
2044
2080
  alert_config = kwargs.pop("alert_config", None)
2045
2081
  if alert_config and isinstance(alert_config, dict):
2046
2082
  alert_config = AlertConfig(**alert_config)
2047
2083
 
2084
+ # Filter kwargs to only include valid parameters
2085
+ filtered_kwargs = self._filter_kwargs_for_config(VehicleMonitoringConfig, kwargs)
2086
+
2048
2087
  config = VehicleMonitoringConfig(
2049
2088
  category=category or "traffic",
2050
2089
  usecase=usecase,
2090
+ zone_config=zone_config,
2051
2091
  alert_config=alert_config,
2052
- **kwargs
2092
+ **filtered_kwargs
2053
2093
  )
2054
2094
 
2055
2095
  elif usecase == "drone_traffic_monitoring":
@@ -2763,6 +2803,56 @@ class ConfigManager:
2763
2803
  alert_config=alert_config,
2764
2804
  **kwargs
2765
2805
  )
2806
+
2807
+ elif usecase == "parking_lot_analytics":
2808
+ # Import here to avoid circular import
2809
+ from ..usecases.parking_lot_analytics import ParkingLotAnalyticsConfig
2810
+
2811
+ # Handle nested configurations
2812
+ alert_config = kwargs.pop("alert_config", None)
2813
+ if alert_config and isinstance(alert_config, dict):
2814
+ alert_config = AlertConfig(**alert_config)
2815
+
2816
+ config = ParkingLotAnalyticsConfig(
2817
+ category=category or "traffic",
2818
+ usecase=usecase,
2819
+ alert_config=alert_config,
2820
+ **kwargs
2821
+ )
2822
+
2823
+ elif usecase == "crowdflow":
2824
+ # Import here to avoid circular import
2825
+ from ..usecases.crowdflow import CrowdflowConfig
2826
+
2827
+ # Handle nested configurations
2828
+ alert_config = kwargs.pop("alert_config", None)
2829
+ if alert_config and isinstance(alert_config, dict):
2830
+ alert_config = AlertConfig(**alert_config)
2831
+
2832
+ config = CrowdflowConfig(
2833
+ category=category or "retail",
2834
+ usecase=usecase,
2835
+ alert_config=alert_config,
2836
+ **kwargs
2837
+ )
2838
+
2839
+
2840
+ elif usecase == "vehicle_monitoring_wrong_way":
2841
+ # Import here to avoid circular import
2842
+ from ..usecases.vehicle_monitoring_wrong_way import VehicleMonitoringWrongWayConfig
2843
+
2844
+ # Handle nested configurations
2845
+ alert_config = kwargs.pop("alert_config", None)
2846
+ if alert_config and isinstance(alert_config, dict):
2847
+ alert_config = AlertConfig(**alert_config)
2848
+
2849
+ config = VehicleMonitoringWrongWayConfig(
2850
+ category=category or "traffic",
2851
+ usecase=usecase,
2852
+ alert_config=alert_config,
2853
+ **kwargs
2854
+ )
2855
+
2766
2856
 
2767
2857
  #Add IMAGE based usecases here::
2768
2858
  elif usecase == "blood_cancer_detection_img":
@@ -3333,6 +3423,22 @@ class ConfigManager:
3333
3423
  default_config = VehicleMonitoringDroneViewConfig()
3334
3424
  return default_config.to_dict()
3335
3425
 
3426
+ elif usecase == "parking_lot_analytics":
3427
+ # Import here to avoid circular import
3428
+ from ..usecases.parking_lot_analytics import ParkingLotAnalyticsConfig
3429
+ default_config = ParkingLotAnalyticsConfig()
3430
+
3431
+ elif usecase == "crowdflow":
3432
+ # Import here to avoid circular import
3433
+ from ..usecases.crowdflow import CrowdflowConfig
3434
+ default_config = CrowdflowConfig()
3435
+ return default_config.to_dict()
3436
+
3437
+ elif usecase == "vehicle_monitoring_wrong_way":
3438
+ # Import here to avoid circular import
3439
+ from ..usecases.vehicle_monitoring_wrong_way import VehicleMonitoringWrongWayConfig
3440
+ default_config = VehicleMonitoringWrongWayConfig()
3441
+ return default_config.to_dict()
3336
3442
 
3337
3443
  elif usecase == "underground_pipeline_defect":
3338
3444
  # Import here to avoid circular import
@@ -1537,9 +1537,9 @@ class FaceRecognitionEmbeddingConfig(BaseConfig):
1537
1537
  smoothing_confidence_range_factor: float = 0.5
1538
1538
 
1539
1539
  # Base confidence threshold (separate from embedding similarity threshold)
1540
- similarity_threshold: float = 0.5 # 0.3 Lowered to match local code - 0.45 was too conservative
1540
+ similarity_threshold: float = 0.45 # 0.3 Lowered to match local code - 0.45 was too conservative
1541
1541
  # Base confidence threshold (separate from embedding similarity threshold)
1542
- confidence_threshold: float = 0.03 # 0.06 Detection confidence threshold
1542
+ confidence_threshold: float = 0.1 # 0.06 Detection confidence threshold
1543
1543
 
1544
1544
  # Face recognition optional features
1545
1545
  enable_face_tracking: bool = True # Enable BYTE TRACKER advanced face tracking -- KEEP IT TRUE ALWAYS
@@ -100,8 +100,15 @@ from .usecases import (
100
100
  SusActivityUseCase,
101
101
  NaturalDisasterUseCase,
102
102
  FootFallUseCase,
103
+ CrowdflowUseCase,
103
104
  VehicleMonitoringParkingLotUseCase,
104
105
  VehicleMonitoringDroneViewUseCase,
106
+ ParkingLotAnalyticsUseCase,
107
+ <<<<<<< HEAD
108
+ VehicleMonitoringWrongWayUseCase,
109
+ =======
110
+
111
+ >>>>>>> eaa173c (added new crowdflow usecase)
105
112
  # Put all IMAGE based usecases here
106
113
  BloodCancerDetectionUseCase,
107
114
  SkinCancerClassificationUseCase,
@@ -581,6 +588,15 @@ class PostProcessor:
581
588
  registry.register_use_case(
582
589
  "traffic", "vehicle_monitoring_drone_view", VehicleMonitoringDroneViewUseCase
583
590
  )
591
+ registry.register_use_case(
592
+ "traffic", "parking_lot_analytics", ParkingLotAnalyticsUseCase
593
+ )
594
+ registry.register_use_case(
595
+ "retail", "crowdflow", CrowdflowUseCase
596
+ )
597
+ registry.register_use_case(
598
+ "traffic", "vehicle_monitoring_wrong_way", VehicleMonitoringWrongWayUseCase
599
+ )
584
600
 
585
601
  # Put all IMAGE based usecases here
586
602
  registry.register_use_case(
@@ -88,6 +88,9 @@ from .natural_disaster import NaturalDisasterConfig, NaturalDisasterUseCase
88
88
  from .footfall import FootFallConfig, FootFallUseCase
89
89
  from .vehicle_monitoring_parking_lot import VehicleMonitoringParkingLotUseCase, VehicleMonitoringParkingLotConfig
90
90
  from .vehicle_monitoring_drone_view import VehicleMonitoringDroneViewUseCase, VehicleMonitoringDroneViewConfig
91
+ from .parking_lot_analytics import ParkingLotAnalyticsUseCase, ParkingLotAnalyticsConfig
92
+ from .vehicle_monitoring_wrong_way import VehicleMonitoringWrongWayUseCase, VehicleMonitoringWrongWayConfig
93
+ from .crowdflow import CrowdflowUseCase, CrowdflowConfig
91
94
 
92
95
  #Put all IMAGE based usecases here
93
96
  from .blood_cancer_detection_img import BloodCancerDetectionConfig, BloodCancerDetectionUseCase
@@ -178,6 +181,9 @@ __all__ = [
178
181
  'FootFallUseCase',
179
182
  'VehicleMonitoringParkingLotUseCase',
180
183
  'VehicleMonitoringDroneViewUseCase',
184
+ 'ParkingLotAnalyticsUseCase',
185
+ 'VehicleMonitoringWrongWayUseCase',
186
+ 'CrowdflowUseCase',
181
187
 
182
188
  #Put all IMAGE based usecases here
183
189
  'BloodCancerDetectionUseCase',
@@ -263,6 +269,9 @@ __all__ = [
263
269
  'FootFallConfig',
264
270
  'VehicleMonitoringParkingLotConfig',
265
271
  'VehicleMonitoringDroneViewConfig',
272
+ 'ParkingLotAnalyticsConfig',
273
+ 'VehicleMonitoringWrongWayConfig',
274
+ 'CrowdflowConfig',
266
275
 
267
276
  #Put all IMAGE based usecase CONFIGS here
268
277
  'BloodCancerDetectionConfig',