matrice 1.0.99395__py3-none-any.whl → 1.0.99397__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.
@@ -18,9 +18,10 @@ dependencies_check(
18
18
  "python-snappy",
19
19
  "pyyaml",
20
20
  "imagehash",
21
- "easyocr",
22
21
  "torch",
23
- "opencv-python"
22
+ "opencv-python",
23
+ "onnxruntime-gpu",
24
+ "fast-plate-ocr[onnx-gpu]"
24
25
  ]
25
26
  )
26
27
 
@@ -18,18 +18,24 @@ from ..utils import (
18
18
  BBoxSmoothingConfig,
19
19
  BBoxSmoothingTracker
20
20
  )
21
- try:
22
- import cv2
23
- import numpy as np
24
- import torch
25
- from ..ocr.easyocr_extractor import EasyOCRExtractor
26
- from ..ocr.postprocessing import TextPostprocessor
27
- from ..ocr.preprocessing import ImagePreprocessor
28
- from ..core.config import BaseConfig, AlertConfig, ZoneConfig
29
-
30
- except:
31
- print("test-------------------------------------------------")
21
+ # External dependencies
22
+ import cv2
23
+ import numpy as np
24
+ #import torch
25
+ import re
26
+
27
+ # Fast license-plate OCR (replaces EasyOCR)
28
+ from fast_plate_ocr import LicensePlateRecognizer
32
29
 
30
+ # Internal utilities that are still required
31
+ from ..ocr.preprocessing import ImagePreprocessor
32
+ from ..core.config import BaseConfig, AlertConfig, ZoneConfig
33
+
34
+ # (Catch import errors early in the logs)
35
+ try:
36
+ _ = LicensePlateRecognizer # noqa: B018 – reference to quiet linters
37
+ except Exception as _e:
38
+ print(f"Warning: fast_plate_ocr could not be imported ⇒ {_e}")
33
39
 
34
40
 
35
41
  @dataclass
@@ -71,6 +77,17 @@ class LicensePlateMonitorConfig(BaseConfig):
71
77
  class LicensePlateMonitorUseCase(BaseProcessor):
72
78
  CATEGORY_DISPLAY = {"License_Plate": "License Plate"}
73
79
 
80
+ # --------------------------------------------------------------
81
+ # Shared resources (initialised once per process)
82
+ # --------------------------------------------------------------
83
+ _ocr_model: Optional[LicensePlateRecognizer] = None # Fast plate OCR
84
+ _non_alnum_regex = re.compile(r"[^A-Za-z0-9]+")
85
+
86
+ # Minimum length for a valid plate (after cleaning)
87
+ _min_plate_len = 5
88
+ # number of consecutive frames a plate must appear to be considered "stable"
89
+ _stable_frames_required = 3
90
+
74
91
  def __init__(self):
75
92
  super().__init__("license_plate_monitor")
76
93
  self.category = "license_plate_monitor"
@@ -91,10 +108,19 @@ class LicensePlateMonitorUseCase(BaseProcessor):
91
108
  self._seen_plate_texts = set()
92
109
  # CHANGE: Added _tracked_plate_texts to store the longest plate_text per track_id
93
110
  self._tracked_plate_texts: Dict[Any, str] = {}
94
- self._unique_plate_texts: Dict[str, str] = {}
111
+ # Containers for text stability & uniqueness
112
+ self._unique_plate_texts: Dict[str, str] = {} # cleaned_text -> original (longest)
95
113
  self.image_preprocessor = ImagePreprocessor()
96
- self.ocr_extractor = None # Initialized in process
97
- self.text_postprocessor = TextPostprocessor()
114
+ # Fast OCR model (shared across instances)
115
+ if LicensePlateMonitorUseCase._ocr_model is None:
116
+ try:
117
+ LicensePlateMonitorUseCase._ocr_model = LicensePlateRecognizer('cct-s-v1-global-model')
118
+ self.logger.info("LicensePlateRecognizer loaded successfully")
119
+ except Exception as e:
120
+ self.logger.error(f"Failed to initialise LicensePlateRecognizer: {e}")
121
+ self.ocr_model = LicensePlateMonitorUseCase._ocr_model
122
+ # OCR text history for stability checks (text → consecutive frame count)
123
+ self._text_history: Dict[str, int] = {}
98
124
 
