lokesh341 commited on
Commit
dd4bee9
·
1 Parent(s): 6ea7ef8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +46 -54
app.py CHANGED
@@ -7,16 +7,18 @@ import matplotlib.pyplot as plt
7
  import numpy as np
8
  from datetime import datetime
9
  from collections import Counter
10
- from services.video_service import get_next_video_frame, reset_video_index
11
- from services.crack_detection_service import detect_cracks_and_objects
12
  from services.overlay_service import overlay_boxes
13
  from services.metrics_service import update_metrics
14
  from services.map_service import generate_map
15
- from services.utils import simulate_gps_coordinates
 
 
16
 
17
  # Globals
18
  paused = False
19
- frame_rate = 0.5
20
  frame_count = 0
21
  log_entries = []
22
  crack_counts = []
@@ -24,7 +26,7 @@ crack_severity_all = []
24
  last_frame = None
25
  last_metrics = {}
26
  last_timestamp = ""
27
- last_detected_images = []
28
  gps_coordinates = []
29
 
30
  # Constants
@@ -32,18 +34,9 @@ TEMP_IMAGE_PATH = "temp.jpg"
32
  CAPTURED_FRAMES_DIR = "captured_frames"
33
  os.makedirs(CAPTURED_FRAMES_DIR, exist_ok=True)
34
 
35
- # Custom Gradio theme
36
- custom_theme = gr.themes.Soft(
37
- primary_hue="red",
38
- secondary_hue="green",
39
- neutral_hue="gray",
40
- text_size="lg",
41
- radius_size="lg",
42
- )
43
-
44
  # Core monitor function
45
  def monitor_feed():
46
- global paused, frame_count, last_frame, last_metrics, last_timestamp, gps_coordinates
47
 
48
  if paused and last_frame is not None:
49
  frame = last_frame.copy()
@@ -55,21 +48,21 @@ def monitor_feed():
55
  log_entries.append(f"Error: {str(e)}")
56
  return None, last_metrics, "\n".join(log_entries[-10:]), None, None, last_detected_images, None
57
 
58
- detected_items = detect_cracks_and_objects(frame)
59
  frame = overlay_boxes(frame, detected_items)
60
  cv2.imwrite(TEMP_IMAGE_PATH, frame, [int(cv2.IMWRITE_JPEG_QUALITY), 95])
61
  metrics = update_metrics(detected_items)
62
 
63
  frame_count += 1
64
  last_timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
65
- gps_coord = simulate_gps_coordinates(frame_count)
66
  gps_coordinates.append(gps_coord)
67
 
68
- if detected_items:
69
- captured_frame_path = os.path.join(CAPTURED_FRAMES_DIR, f"frame_{frame_count}.jpg")
70
  cv2.imwrite(captured_frame_path, frame)
71
  last_detected_images.append(captured_frame_path)
72
- if len(last_detected_images) > 100:
73
  last_detected_images.pop(0)
74
 
75
  last_frame = frame.copy()
@@ -77,14 +70,15 @@ def monitor_feed():
77
 
78
  # Update logs and stats
79
  crack_detected = len([item for item in last_metrics.get('items', []) if item['type'] == 'crack'])
 
80
  crack_severity_all.extend([
81
  item['severity']
82
  for item in last_metrics.get('items', [])
83
- if item['type'] == 'crack' and 'severity' in item
84
  ])
85
 
86
- log_entries.append(f"{last_timestamp} - Frame {frame_count} - Cracks: {crack_detected} - GPS: {gps_coord}")
87
- crack_counts.append(crack_detected)
88
 
89
  if len(log_entries) > 100:
90
  log_entries.pop(0)
@@ -93,11 +87,11 @@ def monitor_feed():
93
  if len(crack_severity_all) > 500:
94
  crack_severity_all.pop(0)
95
 
96
- frame = cv2.resize(last_frame, (800, 600))
97
- cv2.putText(frame, f"Frame: {frame_count}", (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2)
98
- cv2.putText(frame, f"{last_timestamp}", (20, 80), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2)
99
 
100
- map_path = generate_map(gps_coordinates[-5:], last_metrics.get('items', []))
101
 
102
  return frame[:, :, ::-1], last_metrics, "\n".join(log_entries[-10:]), generate_line_chart(), generate_pie_chart(), last_detected_images, map_path
103
 
@@ -105,59 +99,57 @@ def monitor_feed():
105
  def generate_line_chart():
106
  if not crack_counts:
107
  return None
108
- fig, ax = plt.subplots(figsize=(6, 3))
109
- ax.plot(crack_counts[-50:], marker='o', color='orange')
110
- ax.set_title("Cracks Over Time", color='black', fontsize=14)
111
- ax.set_xlabel("Frame", color='black', fontsize=12)
112
- ax.set_ylabel("Count", color='black', fontsize=12)
113
- ax.grid(True, color='pink', linestyle='--', alpha=0.5)
114
  fig.tight_layout()
115
  chart_path = "chart_temp.png"
116
- fig.savefig(chart_path, bbox_inches='tight')
117
  plt.close(fig)
118
  return chart_path
119
 
120
- # Pie chart for crack severity
121
  def generate_pie_chart():
122
  if not crack_severity_all:
123
  return None
124
- fig, ax = plt.subplots(figsize=(6, 3))
125
  count = Counter(crack_severity_all[-200:])
126
  labels, sizes = zip(*count.items())
127
- colors = ['red', 'orange', 'green']
128
- ax.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=140, textprops={'fontsize': 12, 'color': 'black'})
129
  ax.axis('equal')
