feat: update tracking working

This commit is contained in:
ziesorx 2025-09-23 18:08:21 +07:00
parent 9e4c23c75c
commit 255be78d43
2 changed files with 62 additions and 97 deletions

View file

@ -146,6 +146,17 @@ class TrackingPipelineIntegration:
persist=True 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 # Process tracking results
tracked_vehicles = self.tracker.process_detections( tracked_vehicles = self.tracker.process_detections(
tracking_results, tracking_results,

View file

@ -130,111 +130,65 @@ class VehicleTracker:
logger.debug(f"Removing expired track {track_id}") logger.debug(f"Removing expired track {track_id}")
del self.tracked_vehicles[track_id] del self.tracked_vehicles[track_id]
# Process new detections # Process new detections from InferenceResult
if hasattr(results, 'boxes') and results.boxes is not None: if hasattr(results, 'detections') and results.detections:
boxes = results.boxes # 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 # Check if class is in trigger classes
if hasattr(boxes, 'id') and boxes.id is not None: if detection.class_name not in self.trigger_classes:
# Process tracked objects continue
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
# Get class and confidence # Use track_id if available, otherwise generate one
cls_id = int(box.cls.item()) track_id = detection.track_id if detection.track_id is not None else self.next_track_id
confidence = float(box.conf.item()) if detection.track_id is None:
self.next_track_id += 1
# Check if class is in trigger classes # Get bounding box from Detection object
class_name = results.names[cls_id] if hasattr(results, 'names') else str(cls_id) x1, y1, x2, y2 = detection.bbox
if class_name not in self.trigger_classes and confidence < self.min_confidence: bbox = (int(x1), int(y1), int(x2), int(y2))
continue
# Get bounding box # Update or create tracked vehicle
x1, y1, x2, y2 = box.xyxy[0].cpu().numpy().astype(int) confidence = detection.confidence
bbox = (x1, y1, x2, y2) 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 # Check stability
if track_id in self.tracked_vehicles: stability = vehicle.calculate_stability()
# Update existing track if stability > self.stability_threshold:
vehicle = self.tracked_vehicles[track_id] vehicle.stable_frames += 1
vehicle.update_position(bbox, confidence) if vehicle.stable_frames >= self.min_stable_frames:
vehicle.display_id = display_id vehicle.is_stable = True
# 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}")
else: else:
# Create new track vehicle.stable_frames = max(0, vehicle.stable_frames - 1)
vehicle = TrackedVehicle( if vehicle.stable_frames < self.min_stable_frames:
track_id=track_id, vehicle.is_stable = False
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}")
active_tracks.append(self.tracked_vehicles[track_id]) logger.debug(f"Updated track {track_id}: conf={confidence:.2f}, "
else: f"stable={vehicle.is_stable}, stability={stability:.2f}")
# No tracking available, process as detections only else:
logger.debug("No tracking IDs available, processing as detections only") # Create new track
for i, box in enumerate(boxes): vehicle = TrackedVehicle(
cls_id = int(box.cls.item()) track_id=track_id,
confidence = float(box.conf.item()) 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 active_tracks.append(self.tracked_vehicles[track_id])
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}")
return active_tracks return active_tracks