99
125
  self.start_timer = None
100
126
  #self.reset_timer = "2025-08-19-04:22:47.187574 UTC"
@@ -112,24 +138,10 @@ class LicensePlateMonitorUseCase(BaseProcessor):
112
138
  self._tracked_plate_texts = {}
113
139
  self._total_frame_counter = 0
114
140
  self._global_frame_offset = 0
141
+ self._text_history = {}
142
+ self._unique_plate_texts = {}
115
143
  self.logger.info("Plate tracking state reset")
116
144
 
117
- # def _normalize_plate_text(self, text: str) -> str:
118
- # """Normalize plate text for comparison (e.g., remove spaces, convert to uppercase)."""
119
- # if not text or not text.strip():
120
- # return ""
121
- # text = text.replace(" ", "").upper()
122
- # # Map Arabic numerals to Latin to handle cases like ٠٠٤٦١٠
123
- # arabic_to_latin = str.maketrans("٠١٢٣٤٥٦٧٨٩", "0123456789")
124
- # text = text.translate(arabic_to_latin)
125
- # # Optional: Add OCR error corrections (e.g., 'O' to '0', 'I' to '1')
126
- # ocr_corrections = str.maketrans({'O': '0', 'I': '1', 'S': '5'})
127
- # text = text.translate(ocr_corrections)
128
- # # Validate: Ensure text is alphanumeric and at least 3 characters
129
- # if len(text) < 3 or not text.isalnum():
130
- # return ""
131
- # return text
132
-
133
145
  def reset_all_tracking(self) -> None:
134
146
  """Reset both advanced tracker and plate tracking state."""
135
147
  self.reset_tracker()
@@ -152,19 +164,19 @@ class LicensePlateMonitorUseCase(BaseProcessor):
152
164
  return self.create_error_result("input_bytes (video/image) is required for license plate monitoring",
153
165
  usecase=self.name, category=self.category, context=context)
154
166
 
155
- # if not data:
156
- # return self.create_result(
157
- # data={"agg_summary": {}},
158
- # usecase=self.name,
159
- # category=self.category,
160
- # context=context
161
- # )
162
- # return self.create_error_result("Detection data is required for license plate monitoring",
163
- # usecase=self.name, category=self.category, context=context)
164
-
165
167
  # Initialize OCR extractor if not already done
166
- if self.ocr_extractor is None:
167
- self.ocr_extractor = EasyOCRExtractor(lang=config.language, gpu=torch.cuda.is_available(), verbose=False)
168
+ if self.ocr_model is None:
169
+ self.logger.info("Lazy initialisation fallback (should rarely happen)")
170
+ try:
171
+ LicensePlateMonitorUseCase._ocr_model = LicensePlateRecognizer('cct-s-v1-global-model')
172
+ self.ocr_model = LicensePlateMonitorUseCase._ocr_model
173
+ except Exception as e:
174
+ return self.create_error_result(
175
+ f"Failed to initialise OCR model: {e}",
176
+ usecase=self.name,
177
+ category=self.category,
178
+ context=context,
179
+ )
168
180
 
169
181
  input_format = match_results_structure(data)
170
182
  context.input_format = input_format
@@ -226,6 +238,8 @@ class LicensePlateMonitorUseCase(BaseProcessor):
226
238
 
227
239
  # Step 8: Perform OCR on media
228
240
  ocr_analysis = self._analyze_ocr_in_media(processed_data, input_bytes, config)
241
+
242
+ print("ocr_analysis", ocr_analysis)
229
243
 
230
244
  # Step 9: Update plate texts
231
245
  processed_data = self._update_detections_with_ocr(processed_data, ocr_analysis)
@@ -348,13 +362,8 @@ class LicensePlateMonitorUseCase(BaseProcessor):
348
362
  if crop.size == 0:
349
363
  continue
350
364
 