130
  fig.tight_layout()
131
  pie_path = "pie_temp.png"
132
- fig.savefig(pie_path, bbox_inches='tight')
133
  plt.close(fig)
134
  return pie_path
135
 
136
  # Gradio UI
137
- with gr.Blocks(theme=custom_theme, css="body {background-color: #f0f0f0 !important} .status-text {font-size: 18px !important; color: black !important} .video-feed {border: 2px solid red !important} .metrics-box {border: 2px solid green !important} .logs-box {border: 2px solid orange !important} .control-btn {font-size: 16px !important} .slider {width: 300px !important}") as app:
138
- gr.Markdown("# 🛣️ Drone Road Inspection Dashboard")
139
-
140
- status_text = gr.Markdown("**Status:** 🟢 Running", elem_classes="status-text")
141
 
142
  with gr.Row():
143
  with gr.Column(scale=3):
144
- video_output = gr.Image(label="Live Drone Feed", width=800, height=600, elem_classes="video-feed")
145
- with gr.Column(scale=2):
146
- metrics_output = gr.Textbox(label="Crack & Object Metrics", lines=6, elem_classes="metrics-box")
147
 
148
  with gr.Row():
149
- logs_output = gr.Textbox(label="Live Logs", lines=10, elem_classes="logs-box")
150
- chart_output = gr.Image(label="Crack Trend", width=400, height=200)
151
- pie_output = gr.Image(label="Crack Severity", width=400, height=200)
152
 
153
  with gr.Row():
154
- map_output = gr.Image(label="Crack & Object Locations Map", width=800, height=400)
155
- captured_images = gr.Gallery(label="Detected Cracks & Objects (Last 100)", columns=5, height=600, object_fit="contain")
156
 
157
  with gr.Row():
158
- pause_btn = gr.Button("⏸️ Pause", variant="secondary", elem_classes="control-btn")
159
- resume_btn = gr.Button("▶️ Resume", variant="primary", elem_classes="control-btn")
160
- frame_slider = gr.Slider(0.1, 2, value=0.5, step=0.1, label="Frame Interval (seconds)", elem_classes="slider")
161
 
162
  def toggle_pause():
163
  global paused
 
7
  import numpy as np
8
  from datetime import datetime
9
  from collections import Counter
10
+ from services.video_service import get_next_video_frame, reset_video_index, preload_video
11
+ from services.crack_detection_service import detect_cracks_and_holes
12
  from services.overlay_service import overlay_boxes
13
  from services.metrics_service import update_metrics
14
  from services.map_service import generate_map
15
+
16
+ # Preload video to reduce startup time
17
+ preload_video()
18
 
19
  # Globals
20
  paused = False
21
+ frame_rate = 0.3 # Faster frame rate for quicker video reading
22
  frame_count = 0
23
  log_entries = []
24
  crack_counts = []
 
26
  last_frame = None
27
  last_metrics = {}
28
  last_timestamp = ""
29
+ last_detected_images = [] # Store up to 100+ crack/hole images
30
  gps_coordinates = []
31
 
32
  # Constants
 
34
  CAPTURED_FRAMES_DIR = "captured_frames"
35
  os.makedirs(CAPTURED_FRAMES_DIR, exist_ok=True)
36
 
 
 
 
 
 
 
 
 
 
37
  # Core monitor function
38
  def monitor_feed():
39
+ global paused, frame_count, last_frame, last_metrics, last_timestamp, gps_coordinates, last_detected_images
40
 
41
  if paused and last_frame is not None:
42
  frame = last_frame.copy()
 
48
  log_entries.append(f"Error: {str(e)}")
49
  return None, last_metrics, "\n".join(log_entries[-10:]), None, None, last_detected_images, None
50
 
51
+ detected_items = detect_cracks_and_holes(frame) # Includes cracks and holes
52
  frame = overlay_boxes(frame, detected_items)
53
  cv2.imwrite(TEMP_IMAGE_PATH, frame, [int(cv2.IMWRITE_JPEG_QUALITY), 95])
