asad231 commited on
Commit
3e0d2c7
Β·
verified Β·
1 Parent(s): a5572d0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +166 -103
app.py CHANGED
@@ -3,130 +3,193 @@ from PIL import Image
3
  import numpy as np
4
  import pandas as pd
5
  import tempfile
 
 
6
  from reportlab.pdfgen import canvas
7
  from ultralytics import YOLO
8
  from transformers import pipeline
9
- import folium
10
 
11
- # ---------------- Load Models ----------------
12
- detection_model = YOLO('yolov5s.pt')
 
 
13
  summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
14
 
15
- # ---------------- Global History ----------------
16
- history_df = pd.DataFrame(columns=["Objects", "Severity", "Summary", "Latitude", "Longitude"])
17
-
18
- # ---------------- Helper Functions ----------------
19
- def severity_badge(level):
20
- colors = {"Low":"#4CAF50","Medium":"#FF9800","High":"#F44336"}
21
- return f"""<div style='padding:8px 15px;border-radius:8px;
22
- background:{colors.get(level,"gray")};color:white;
23
- width:120px;text-align:center;font-weight:bold;'>{level}</div>"""
24
-
 
 
 
 
 
 
 
 
 
25
  def generate_map(lat, lon):
26
- m = folium.Map(location=[lat, lon], zoom_start=14)
27
  folium.Marker([lat, lon], popup="Incident Location").add_to(m)
28
- tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".html")
29
- m.save(tmp.name)
30
- return f"<iframe src='{tmp.name}' width='100%' height='350' style='border-radius:8px;border:2px solid #444;'></iframe>"
31
 
32
- # ---------------- Main Processing ----------------
33
- def process_image(img, lat, lon):
34
- global history_df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  if img is None:
36
- return None, "Upload image first!", "", None, "", history_df
37
 
38
- # Convert to numpy
39
- image_np = np.array(img)
40
 
41
- # YOLO Prediction
42
- results = detection_model.predict(source=image_np, imgsz=640)
43
- detected = [int(box.cls) for box in results[0].boxes] if len(results) else []
44
- class_names = detection_model.names
45
- names = [class_names[c] for c in detected] if detected else ["None"]
46
 
47
- # Severity rules
48
- if "fire" in names or (names.count("person") > 10):
 
 
 
49
  severity = "High"
50
- elif "car" in names or "truck" in names:
51
  severity = "Medium"
52
- else:
53
- severity = "Low"
54
 
55
- # AI Summary
56
- text = f"Detected: {', '.join(names)}. Severity is {severity}."
57
  try:
58
- summary = summarizer(text, max_length=50, min_length=20, do_sample=False)[0]['summary_text']
59
  except:
60
- summary = text
61
-
62
- # Update history
63
- new_row = pd.DataFrame([[', '.join(names), severity, summary, lat, lon]],
64
- columns=["Objects","Severity","Summary","Latitude","Longitude"])
65
- history_df = pd.concat([history_df, new_row], ignore_index=True)
66
 
67
- # Annotated image
68
  annotated = Image.fromarray(results[0].plot())
69
 
70
  # PDF
71
- pdf_temp = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf")
72
- c = canvas.Canvas(pdf_temp.name)
73
- c.drawString(80, 800, "InfraGuard AI Incident Report")
74
- c.drawString(80, 770, f"Objects: {', '.join(names)}")
75
- c.drawString(80, 750, f"Severity: {severity}")
76
- c.drawString(80, 730, f"Summary: {summary}")
77
- c.drawString(80, 710, f"Location: {lat}, {lon}")
78
- c.save()
79
 
80
  # Map