351
- preprocessed_crop = self.image_preprocessor.preprocess(crop, grayscale=True)
352
- ocr_results = self.ocr_extractor.extract(preprocessed_crop, detail=1, paragraph=False)
353
- texts = [r['text'] for r in ocr_results]
354
- confs = [r['confidence'] for r in ocr_results]
355
- processed = self.text_postprocessor.postprocess(texts, confs, task="license_plate", region=config.country, confidence_threshold=0.3)
356
- valid_processed = [p for p in processed if p[2]]
357
- plate_text = valid_processed[0][0] if valid_processed else None
365
+ plate_text_raw = self._run_ocr(crop)
366
+ plate_text = plate_text_raw if plate_text_raw else None
358
367
 
359
368
  ocr_record = {
360
369
  "frame_id": frame_key,
@@ -401,13 +410,8 @@ class LicensePlateMonitorUseCase(BaseProcessor):
401
410
  if crop.size == 0:
402
411
  continue
403
412
 
404
- preprocessed_crop = self.image_preprocessor.preprocess(crop, grayscale=True)
405
- ocr_results = self.ocr_extractor.extract(preprocessed_crop, detail=1, paragraph=False)
406
- texts = [r['text'] for r in ocr_results]
407
- confs = [r['confidence'] for r in ocr_results]
408
- processed = self.text_postprocessor.postprocess(texts, confs, task="license_plate", region=config.country, confidence_threshold=0.3)
409
- valid_processed = [p for p in processed if p[2]]
410
- plate_text = valid_processed[0][0] if valid_processed else None
413
+ plate_text_raw = self._run_ocr(crop)
414
+ plate_text = plate_text_raw if plate_text_raw else None
411
415
 
412
416
  ocr_record = {
413
417
  "frame_id": "0",
@@ -450,6 +454,31 @@ class LicensePlateMonitorUseCase(BaseProcessor):
450
454
 
451
455
  return image[ymin:ymax, xmin:xmax]
452
456
 
457
+ # ------------------------------------------------------------------
458
+ # Fast OCR helpers
459
+ # ------------------------------------------------------------------
460
+ def _clean_text(self, text: str) -> str:
461
+ """Sanitise OCR output to keep only alphanumerics and uppercase."""
462
+ if not text:
463
+ return ""
464
+ return LicensePlateMonitorUseCase._non_alnum_regex.sub('', text).upper()
465
+
466
+ def _run_ocr(self, crop: np.ndarray) -> str:
467
+ """Run OCR on a cropped plate image and return cleaned text or empty string."""
468
+ if crop is None or crop.size == 0 or self.ocr_model is None:
469
+ return ""
470
+ try:
471
+ # fast_plate_ocr expects RGB
472
+ rgb_crop = cv2.cvtColor(crop, cv2.COLOR_BGR2RGB)
473
+ res = self.ocr_model.run(rgb_crop)
474
+ if isinstance(res, list):
475
+ res = res[0] if res else ""
476
+ cleaned = self._clean_text(str(res))
477
+ return cleaned if len(cleaned) >= self._min_plate_len else ""
478
+ except Exception as exc:
479
+ self.logger.warning(f"OCR failed: {exc}")
480
+ return ""
481
+
453
482
  def _get_frame_detections(self, data: Any, frame_key: str) -> List[Dict[str, Any]]:
454
483
  """Extract detections for a specific frame from data."""
455
484
  if isinstance(data, dict):
@@ -488,45 +517,36 @@ class LicensePlateMonitorUseCase(BaseProcessor):
488
517
  return detections
489
518
 
490
519
  def _count_categories(self, detections: List[Dict], config: LicensePlateMonitorConfig) -> Dict[str, Any]:
491
- """Count detections per category and include plate texts."""
492
- counts: Dict[str, int] = {}
493
- unique_keys_per_cat: Dict[str, set] = {}
494
- valid_detections = []
520
+ """Count unique licence-plate texts per frame and attach detections."""
521
+ unique_texts: set = set()
522
+ valid_detections: List[Dict[str, Any]] = []
495
523
 
496
524
  for det in detections:
497
525
  if not all(k in det for k in ['category', 'confidence', 'bounding_box']):
498
- self.logger.warning(f"Skipping invalid detection: {det}")
499
526
  continue
500
527
 
501
528
  cat = det.get('category', 'License_Plate')
502
- track_id = det.get('track_id')
503
- # Fallback to bbox tuple when track_id is missing
504
- bbox_key = tuple(sorted(det.get('bounding_box', {}).items())) if track_id is None else None
505
- unique_key = track_id if track_id is not None else bbox_key
506
-
507
- if unique_key is None:
508
- continue # Cannot determine uniqueness
529
+ plate_text_raw = det.get('plate_text', '')
530
+ cleaned_text = self._clean_text(plate_text_raw)
509
531
 
510
- # Initialise storage for this category
511
- unique_keys_per_cat.setdefault(cat, set())
512
-
513
- # Only count once per unique key within the current frame
514
- if unique_key not in unique_keys_per_cat[cat]:
515
- unique_keys_per_cat[cat].add(unique_key)
516
- counts[cat] = counts.get(cat, 0) + 1
532
+ # Consider as unique only if meets criteria
533
+ if cleaned_text and len(cleaned_text) >= self._min_plate_len:
534
+ unique_texts.add(cleaned_text)
517
535
 
518
536
  valid_detections.append({
519
537
  "bounding_box": det.get("bounding_box"),
520
538
  "category": cat,
521
539
  "confidence": det.get("confidence"),
522
- "track_id": track_id,
540
+ "track_id": det.get('track_id'),
523
541
  "frame_id": det.get("frame_id"),
524
542
  "masks": det.get("masks", []),
525
- "plate_text": det.get("plate_text")
543
+ "plate_text": plate_text_raw
526
544
  })
527
- self.logger.debug(f"Valid detections after filtering: {len(valid_detections)}")
545
+
546
+ counts = {"License_Plate": len(unique_texts)} if unique_texts else {}
547
+
528
548
  return {
529
- "total_count": sum(counts.values()),
549
+ "total_count": len(unique_texts),
530
550
  "per_category_count": counts,
531
551
  "detections": valid_detections
532
552
  }
@@ -547,21 +567,28 @@ class LicensePlateMonitorUseCase(BaseProcessor):
547
567
  camera_info = self.get_camera_info_from_stream(stream_info)
548
568
 
549
569
  human_text_lines = []
570
+ print("counting_summary", counting_summary)
550
571
  human_text_lines.append(f"CURRENT FRAME @ {current_timestamp}:")
551
572
  if total_detections > 0:
552
573
  category_counts = [f"{count} {cat}" for cat, count in per_category_count.items()]
553
574
  detection_text = category_counts[0] + " detected" if len(category_counts) == 1 else f"{', '.join(category_counts[:-1])}, and {category_counts[-1]} detected"
554
575
  human_text_lines.append(f"\t- {detection_text}")
555
576
  # Deduplicate plate texts for the current frame while preserving order
556
- seen_plate_texts = set()
557
- plate_texts = []
577
+ seen_cleaned = set()
578
+ display_texts = []
558
579
  for det in counting_summary.get("detections", []):
559
- text = det.get("plate_text")
560
- if text and text not in seen_plate_texts:
561
- seen_plate_texts.add(text)
562
- plate_texts.append(text)
563
- if plate_texts:
564
- human_text_lines.append(f"\t- License Plates: {', '.join(plate_texts)}")
580
+ raw = det.get("plate_text", "")
581
+ cleaned = self._clean_text(raw)
582
+ if cleaned and cleaned not in seen_cleaned:
583
+ seen_cleaned.add(cleaned)
584
+ # Display the longest raw variant seen in this frame for that cleaned text
585
+ longest_variant = max(
586
+ [d.get("plate_text", "") for d in counting_summary.get("detections", []) if self._clean_text(d.get("plate_text", "")) == cleaned],
587
+ key=len,
588
+ )
589
+ display_texts.append(longest_variant)
590
+ if display_texts:
591
+ human_text_lines.append(f"\t- License Plates: {', '.join(display_texts)}")
565
592
  else:
566
593
  human_text_lines.append(f"\t- No detections")
567
594
 
@@ -569,10 +596,9 @@ class LicensePlateMonitorUseCase(BaseProcessor):
569
596
  human_text_lines.append(f"TOTAL SINCE {start_timestamp}:")
570
597
  human_text_lines.append(f"\t- Total Detected: {cumulative_total}")
571
598
 
572
- if self._tracked_plate_texts:
599
+ if self._unique_plate_texts:
573
600
  human_text_lines.append("\t- Unique License Plates:")
574
- # Deduplicate license plate texts across different track IDs
575
- for text in sorted(set(self._tracked_plate_texts.values())):
601
+ for text in sorted(self._unique_plate_texts.values()):
576
602
  human_text_lines.append(f"\t\t- {text}")
577
603
 
578
604
  current_counts = [{"category": cat, "count": count} for cat, count in per_category_count.items() if count > 0 or total_detections > 0]
@@ -585,7 +611,7 @@ class LicensePlateMonitorUseCase(BaseProcessor):
585
611
  category = detection.get("category", "License_Plate")
586
612
  plate_text = detection.get("plate_text", "")
587
613
  segmentation = detection.get("masks", detection.get("segmentation", detection.get("mask", [])))
588
- detection_obj = self.create_detection_object(category, bbox, segmentation=segmentation, plate_text=plate_text)
614
+ detection_obj = self.create_detection_object(category, bbox, segmentation=None, plate_text=plate_text)
589
615
  detections.append(detection_obj)
590
616
 
591
617
  alert_settings = []
@@ -798,24 +824,37 @@ class LicensePlateMonitorUseCase(BaseProcessor):
798
824
  text = det.get('plate_text')
799
825
  track_id = det.get('track_id')
800
826
  if text and track_id is not None:
801
- # Skip text containing Unicode escape sequences (e.g., \u0664)
802
- if r'\u' in str(text):
803
- self.logger.debug(f"Skipping plate_text={text} for track_id={track_id} due to Unicode escape sequence")
804
- continue
805
- # Update _tracked_plate_texts with the longest text for this track_id
806
- print(f"Detected license plate text: {text} (track_id={track_id})")
807
- current_text = self._tracked_plate_texts.get(track_id, '')
808
- if len(text) > len(current_text):
809
- self._tracked_plate_texts[track_id] = text
810
- self.logger.debug(f"Updated track_id={track_id} with new longest plate_text={text}")
811
- # Maintain _seen_plate_texts for compatibility
812
- self._seen_plate_texts.add(text)
813
- self.logger.debug(f"Added plate_text={text} for track_id={track_id} to seen texts")
827
+ # Clean text again to guarantee consistency
828
+ text = self._clean_text(text)
829
+ if len(text) < self._min_plate_len:
830
+ continue # Too short to be a valid plate
831
+
832
+ # ----------------------------------------------------------
833
+ # Update consecutive frame appearance counter
834
+ # ----------------------------------------------------------
835
+ self._text_history[text] = self._text_history.get(text, 0) + 1
836
+
837
+ # Accept plate as stable only after N consecutive frames
838
+ if self._text_history[text] >= self._stable_frames_required:
839
+ # Track longest string variant per track_id
840
+ current_text = self._tracked_plate_texts.get(track_id, '')
841
+ if len(text) > len(current_text):
842
+ self._tracked_plate_texts[track_id] = text
843
+ # Maintain global unique mapping (cleaned -> original longest)
844
+ longest_variant = self._unique_plate_texts.get(text, '')
845
+ if len(text) > len(longest_variant):
846
+ self._unique_plate_texts[text] = text
847
+ self.logger.debug(f"Stable plate confirmed: {text} (track_id={track_id})")
848
+
849
+ # Reset counters for texts not seen in this frame
850
+ current_frame_texts = {self._clean_text(det.get('plate_text', '')) for det in detections if det.get('plate_text')}
851
+ for t in list(self._text_history.keys()):
852
+ if t not in current_frame_texts:
853
+ self._text_history[t] = 0
814
854
 
815
855
  def get_total_counts(self):
816
856
  """Return total unique license plate texts encountered so far."""
817
- # Count unique plate texts across *all* track_ids
818
- return {'License_Plate': len(set(self._tracked_plate_texts.values()))}
857
+ return {'License_Plate': len(self._unique_plate_texts)}
819
858
 
820
859
  def _get_track_ids_info(self, detections: List[Dict]) -> Dict[str, Any]:
821
860
  """Get detailed information about track IDs."""
@@ -188,10 +188,10 @@ class VehicleMonitoringUseCase(BaseProcessor):
188
188
  counting_summary["categories"][category] = counting_summary["categories"].get(category, 0) + 1
189
189
 
190
190
  zone_analysis = {}
191
- if config.zone_config and config.zone_config.zones:
191
+ if config.zone_config and config.zone_config['zones']:
192
192
  # Convert single frame to format expected by count_objects_in_zones
193
193
  frame_data = processed_data #[frame_detections]
194
- zone_analysis = count_objects_in_zones(frame_data, config.zone_config.zones)
194
+ zone_analysis = count_objects_in_zones(frame_data, config.zone_config['zones'])
195
195
 
196
196
  # Update zone tracking with current frame data
197
197
  if zone_analysis and config.enable_tracking:
@@ -248,11 +248,11 @@ class VehicleMonitoringUseCase(BaseProcessor):
248
248
  Returns:
249
249
  Enhanced zone analysis with tracking information
250
250
  """
251
- if not zone_analysis or not config.zone_config or not config.zone_config.zones:
251
+ if not zone_analysis or not config.zone_config or not config.zone_config['zones']:
252
252
  return {}
253
253
 
254
254
  enhanced_zone_analysis = {}
255
- zones = config.zone_config.zones
255
+ zones = config.zone_config['zones']
256
256
 
257
257
  # Get current frame track IDs in each zone
258
258
  current_frame_zone_tracks = {}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: matrice
3
- Version: 1.0.99395
3
+ Version: 1.0.99397
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
@@ -91,7 +91,7 @@ matrice/data_processing/data_formats/video_mot_tracking.py,sha256=WlTikrOyVU6O_n
91
91
  matrice/data_processing/data_formats/video_mscoco_detection.py,sha256=Z4e0GXcNrj-awwM-rIOlNFJqrb0cZD3KeFrnkYJjT1A,17066
92
92
  matrice/data_processing/data_formats/video_youtube_bb_tracking.py,sha256=6RbuBOW1kfw0E626jGEZ0i5P3upgx8D5EQ0hsNVc9vs,10353
93
93
  matrice/data_processing/data_formats/yolo_detection.py,sha256=qUeZA7_8Of_QWGZlHh-mhRnBFtb5A_u89Oihx-Meg3c,10018
94
- matrice/deploy/__init__.py,sha256=tN0O7Qge3Ep2Em5ak4a1pavlIDFuj687Dw8cGd0odl4,1194
94
+ matrice/deploy/__init__.py,sha256=eKCxxed5ve_qDSDNmcBcaao7msj9rub0iS3EFstgE1I,1238
95
95
  matrice/deploy/aggregator/__init__.py,sha256=HFz-ufUMeSpSyRINcrx6NdmrcuVZtPfyIXxYu5UNLTc,508
96
96
  matrice/deploy/aggregator/aggregator.py,sha256=J1pE_RCWvxfwTwP2S2qrSX02bdT40Arhgww7OrmSbHo,11721
97
97
  matrice/deploy/aggregator/analytics.py,sha256=F0vAT7aUkK0Bb7w_P_2mT0k4R8ARWNnwCJqJ97KMAts,18312
@@ -210,7 +210,7 @@ matrice/deploy/utils/post_processing/usecases/leaf.py,sha256=cwgB1ZNxkQFtkk-thSJ
210
210
  matrice/deploy/utils/post_processing/usecases/leaf_disease.py,sha256=bkiLccTdf4KUq3he4eCpBlKXb5exr-WBhQ_oWQ7os68,36225
211
211
  matrice/deploy/utils/post_processing/usecases/leak_detection.py,sha256=oOCLLVMuXVeXPHyN8FUrD3U9JYJJwIz-5fcEMgvLdls,40531
212
212
  matrice/deploy/utils/post_processing/usecases/license_plate_detection.py,sha256=WmVmtp-GLUSNtBxjZHUtUk_M9lPp_8gA0rdzFXVL1SY,44961
213
- matrice/deploy/utils/post_processing/usecases/license_plate_monitoring.py,sha256=Si1VagGHRa9SGmNgCOryzpqFRgmRnk4tKnEu-32uhQk,53625
213
+ matrice/deploy/utils/post_processing/usecases/license_plate_monitoring.py,sha256=Xrt_RdRUtDYHA6738GsRZjx7yNNf3R09tJZ5oHUrwF0,54793
214
214
  matrice/deploy/utils/post_processing/usecases/litter_monitoring.py,sha256=XaHAUGRBDJg_iVbu8hRMjTR-5TqrLj6ZNCRkInbzZTY,33255
215
215
  matrice/deploy/utils/post_processing/usecases/mask_detection.py,sha256=MNpCcuefOdW7C8g_x_mNuWYA4mbyg8UNwomwBPoKtr0,39684
216
216
  matrice/deploy/utils/post_processing/usecases/parking.py,sha256=lqTGqcjUZZPFw3tu11Ha8BSsZ311K5--wEZnlVsXakU,34534
@@ -236,7 +236,7 @@ matrice/deploy/utils/post_processing/usecases/template_usecase.py,sha256=6NC-bTn
236
236
  matrice/deploy/utils/post_processing/usecases/theft_detection.py,sha256=Rs_zKn2z9YM10fGzTHR44Q3m8TIO1s5UMdiPWA03rbA,28671
237
237
  matrice/deploy/utils/post_processing/usecases/traffic_sign_monitoring.py,sha256=nDlEzHgMlUjy_VtJ7usnEzMcdSs-jouqaoJpJ8DYUMw,34351
238
238
  matrice/deploy/utils/post_processing/usecases/underwater_pollution_detection.py,sha256=jqP1ZKfDZe2-56Lyvgb2DxnbqRfvxm6pPL0Ck3esfBk,40356
239
- matrice/deploy/utils/post_processing/usecases/vehicle_monitoring.py,sha256=Nby9BzH2-bI2sEDyinCcgaqYfLIlAk5YXJm20ujy8Hc,45569
239
+ matrice/deploy/utils/post_processing/usecases/vehicle_monitoring.py,sha256=H8OkwowGrEbPuspl6Dg5a0lta7pxhVm8mxdFuoMEcF8,45581
240
240
  matrice/deploy/utils/post_processing/usecases/warehouse_object_segmentation.py,sha256=5uZXTJL_A3tUEN08T-_ZQpUoJ9gqbuuMc4z2mT4sMnQ,43753
241
241
  matrice/deploy/utils/post_processing/usecases/waterbody_segmentation.py,sha256=JsCxDEMB8s4WDcezfJDr2zrjM-TCjB9hxOztzSvWmpY,45268
242
242
  matrice/deploy/utils/post_processing/usecases/weapon_detection.py,sha256=gea-rjEHmP0hUjpcrcQIHOnhMMHQNqDI90cbpXHnlpI,31071
@@ -261,8 +261,8 @@ matrice/deployment/camera_manager.py,sha256=e1Lc81RJP5wUWRdTgHO6tMWF9BkBdHOSVyx3
261
261
  matrice/deployment/deployment.py,sha256=HFt151eWq6iqIAMsQvurpV2WNxW6Cx_gIUVfnVy5SWE,48093
262
262
  matrice/deployment/inference_pipeline.py,sha256=6b4Mm3-qt-Zy0BeiJfFQdImOn3FzdNCY-7ET7Rp8PMk,37911
263
263
  matrice/deployment/streaming_gateway_manager.py,sha256=ifYGl3g25wyU39HwhPQyI2OgF3M6oIqKMWt8RXtMxY8,21401
264
- matrice-1.0.99395.dist-info/licenses/LICENSE.txt,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
265
- matrice-1.0.99395.dist-info/METADATA,sha256=QIdymYQ2fJSaMttBY1eBSDyKEzxnPUiHCyj-23TGrrA,14624
266
- matrice-1.0.99395.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
267
- matrice-1.0.99395.dist-info/top_level.txt,sha256=P97js8ur6o5ClRqMH3Cjoab_NqbJ6sOQ3rJmVzKBvMc,8
268
- matrice-1.0.99395.dist-info/RECORD,,
264
+ matrice-1.0.99397.dist-info/licenses/LICENSE.txt,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
265
+ matrice-1.0.99397.dist-info/METADATA,sha256=xcuAk4GlcP2jfGZIJyknTCwBSjMrdUpDSxL5R4SbexU,14624
266
+ matrice-1.0.99397.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
267
+ matrice-1.0.99397.dist-info/top_level.txt,sha256=P97js8ur6o5ClRqMH3Cjoab_NqbJ6sOQ3rJmVzKBvMc,8
268
+ matrice-1.0.99397.dist-info/RECORD,,