import gradio as gr from PIL import Image import numpy as np import pandas as pd import tempfile import folium from reportlab.pdfgen import canvas from ultralytics import YOLO from transformers import pipeline import base64 import zipfile import os # =========================================== # LOAD MODELS # =========================================== detection_model = YOLO("yolov5s.pt") summarizer = pipeline("summarization", model="facebook/bart-large-cnn") # =========================================== # GLOBAL STORAGE # =========================================== history = [] incident_counter = 1 # =========================================== # HELPERS # =========================================== def generate_incident_id(): global incident_counter code = f"IG-2025-{incident_counter:05d}" incident_counter += 1 return code def severity_badge(sev): colors = { "High": "#ff3b3b", "Medium": "#ffa500", "Low": "#00c853" } return f"{sev}" def generate_map(lat, lon): m = folium.Map(location=[lat, lon], zoom_start=15) folium.Marker([lat, lon], popup="Incident Location").add_to(m) f = tempfile.NamedTemporaryFile(delete=False, suffix=".html") m.save(f.name) f.close() return f"""""" def create_pdf(objects, severity, summary, lat, lon, incident_id): f = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") c = canvas.Canvas(f.name) c.setFont("Helvetica-Bold", 18) c.drawString(100, 800, f"InfraGuard Incident Report") c.setFont("Helvetica", 12) c.drawString(100, 770, f"Incident ID: {incident_id}") c.drawString(100, 750, f"Objects: {objects}") c.drawString(100, 730, f"Severity: {severity}") c.drawString(100, 710, f"AI Summary: {summary}") c.drawString(100, 690, f"Location: {lat}, {lon}") c.save() return f.name # =========================================== # MAIN PROCESS FUNCTION # =========================================== def process(img, lat, lon): global history if img is None: return None, "Upload an image first", "N/A", None, None, None, pd.DataFrame(history) img_np = np.array(img) results = detection_model.predict(img_np, imgsz=640) # Object detection objs = [detection_model.names[int(box.cls)] for box in results[0].boxes] objects_text = ", ".join(objs) if objs else "None" # Severity severity = "Low" if "fire" in objs: severity = "High" elif any(x in objs for x in ["car", "truck", "bus"]): severity = "Medium" # Summary story = f"Detected objects: {objects_text}. Severity: {severity}." try: summary = summarizer(story, max_length=40, min_length=10)[0]["summary_text"] except: summary = story # Annotated image annotated = Image.fromarray(results[0].plot()) # Incident ID incident_id = generate_incident_id() # PDF pdf_file = create_pdf(objects_text, severity, summary, lat, lon, incident_id) # Map map_html = generate_map(lat, lon) # Save to history thumb = tempfile.NamedTemporaryFile(delete=False, suffix=".png") img.save(thumb.name) entry = { "ID": incident_id, "Image": thumb.name, "Objects": objects_text, "Severity": severity, "Summary": summary, "Latitude": lat, "Longitude": lon, "PDF": pdf_file } history.append(entry) df = pd.DataFrame(history) # Timeline card card = f"""
ID: {incident_id}
Objects: {objects_text}
Severity: {severity_badge(severity)}
Location: {lat}, {lon}