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
)
# 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,

View file

@ -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