54
  metrics = update_metrics(detected_items)
55
 
56
  frame_count += 1
57
  last_timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
58
+ gps_coord = [17.385044 + random.uniform(-0.001, 0.001), 78.486671 + frame_count * 0.0001]
59
  gps_coordinates.append(gps_coord)
60
 
61
+ if any(item['type'] in ['crack', 'hole'] for item in detected_items):
62
+ captured_frame_path = os.path.join(CAPTURED_FRAMES_DIR, f"detected_{frame_count}.jpg")
63
  cv2.imwrite(captured_frame_path, frame)
64
  last_detected_images.append(captured_frame_path)
65
+ if len(last_detected_images) > 100: # Store up to 100 images
66
  last_detected_images.pop(0)
67
 
68
  last_frame = frame.copy()
 
70
 
71
  # Update logs and stats
72
  crack_detected = len([item for item in last_metrics.get('items', []) if item['type'] == 'crack'])
73
+ hole_detected = len([item for item in last_metrics.get('items', []) if item['type'] == 'hole'])
74
  crack_severity_all.extend([
75
  item['severity']
76
  for item in last_metrics.get('items', [])
77
+ if item['type'] in ['crack', 'hole'] and isinstance(item, dict) and 'severity' in item
78
  ])
79
 
80
+ log_entries.append(f"{last_timestamp} - Frame {frame_count} - Cracks: {crack_detected} - Holes: {hole_detected} - GPS: {gps_coord}")
81
+ crack_counts.append(crack_detected + hole_detected)
82
 
83
  if len(log_entries) > 100:
84
  log_entries.pop(0)
 
87
  if len(crack_severity_all) > 500:
88
  crack_severity_all.pop(0)
89
 
90
+ frame = cv2.resize(last_frame, (640, 480))
91
+ cv2.putText(frame, f"Frame: {frame_count}", (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
92
+ cv2.putText(frame, f"{last_timestamp}", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
93
 
94
+ map_path = generate_map(gps_coordinates[-5:], [item for item in last_metrics.get('items', []) if item['type'] in ['crack', 'hole']])
95
 
96
  return frame[:, :, ::-1], last_metrics, "\n".join(log_entries[-10:]), generate_line_chart(), generate_pie_chart(), last_detected_images, map_path
97
 
 
99
  def generate_line_chart():
100
  if not crack_counts:
101
  return None
102
+ fig, ax = plt.subplots(figsize=(4, 2))
103
+ ax.plot(crack_counts[-50:], marker='o')
104
+ ax.set_title("Cracks/Holes Over Time")
105
+ ax.set_xlabel("Frame")
106
+ ax.set_ylabel("Count")
 
107
  fig.tight_layout()
108
  chart_path = "chart_temp.png"
109
+ fig.savefig(chart_path)
110
  plt.close(fig)
111
  return chart_path
112
 
113
+ # Pie chart for severity
114
  def generate_pie_chart():
115
  if not crack_severity_all:
116
  return None
117
+ fig, ax = plt.subplots(figsize=(4, 2))
118
  count = Counter(crack_severity_all[-200:])
119
  labels, sizes = zip(*count.items())
120
+ ax.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=140)
 
121
  ax.axis('equal')
122
  fig.tight_layout()
123
  pie_path = "pie_temp.png"
124
+ fig.savefig(pie_path)
125
  plt.close(fig)
126
  return pie_path
127
 
128
  # Gradio UI
129
+ with gr.Blocks(theme=gr.themes.Soft()) as app:
130
+ gr.Markdown("# 🛡️ Drone Road Inspection Dashboard")
131
+
132
+ status_text = gr.Markdown("**Status:** 🟢 Running")
133
 
134
  with gr.Row():
135
  with gr.Column(scale=3):
136
+ video_output = gr.Image(label="Live Drone Feed", width=640, height=480)
137
+ with gr.Column(scale=1):
138
+ metrics_output = gr.Textbox(label="Crack/Hole Metrics", lines=4)
139
 
140
  with gr.Row():
141
+ logs_output = gr.Textbox(label="Live Logs", lines=8)
142
+ chart_output = gr.Image(label="Crack/Hole Trend")
143
+ pie_output = gr.Image(label="Severity Distribution")
144
 
145
  with gr.Row():
146
+ map_output = gr.Image(label="Crack/Hole Locations Map")
147
+ captured_images = gr.Gallery(label="Detected Cracks/Holes (Last 100+)", columns=4, rows=25)
148
 
149
  with gr.Row():
150
+ pause_btn = gr.Button("⏸️ Pause")
151
+ resume_btn = gr.Button("▶️ Resume")
152
+ frame_slider = gr.Slider(0.0005, 5, value=0.3, label="Frame Interval (seconds)")
153
 
154
  def toggle_pause():
155
  global paused