81
- html_map = generate_map(lat, lon)
82
-
83
- return annotated, f"### Summary\n{summary}", severity_badge(severity), pdf_temp.name, html_map, history_df
84
-
85
-
86
- # ---------------- UI DESIGN ----------------
87
- with gr.Blocks(css="""
88
- .gradio-container {max-width: 1100px !important; margin:auto;}
89
- .header {text-align:center; font-size:40px; font-weight:800; margin-bottom:20px; color:#1E90FF;}
90
- .card {padding:15px; border-radius:12px; border:1px solid #444; background:#111; margin-top:10px;}
91
- """) as demo:
92
-
93
- gr.HTML("<div class='header'>πŸ”₯ InfraGuard β€” AI Security Incident Dashboard</div>")
94
-
95
- with gr.Tabs():
96
- # TAB 1
97
- with gr.Tab("⚑ Analyze Incident"):
98
- with gr.Row():
99
- with gr.Column(scale=1):
100
- img_input = gr.Image(type="pil", label="Upload Image", height=350)
101
- lat = gr.Number(label="Latitude", value=24.8607)
102
- lon = gr.Number(label="Longitude", value=67.0011)
103
- analyze = gr.Button("πŸš€ Analyze", variant="primary")
104
-
105
- with gr.Column(scale=2):
106
- output_img = gr.Image(label="Annotated Detection", height=350)
107
- output_summary = gr.Markdown()
108
- output_severity = gr.HTML()
109
- pdf = gr.File(label="πŸ“„ Download PDF Report")
110
- map_html = gr.HTML()
111
-
112
- # TAB 2
113
- with gr.Tab("πŸ“œ Incident History"):
114
- history_table = gr.Dataframe(headers=["Objects","Severity","Summary","Latitude","Longitude"],
115
- row_count=5, wrap=True)
116
-
117
- # TAB 3
118
- with gr.Tab("β„Ή About"):
119
- gr.Markdown("""
120
- ### InfraGuard β€” AI-Powered Infrastructure Monitoring
121
- - Detects objects using YOLOv5
122
- - Generates professional incident summaries
123
- - Severity auto-classification
124
- - PDF reporting
125
- - Geolocation mapping
126
- """)
127
-
128
- analyze.click(process_image,
129
- [img_input, lat, lon],
130
- [output_img, output_summary, output_severity, pdf, map_html, history_table])
131
-
132
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  import numpy as np
4
  import pandas as pd
5
  import tempfile
6
+ import base64
7
+ import folium
8
  from reportlab.pdfgen import canvas
9
  from ultralytics import YOLO
10
  from transformers import pipeline
11
+ import os
12
 
13
+ # ------------------------------
14
+ # LOAD MODELS
15
+ # ------------------------------
16
+ detection_model = YOLO("yolov5s.pt")
17
  summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
18
 
19
+ # ------------------------------
20
+ # GLOBAL STORAGE
21
+ # ------------------------------
22
+ history = []
23
+
24
+ # ------------------------------
25
+ # COLOR BADGES
26
+ # ------------------------------
27
+ def severity_badge(sev):
28
+ colors = {
29
+ "High": "#ff4b4b",
30
+ "Medium": "#ffa500",
31
+ "Low": "#2ecc71"
32
+ }
33
+ return f"<span style='padding:6px 12px;border-radius:5px;background:{colors[sev]};color:white;font-weight:bold'>{sev}</span>"
34
+
35
+ # ------------------------------
36
+ # MAP GENERATOR
37
+ # ------------------------------
38
  def generate_map(lat, lon):
39
+ m = folium.Map(location=[lat, lon], zoom_start=15)
40
  folium.Marker([lat, lon], popup="Incident Location").add_to(m)
 
 
 
41
 
42
+ f = tempfile.NamedTemporaryFile(delete=False, suffix=".html")
43
+ m.save(f.name)
44
+ f.close()
45
+
46
+ # Embed map in iframe
47
+ html = f"""<iframe src="{f.name}" width="100%" height="400" style="border:none;"></iframe>"""
48
+ return html
49
+
50
+ # ------------------------------
51
+ # PDF GENERATOR
52
+ # ------------------------------
53
+ def create_pdf(objects, severity, summary, lat, lon):
54
+ f = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf")
55
+ c = canvas.Canvas(f.name)
56
+
57
+ c.setFont("Helvetica-Bold", 18)
58
+ c.drawString(100, 800, "InfraGuard Incident Report")
59
+
60
+ c.setFont("Helvetica", 12)
61
+ c.drawString(100, 770, f"Objects: {objects}")
62
+ c.drawString(100, 750, f"Severity: {severity}")
63
+ c.drawString(100, 730, f"AI Summary: {summary}")
64
+ c.drawString(100, 710, f"Location: {lat}, {lon}")
65
+
66
+ c.save()
67
+ return f.name
68
+
69
+ # ------------------------------
70
+ # MAIN PROCESS
71
+ # ------------------------------
72
+ def process(img, lat, lon):
73
  if img is None:
74
+ return None, "Upload Image First", "N/A", None, None, None, history
75
 
76
+ img_np = np.array(img)
 
77
 
78
+ # YOLO detection
79
+ results = detection_model.predict(img_np, imgsz=640)
80
+ objs = []
81
+ for box in results[0].boxes:
82
+ objs.append(detection_model.names[int(box.cls)])
83
 
