| from __future__ import annotations |
| from typing import Any, Dict, List |
|
|
| _DEMO_CAPTIONS = [ |
| { |
| "caption": "Heavily flooded residential street in Santa Ana district. Water level is approximately 1.5 meters high. A family of four including two children are visible on a rooftop, waving a red cloth for attention.", |
| "objects_detected": ["flooded_street", "people_on_roof", "submerged_vehicles", "residential_buildings"], |
| "confidence": 0.93, |
| "hazards": ["rising_water", "stranded_people", "electrical_hazard"], |
| }, |
| { |
| "caption": "Collapsed wall of a two-story brick building. Rubble and debris scattered across the street blocking vehicle access. No visible casualties in frame but possible entrapment under debris.", |
| "objects_detected": ["collapsed_building", "debris", "blocked_road"], |
| "confidence": 0.91, |
| "hazards": ["structural_collapse", "road_blockage", "possible_entrapment"], |
| }, |
| { |
| "caption": "Community center being used as emergency shelter. Approximately 40 people visible including elderly and children. Supplies are running low — visible empty water containers and minimal food stocks.", |
| "objects_detected": ["shelter", "civilians", "empty_containers", "elderly_people", "children"], |
| "confidence": 0.95, |
| "hazards": ["resource_shortage", "vulnerable_population"], |
| }, |
| { |
| "caption": "Flooded main road with a partially submerged ambulance attempting to navigate. Water level at door level. Emergency vehicle unable to proceed. A pedestrian bridge visible in background shows water is 2m above normal.", |
| "objects_detected": ["flooded_road", "ambulance", "pedestrian_bridge", "emergency_vehicle"], |
| "confidence": 0.88, |
| "hazards": ["blocked_emergency_access", "high_water_level"], |
| }, |
| { |
| "caption": "Aerial view of the Santa Ana neighborhood. Approximately 60% of the area is under water. Multiple rooftops with stranded residents visible. The main evacuation route (Av. Principal) is completely flooded.", |
| "objects_detected": ["aerial_view", "flooded_neighborhood", "rooftop_survivors", "blocked_roads"], |
| "confidence": 0.96, |
| "hazards": ["widespread_flooding", "multiple_stranded_civilians", "blocked_evacuation_routes"], |
| }, |
| { |
| "caption": "Makeshift raft carrying three adults navigating between houses. Improvised from wooden pallets and plastic barrels. One person appears to have a bandaged leg injury.", |
| "objects_detected": ["makeshift_raft", "injured_person", "improvised_flotation", "adults"], |
| "confidence": 0.87, |
| "hazards": ["unstable_flotation", "injured_civilian", "flood_navigation_risk"], |
| }, |
| { |
| "caption": "Flooded electrical substation with water reaching transformer level. Live wires in contact with floodwater visible. No civilians in immediate vicinity but risk of electrocution to anyone in the area.", |
| "objects_detected": ["electrical_substation", "live_wires", "floodwater", "transformer"], |
| "confidence": 0.94, |
| "hazards": ["electrocution_risk", "live_wires_in_water", "critical_infrastructure_failure"], |
| }, |
| { |
| "caption": "Child approximately 8 years old sitting alone on a fence post surrounded by floodwater. Location appears to be near the Santa Ana primary school. No adults visible nearby. Child appears distressed.", |
| "objects_detected": ["child", "fence_post", "floodwater", "school_building"], |
| "confidence": 0.98, |
| "hazards": ["unaccompanied_minor", "immediate_rescue_needed", "drowning_risk"], |
| }, |
| ] |
|
|
|
|
| async def caption_image(image_path: str, demo_mode: bool = True) -> Dict[str, Any]: |
| if demo_mode: |
| idx = abs(hash(image_path)) % len(_DEMO_CAPTIONS) |
| result = _DEMO_CAPTIONS[idx].copy() |
| result["image_path"] = image_path |
| return result |
|
|
| try: |
| import base64 |
| from pathlib import Path |
| from services.vllm_client import get_vllm_client |
|
|
| client = get_vllm_client() |
| data = Path(image_path).read_bytes() |
| b64 = base64.b64encode(data).decode() |
| caption = await client.caption_image(b64) |
| return { |
| "caption": caption, |
| "objects_detected": [], |
| "confidence": 0.85, |
| "hazards": [], |
| "image_path": image_path, |
| } |
| except Exception: |
| idx = abs(hash(image_path)) % len(_DEMO_CAPTIONS) |
| result = _DEMO_CAPTIONS[idx].copy() |
| result["image_path"] = image_path |
| return result |
|
|