From 255be78d43a494246b2985f0141dbc77db706318 Mon Sep 17 00:00:00 2001 From: ziesorx Date: Tue, 23 Sep 2025 18:08:21 +0700 Subject: [PATCH] feat: update tracking working --- core/tracking/integration.py | 11 +++ core/tracking/tracker.py | 148 ++++++++++++----------------------- 2 files changed, 62 insertions(+), 97 deletions(-) diff --git a/core/tracking/integration.py b/core/tracking/integration.py index d42d053..950a1dc 100644 --- a/core/tracking/integration.py +++ b/core/tracking/integration.py @@ -146,6 +146,17 @@ class TrackingPipelineIntegration: persist=True ) + # Debug: Log raw detection results + if tracking_results and hasattr(tracking_results, 'detections'): + raw_detections = len(tracking_results.detections) + if raw_detections > 0: + class_names = [detection.class_name for detection in tracking_results.detections] + logger.info(f"[DEBUG] Raw detections: {raw_detections}, classes: {class_names}") + else: + logger.debug(f"[DEBUG] No raw detections found") + else: + logger.debug(f"[DEBUG] No tracking results or detections attribute") + # Process tracking results tracked_vehicles = self.tracker.process_detections( tracking_results, diff --git a/core/tracking/tracker.py b/core/tracking/tracker.py index b0799de..26b35ee 100644 --- a/core/tracking/tracker.py +++ b/core/tracking/tracker.py @@ -130,111 +130,65 @@ class VehicleTracker: logger.debug(f"Removing expired track {track_id}") del self.tracked_vehicles[track_id] - # Process new detections - if hasattr(results, 'boxes') and results.boxes is not None: - boxes = results.boxes + # Process new detections from InferenceResult + if hasattr(results, 'detections') and results.detections: + # Process detections from InferenceResult + for detection in results.detections: + # Skip if confidence is too low + if detection.confidence < self.min_confidence: + continue - # Check if tracking is available - if hasattr(boxes, 'id') and boxes.id is not None: - # Process tracked objects - for i, box in enumerate(boxes): - # Get tracking ID - track_id = int(boxes.id[i].item()) if boxes.id[i] is not None else None - if track_id is None: - continue + # Check if class is in trigger classes + if detection.class_name not in self.trigger_classes: + continue - # Get class and confidence - cls_id = int(box.cls.item()) - confidence = float(box.conf.item()) + # Use track_id if available, otherwise generate one + track_id = detection.track_id if detection.track_id is not None else self.next_track_id + if detection.track_id is None: + self.next_track_id += 1 - # Check if class is in trigger classes - class_name = results.names[cls_id] if hasattr(results, 'names') else str(cls_id) - if class_name not in self.trigger_classes and confidence < self.min_confidence: - continue + # Get bounding box from Detection object + x1, y1, x2, y2 = detection.bbox + bbox = (int(x1), int(y1), int(x2), int(y2)) - # Get bounding box - x1, y1, x2, y2 = box.xyxy[0].cpu().numpy().astype(int) - bbox = (x1, y1, x2, y2) + # Update or create tracked vehicle + confidence = detection.confidence + if track_id in self.tracked_vehicles: + # Update existing track + vehicle = self.tracked_vehicles[track_id] + vehicle.update_position(bbox, confidence) + vehicle.display_id = display_id - # Update or create tracked vehicle - if track_id in self.tracked_vehicles: - # Update existing track - vehicle = self.tracked_vehicles[track_id] - vehicle.update_position(bbox, confidence) - vehicle.display_id = display_id - - # Check stability - stability = vehicle.calculate_stability() - if stability > self.stability_threshold: - vehicle.stable_frames += 1 - if vehicle.stable_frames >= self.min_stable_frames: - vehicle.is_stable = True - else: - vehicle.stable_frames = max(0, vehicle.stable_frames - 1) - if vehicle.stable_frames < self.min_stable_frames: - vehicle.is_stable = False - - logger.debug(f"Updated track {track_id}: conf={confidence:.2f}, " - f"stable={vehicle.is_stable}, stability={stability:.2f}") + # Check stability + stability = vehicle.calculate_stability() + if stability > self.stability_threshold: + vehicle.stable_frames += 1 + if vehicle.stable_frames >= self.min_stable_frames: + vehicle.is_stable = True else: - # Create new track - vehicle = TrackedVehicle( - track_id=track_id, - first_seen=current_time, - last_seen=current_time, - display_id=display_id, - confidence=confidence, - bbox=bbox, - center=((x1 + x2) / 2, (y1 + y2) / 2), - total_frames=1 - ) - vehicle.last_position_history.append(vehicle.center) - self.tracked_vehicles[track_id] = vehicle - logger.info(f"New vehicle tracked: ID={track_id}, display={display_id}") + vehicle.stable_frames = max(0, vehicle.stable_frames - 1) + if vehicle.stable_frames < self.min_stable_frames: + vehicle.is_stable = False - active_tracks.append(self.tracked_vehicles[track_id]) - else: - # No tracking available, process as detections only - logger.debug("No tracking IDs available, processing as detections only") - for i, box in enumerate(boxes): - cls_id = int(box.cls.item()) - confidence = float(box.conf.item()) + logger.debug(f"Updated track {track_id}: conf={confidence:.2f}, " + f"stable={vehicle.is_stable}, stability={stability:.2f}") + else: + # Create new track + vehicle = TrackedVehicle( + track_id=track_id, + first_seen=current_time, + last_seen=current_time, + display_id=display_id, + confidence=confidence, + bbox=bbox, + center=((x1 + x2) / 2, (y1 + y2) / 2), + total_frames=1 + ) + vehicle.last_position_history.append(vehicle.center) + self.tracked_vehicles[track_id] = vehicle + logger.info(f"New vehicle tracked: ID={track_id}, display={display_id}") - # Check confidence threshold - if confidence < self.min_confidence: - continue - - # Get bounding box - x1, y1, x2, y2 = box.xyxy[0].cpu().numpy().astype(int) - bbox = (x1, y1, x2, y2) - center = ((x1 + x2) / 2, (y1 + y2) / 2) - - # Try to match with existing tracks by position - matched_track = self._find_closest_track(center) - - if matched_track: - matched_track.update_position(bbox, confidence) - matched_track.display_id = display_id - active_tracks.append(matched_track) - else: - # Create new track with generated ID - track_id = self.next_track_id - self.next_track_id += 1 - - vehicle = TrackedVehicle( - track_id=track_id, - first_seen=current_time, - last_seen=current_time, - display_id=display_id, - confidence=confidence, - bbox=bbox, - center=center, - total_frames=1 - ) - vehicle.last_position_history.append(center) - self.tracked_vehicles[track_id] = vehicle - active_tracks.append(vehicle) - logger.info(f"New vehicle detected (no tracking): ID={track_id}") + active_tracks.append(self.tracked_vehicles[track_id]) return active_tracks