84
+ objects_text = ", ".join(objs) if objs else "None"
85
+
86
+ # Severity logic
87
+ severity = "Low"
88
+ if "fire" in objs:
89
  severity = "High"
90
+ elif "car" in objs or "truck" in objs:
91
  severity = "Medium"
 
 
92
 
93
+ # AI summary
94
+ incident_text = f"Detected objects: {objects_text}. Severity: {severity}"
95
  try:
96
+ summary = summarizer(incident_text, max_length=40, min_length=10, do_sample=False)[0]['summary_text']
97
  except:
98
+ summary = incident_text
 
 
 
 
 
99
 
100
+ # Annotated Image
101
  annotated = Image.fromarray(results[0].plot())
102
 
103
  # PDF
104
+ pdf_path = create_pdf(objects_text, severity, summary, lat, lon)
 
 
 
 
 
 
 
105
 
106
  # Map
107
+ map_html = generate_map(lat, lon)
108
+
109
+ # Save to history
110
+ thumb = tempfile.NamedTemporaryFile(delete=False, suffix=".png")
111
+ img.save(thumb.name)
112
+ history.append({
113
+ "Image": thumb.name,
114
+ "Objects": objects_text,
115
+ "Severity": severity,
116
+ "Summary": summary,
117
+ "Latitude": lat,
118
+ "Longitude": lon
119
+ })
120
+
121
+ # History Table
122
+ hist_df = pd.DataFrame(history)
123
+
124
+ # Timeline Card
125
+ card_html = f"""
126
+ <div style='background:#0a1a2b;padding:15px;margin:10px;border-radius:10px;border:1px solid #0ff;'>
127
+ <h3 style='color:#00eaff'>New Incident Logged</h3>
128
+ <p><b>Objects:</b> {objects_text}</p>
129
+ <p><b>Severity:</b> {severity_badge(severity)}</p>
130
+ <p><b>Summary:</b> {summary}</p>
131
+ <p><b>Location:</b> {lat}, {lon}</p>
132
+ </div>
133
+ """
134
+
135
+ return annotated, summary, severity, pdf_path, map_html, card_html, hist_df
136
+
137
+
138
+ # ------------------------------
139
+ # CUSTOM CSS (CYBER BLUE THEME)
140
+ # ------------------------------
141
+ cyber_css = """
142
+ body { background-color: #051622 !important; }
143
+
144
+ .gradio-container {
145
+ background: #051622 !important;
146
+ color: white !important;
147
+ }
148
+
149
+ h1 {
150
+ color: #00eaff !important;
151
+ text-align:center;
152
+ font-family: 'Arial Black';
153
+ }
154
+
155
+ .gr-button {
156
+ background:#00eaff !important;
157
+ color:black !important;
158
+ border-radius:8px;
159
+ font-weight:bold;
160
+ border:none !important;
161
+ }
162
+ """
163
+
164
+ # ------------------------------
165
+ # UI LAYOUT
166
+ # ------------------------------
167
+ with gr.Blocks(css=cyber_css, theme=gr.themes.Soft()) as demo:
168
+ gr.HTML("<h1>πŸ”₯ INFRA GUARD – Cyber Security AI Dashboard</h1>")
169
+
170
+ with gr.Row():
171
+ with gr.Column(scale=1):
172
+ img_in = gr.Image(type="pil", label="Upload Scene")
173
+ lat = gr.Number(value=24.8607, label="Latitude")
174
+ lon = gr.Number(value=67.0011, label="Longitude")
175
+ btn = gr.Button("Analyze Incident")
176
+ with gr.Column(scale=1):
177
+ img_out = gr.Image(label="Annotated Image")
178
+ summary = gr.Textbox(label="AI Summary")
179
+ severity = gr.Textbox(label="Severity")
180
+ pdf = gr.File(label="Download PDF Report")
181
+ map_view = gr.HTML(label="Incident Map")
182
+
183
+ gr.Markdown("### πŸ•’ Timeline Feed")
184
+ timeline = gr.HTML()
185
+
186
+ gr.Markdown("### πŸ“˜ Incident History")
187
+ hist_table = gr.Dataframe(headers=["Image", "Objects", "Severity", "Summary", "Latitude", "Longitude"], value=[])
188
+
189
+ btn.click(
190
+ process,
191
+ inputs=[img_in, lat, lon],
192
+ outputs=[img_out, summary, severity, pdf, map_view, timeline, hist_table]
193
+ )
194
+
195
+ demo.launch()