feat: update tracking working
This commit is contained in:
parent
9e4c23c75c
commit
255be78d43
2 changed files with 62 additions and 97 deletions
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue