feat: make tracking works
This commit is contained in:
parent
255be78d43
commit
4619c122f1
4 changed files with 70 additions and 8 deletions
|
@ -157,8 +157,7 @@ def create_state_report(cpu_usage: float, memory_usage: float,
|
|||
|
||||
|
||||
def create_image_detection(subscription_identifier: str, detection_data: Dict[str, Any],
|
||||
model_id: int, model_name: str,
|
||||
session_id: Optional[int] = None) -> ImageDetectionMessage:
|
||||
model_id: int, model_name: str) -> ImageDetectionMessage:
|
||||
"""
|
||||
Create an image detection message.
|
||||
|
||||
|
@ -167,7 +166,6 @@ def create_image_detection(subscription_identifier: str, detection_data: Dict[st
|
|||
detection_data: Flat dictionary of detection results
|
||||
model_id: Model identifier
|
||||
model_name: Model name
|
||||
session_id: Optional session ID
|
||||
|
||||
Returns:
|
||||
ImageDetectionMessage object
|
||||
|
@ -182,7 +180,6 @@ def create_image_detection(subscription_identifier: str, detection_data: Dict[st
|
|||
|
||||
return ImageDetectionMessage(
|
||||
subscriptionIdentifier=subscription_identifier,
|
||||
sessionId=session_id,
|
||||
data=data
|
||||
)
|
||||
|
||||
|
|
|
@ -108,7 +108,6 @@ class ImageDetectionMessage(BaseModel):
|
|||
type: Literal["imageDetection"] = "imageDetection"
|
||||
subscriptionIdentifier: str
|
||||
timestamp: str = Field(default_factory=lambda: datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ"))
|
||||
sessionId: Optional[int] = None
|
||||
data: DetectionData
|
||||
|
||||
|
||||
|
|
|
@ -304,9 +304,9 @@ class WebSocketHandler:
|
|||
# Get pipeline configuration for this model
|
||||
pipeline_parser = model_manager.get_pipeline_config(model_id)
|
||||
if pipeline_parser:
|
||||
# Create tracking integration
|
||||
# Create tracking integration with message sender
|
||||
tracking_integration = TrackingPipelineIntegration(
|
||||
pipeline_parser, model_manager
|
||||
pipeline_parser, model_manager, self._send_message
|
||||
)
|
||||
|
||||
# Initialize tracking model
|
||||
|
|
|
@ -24,16 +24,18 @@ class TrackingPipelineIntegration:
|
|||
Manages tracking state transitions and pipeline execution triggers.
|
||||
"""
|
||||
|
||||
def __init__(self, pipeline_parser: PipelineParser, model_manager: Any):
|
||||
def __init__(self, pipeline_parser: PipelineParser, model_manager: Any, message_sender=None):
|
||||
"""
|
||||
Initialize tracking-pipeline integration.
|
||||
|
||||
Args:
|
||||
pipeline_parser: Pipeline parser with loaded configuration
|
||||
model_manager: Model manager for loading models
|
||||
message_sender: Optional callback function for sending WebSocket messages
|
||||
"""
|
||||
self.pipeline_parser = pipeline_parser
|
||||
self.model_manager = model_manager
|
||||
self.message_sender = message_sender
|
||||
|
||||
# Initialize tracking components
|
||||
tracking_config = pipeline_parser.tracking_config.__dict__ if pipeline_parser.tracking_config else {}
|
||||
|
@ -60,6 +62,11 @@ class TrackingPipelineIntegration:
|
|||
'pipelines_executed': 0
|
||||
}
|
||||
|
||||
# Test mode for mock detection
|
||||
self.test_mode = True
|
||||
self.test_detection_sent = False
|
||||
self.start_time = time.time()
|
||||
|
||||
logger.info("TrackingPipelineIntegration initialized")
|
||||
|
||||
async def initialize_tracking_model(self) -> bool:
|
||||
|
@ -228,6 +235,9 @@ class TrackingPipelineIntegration:
|
|||
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)
|
||||
|
||||
# Execute detection pipeline (placeholder for Phase 5)
|
||||
pipeline_result = await self._execute_pipeline(
|
||||
frame,
|
||||
|
@ -253,6 +263,13 @@ 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
|
||||
|
||||
|
@ -295,6 +312,55 @@ class TrackingPipelineIntegration:
|
|||
|
||||
return pipeline_result
|
||||
|
||||
async def _send_mock_detection(self, subscription_id: str, session_id: str):
|
||||
"""
|
||||
Send mock image detection message to backend following worker.md specification.
|
||||
|
||||
Args:
|
||||
subscription_id: Full subscription identifier (display-id;camera-id)
|
||||
session_id: Session identifier for linking detection to user session
|
||||
"""
|
||||
try:
|
||||
# Import here to avoid circular imports
|
||||
from ..communication.messages import create_image_detection
|
||||
|
||||
# Create flat detection data as required by the model
|
||||
detection_data = {
|
||||
"carModel": "Civic",
|
||||
"carBrand": "Honda",
|
||||
"carYear": 2023,
|
||||
"bodyType": "Sedan",
|
||||
"licensePlateText": "MOCK123",
|
||||
"licensePlateConfidence": 0.95
|
||||
}
|
||||
|
||||
# Get model info
|
||||
model_id = 1 # Default model ID as integer
|
||||
if self.tracking_model_id:
|
||||
# Try to extract numeric ID from model string
|
||||
try:
|
||||
model_id = int(self.tracking_model_id.split('_')[-1].replace('v', ''))
|
||||
except:
|
||||
model_id = 1
|
||||
|
||||
# Create proper Pydantic message using the helper function
|
||||
detection_message = create_image_detection(
|
||||
subscription_identifier=subscription_id,
|
||||
detection_data=detection_data,
|
||||
model_id=model_id,
|
||||
model_name="Vehicle Tracking Detection"
|
||||
)
|
||||
|
||||
# Send to backend via WebSocket if sender is available
|
||||
if self.message_sender:
|
||||
await self.message_sender(detection_message)
|
||||
logger.info(f"[MOCK DETECTION] Sent to backend: {detection_data}")
|
||||
else:
|
||||
logger.info(f"[MOCK DETECTION] No message sender available, would send: {detection_message}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error sending mock detection: {e}", exc_info=True)
|
||||
|
||||
def set_session_id(self, display_id: str, session_id: str):
|
||||
"""
|
||||
Set session ID for a display (from backend).
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue