feat: validation with tracking works

This commit is contained in:
ziesorx 2025-09-23 21:21:27 +07:00
parent 4619c122f1
commit d3d9c426f8
2 changed files with 187 additions and 53 deletions

View file

@ -50,6 +50,7 @@ class TrackingPipelineIntegration:
self.active_sessions: Dict[str, str] = {} # display_id -> session_id
self.session_vehicles: Dict[str, int] = {} # session_id -> track_id
self.cleared_sessions: Dict[str, float] = {} # session_id -> clear_time
self.pending_vehicles: Dict[str, int] = {} # display_id -> track_id (waiting for session ID)
# Thread pool for pipeline execution
self.executor = ThreadPoolExecutor(max_workers=2)
@ -64,8 +65,6 @@ class TrackingPipelineIntegration:
# Test mode for mock detection
self.test_mode = True
self.test_detection_sent = False
self.start_time = time.time()
logger.info("TrackingPipelineIntegration initialized")
@ -225,30 +224,26 @@ class TrackingPipelineIntegration:
'confidence': validation_result.confidence
}
# Generate session ID if not provided
if not session_id:
session_id = str(uuid.uuid4())
logger.info(f"Generated session ID: {session_id}")
# Send mock image detection message in test mode
# Note: Backend will generate and send back session ID via setSessionId
if self.test_mode:
await self._send_mock_detection(subscription_id, None)
# Mark vehicle as processed
self.tracker.mark_processed(vehicle.track_id, session_id)
self.session_vehicles[session_id] = vehicle.track_id
self.active_sessions[display_id] = session_id
# Send mock image detection message as per worker.md specification
await self._send_mock_detection(subscription_id, session_id)
# Mark vehicle as pending session ID assignment
self.pending_vehicles[display_id] = vehicle.track_id
logger.info(f"Vehicle {vehicle.track_id} waiting for session ID from backend")
# Execute detection pipeline (placeholder for Phase 5)
pipeline_result = await self._execute_pipeline(
frame,
vehicle,
display_id,
session_id,
None, # No session ID yet
subscription_id
)
result['pipeline_result'] = pipeline_result
result['session_id'] = session_id
# No session_id in result yet - backend will provide it
self.stats['pipelines_executed'] += 1
# Only process one vehicle per frame
@ -263,12 +258,6 @@ class TrackingPipelineIntegration:
except Exception as e:
logger.error(f"Error in tracking pipeline: {e}", exc_info=True)
# TEST MODE: Send mock detection after 10 seconds to test WebSocket communication
if self.test_mode and not self.test_detection_sent and (time.time() - self.start_time) > 10:
self.test_detection_sent = True
test_session_id = f"test-session-{int(time.time())}"
logger.info(f"[TEST MODE] Triggering mock detection with session {test_session_id}")
await self._send_mock_detection(subscription_id, test_session_id)
result['processing_time'] = time.time() - start_time
return result
@ -326,12 +315,12 @@ class TrackingPipelineIntegration:
# Create flat detection data as required by the model
detection_data = {
"carModel": "Civic",
"carBrand": "Honda",
"carYear": 2023,
"bodyType": "Sedan",
"licensePlateText": "MOCK123",
"licensePlateConfidence": 0.95
"carModel": None,
"carBrand": None,
"carYear": None,
"bodyType": None,
"licensePlateText": None,
"licensePlateConfidence": None
}
# Get model info
@ -364,6 +353,7 @@ class TrackingPipelineIntegration:
def set_session_id(self, display_id: str, session_id: str):
"""
Set session ID for a display (from backend).
This is called when backend sends setSessionId after receiving imageDetection.
Args:
display_id: Display identifier
@ -372,10 +362,20 @@ class TrackingPipelineIntegration:
self.active_sessions[display_id] = session_id
logger.info(f"Set session {session_id} for display {display_id}")
# Find vehicle with this session
vehicle = self.tracker.get_vehicle_by_session(session_id)
if vehicle:
self.session_vehicles[session_id] = vehicle.track_id
# Check if we have a pending vehicle for this display
if display_id in self.pending_vehicles:
track_id = self.pending_vehicles[display_id]
# Mark vehicle as processed with the session ID
self.tracker.mark_processed(track_id, session_id)
self.session_vehicles[session_id] = track_id
# Remove from pending
del self.pending_vehicles[display_id]
logger.info(f"Assigned session {session_id} to vehicle {track_id}, marked as processed")
else:
logger.warning(f"No pending vehicle found for display {display_id} when setting session {session_id}")
def clear_session_id(self, session_id: str):
"""
@ -424,6 +424,7 @@ class TrackingPipelineIntegration:
self.active_sessions.clear()
self.session_vehicles.clear()
self.cleared_sessions.clear()
self.pending_vehicles.clear()
logger.info("Tracking pipeline integration reset")
def get_statistics(self) -> Dict[str, Any]: