Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -243,6 +243,7 @@ def monitor_feed() -> Tuple[
|
|
243 |
metrics = last_metrics.copy()
|
244 |
else:
|
245 |
max_retries = 3
|
|
|
246 |
for attempt in range(max_retries):
|
247 |
try:
|
248 |
if is_video:
|
@@ -282,6 +283,9 @@ def monitor_feed() -> Tuple[
|
|
282 |
None
|
283 |
)
|
284 |
|
|
|
|
|
|
|
285 |
all_detected_items: List[Dict[str, Any]] = []
|
286 |
shadow_issue = False
|
287 |
thermal_flag = False
|
@@ -289,33 +293,33 @@ def monitor_feed() -> Tuple[
|
|
289 |
try:
|
290 |
# Process frame based on active service
|
291 |
if active_service == "under_construction":
|
292 |
-
earthwork_dets,
|
293 |
-
culvert_dets,
|
294 |
-
bridge_pier_dets,
|
295 |
all_detected_items.extend(earthwork_dets + culvert_dets + bridge_pier_dets)
|
296 |
elif active_service == "operations_maintenance":
|
297 |
-
crack_hole_dets,
|
298 |
-
pothole_dets,
|
299 |
-
signage_dets,
|
300 |
all_detected_items.extend(crack_hole_dets + pothole_dets + signage_dets)
|
301 |
elif active_service == "road_safety":
|
302 |
-
barrier_dets,
|
303 |
-
lighting_dets,
|
304 |
-
accident_dets,
|
305 |
-
pothole_crack_dets,
|
306 |
all_detected_items.extend(barrier_dets + lighting_dets + accident_dets + pothole_crack_dets)
|
307 |
elif active_service == "plantation":
|
308 |
-
plant_dets,
|
309 |
-
health_dets,
|
310 |
-
missing_dets,
|
311 |
all_detected_items.extend(plant_dets + health_dets + missing_dets)
|
312 |
else:
|
313 |
-
generic_dets,
|
314 |
all_detected_items.extend(generic_dets)
|
315 |
|
316 |
# Apply shadow detection
|
317 |
try:
|
318 |
-
cv2.imwrite(TEMP_IMAGE_PATH,
|
319 |
shadow_issue = detect_shadow_coverage(TEMP_IMAGE_PATH)
|
320 |
except Exception as e:
|
321 |
log_entries.append(f"Error saving temp image for shadow detection: {str(e)}")
|
@@ -323,14 +327,28 @@ def monitor_feed() -> Tuple[
|
|
323 |
shadow_issue = False
|
324 |
|
325 |
# Apply thermal processing if frame is grayscale
|
326 |
-
if len(
|
327 |
-
thermal_results = process_thermal(
|
328 |
thermal_dets = thermal_results["detections"]
|
329 |
-
|
330 |
all_detected_items.extend(thermal_dets)
|
331 |
thermal_flag = bool(thermal_dets)
|
332 |
|
333 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
334 |
for item in all_detected_items:
|
335 |
box = item.get("box", [])
|
336 |
if not box:
|
@@ -372,6 +390,10 @@ def monitor_feed() -> Tuple[
|
|
372 |
gps_coord = [17.385044 + random.uniform(-0.001, 0.001), 78.486671 + frame_count * 0.0001]
|
373 |
gps_coordinates.append(gps_coord)
|
374 |
|
|
|
|
|
|
|
|
|
375 |
# Save frame if detections are present
|
376 |
detection_types = {item.get("type") for item in all_detected_items if "type" in item}
|
377 |
if detection_types:
|
@@ -436,6 +458,7 @@ def monitor_feed() -> Tuple[
|
|
436 |
detected_counts.append(plant_detected + crack_detected + hole_detected + missing_detected)
|
437 |
|
438 |
# Log frame processing details in the requested format
|
|
|
439 |
detection_summary = {
|
440 |
"timestamp": last_timestamp,
|
441 |
"frame": frame_count,
|
@@ -443,7 +466,8 @@ def monitor_feed() -> Tuple[
|
|
443 |
"cracks": crack_detected,
|
444 |
"holes": hole_detected,
|
445 |
"missing_patches": missing_detected,
|
446 |
-
"gps": gps_coord
|
|
|
447 |
}
|
448 |
log_message = json.dumps(detection_summary, indent=2)
|
449 |
log_entries.append(log_message)
|
@@ -613,4 +637,4 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="green"))
|
|
613 |
app.load(streaming_loop, outputs=[media_output, metrics_output, logs_output, plant_images, issue_images, chart_output, map_output])
|
614 |
|
615 |
if __name__ == "__main__":
|
616 |
-
app.launch(share=
|
|
|
243 |
metrics = last_metrics.copy()
|
244 |
else:
|
245 |
max_retries = 3
|
246 |
+
start_time = time.time()
|
247 |
for attempt in range(max_retries):
|
248 |
try:
|
249 |
if is_video:
|
|
|
283 |
None
|
284 |
)
|
285 |
|
286 |
+
# Resize frame for faster detection (320x512)
|
287 |
+
detection_frame = cv2.resize(frame, (512, 320))
|
288 |
+
|
289 |
all_detected_items: List[Dict[str, Any]] = []
|
290 |
shadow_issue = False
|
291 |
thermal_flag = False
|
|
|
293 |
try:
|
294 |
# Process frame based on active service
|
295 |
if active_service == "under_construction":
|
296 |
+
earthwork_dets, detection_frame = process_earthwork(detection_frame)
|
297 |
+
culvert_dets, detection_frame = process_culverts(detection_frame)
|
298 |
+
bridge_pier_dets, detection_frame = process_bridge_piers(detection_frame)
|
299 |
all_detected_items.extend(earthwork_dets + culvert_dets + bridge_pier_dets)
|
300 |
elif active_service == "operations_maintenance":
|
301 |
+
crack_hole_dets, detection_frame = detect_cracks_and_holes(detection_frame)
|
302 |
+
pothole_dets, detection_frame = process_potholes(detection_frame)
|
303 |
+
signage_dets, detection_frame = process_signages(detection_frame)
|
304 |
all_detected_items.extend(crack_hole_dets + pothole_dets + signage_dets)
|
305 |
elif active_service == "road_safety":
|
306 |
+
barrier_dets, detection_frame = process_barriers(detection_frame)
|
307 |
+
lighting_dets, detection_frame = process_lighting(detection_frame)
|
308 |
+
accident_dets, detection_frame = process_accident_spots(detection_frame)
|
309 |
+
pothole_crack_dets, detection_frame = detect_potholes_and_cracks(detection_frame)
|
310 |
all_detected_items.extend(barrier_dets + lighting_dets + accident_dets + pothole_crack_dets)
|
311 |
elif active_service == "plantation":
|
312 |
+
plant_dets, detection_frame = process_plants(detection_frame)
|
313 |
+
health_dets, detection_frame = process_plant_health(detection_frame)
|
314 |
+
missing_dets, detection_frame = process_missing_patches(detection_frame)
|
315 |
all_detected_items.extend(plant_dets + health_dets + missing_dets)
|
316 |
else:
|
317 |
+
generic_dets, detection_frame = process_generic(detection_frame)
|
318 |
all_detected_items.extend(generic_dets)
|
319 |
|
320 |
# Apply shadow detection
|
321 |
try:
|
322 |
+
cv2.imwrite(TEMP_IMAGE_PATH, detection_frame)
|
323 |
shadow_issue = detect_shadow_coverage(TEMP_IMAGE_PATH)
|
324 |
except Exception as e:
|
325 |
log_entries.append(f"Error saving temp image for shadow detection: {str(e)}")
|
|
|
327 |
shadow_issue = False
|
328 |
|
329 |
# Apply thermal processing if frame is grayscale
|
330 |
+
if len(detection_frame.shape) == 2:
|
331 |
+
thermal_results = process_thermal(detection_frame)
|
332 |
thermal_dets = thermal_results["detections"]
|
333 |
+
detection_frame = thermal_results["frame"]
|
334 |
all_detected_items.extend(thermal_dets)
|
335 |
thermal_flag = bool(thermal_dets)
|
336 |
|
337 |
+
# Scale bounding boxes back to original frame size
|
338 |
+
orig_h, orig_w = frame.shape[:2]
|
339 |
+
det_h, det_w = detection_frame.shape[:2]
|
340 |
+
scale_x, scale_y = orig_w / det_w, orig_h / det_h
|
341 |
+
for item in all_detected_items:
|
342 |
+
if "box" in item:
|
343 |
+
box = item["box"]
|
344 |
+
item["box"] = [
|
345 |
+
int(box[0] * scale_x),
|
346 |
+
int(box[1] * scale_y),
|
347 |
+
int(box[2] * scale_x),
|
348 |
+
int(box[3] * scale_y)
|
349 |
+
]
|
350 |
+
|
351 |
+
# Overlay detections on the original frame
|
352 |
for item in all_detected_items:
|
353 |
box = item.get("box", [])
|
354 |
if not box:
|
|
|
390 |
gps_coord = [17.385044 + random.uniform(-0.001, 0.001), 78.486671 + frame_count * 0.0001]
|
391 |
gps_coordinates.append(gps_coord)
|
392 |
|
393 |
+
# Add GPS to detected items for mapping
|
394 |
+
for item in all_detected_items:
|
395 |
+
item["gps"] = gps_coord
|
396 |
+
|
397 |
# Save frame if detections are present
|
398 |
detection_types = {item.get("type") for item in all_detected_items if "type" in item}
|
399 |
if detection_types:
|
|
|
458 |
detected_counts.append(plant_detected + crack_detected + hole_detected + missing_detected)
|
459 |
|
460 |
# Log frame processing details in the requested format
|
461 |
+
processing_time = time.time() - start_time
|
462 |
detection_summary = {
|
463 |
"timestamp": last_timestamp,
|
464 |
"frame": frame_count,
|
|
|
466 |
"cracks": crack_detected,
|
467 |
"holes": hole_detected,
|
468 |
"missing_patches": missing_detected,
|
469 |
+
"gps": gps_coord,
|
470 |
+
"processing_time_ms": processing_time * 1000
|
471 |
}
|
472 |
log_message = json.dumps(detection_summary, indent=2)
|
473 |
log_entries.append(log_message)
|
|
|
637 |
app.load(streaming_loop, outputs=[media_output, metrics_output, logs_output, plant_images, issue_images, chart_output, map_output])
|
638 |
|
639 |
if __name__ == "__main__":
|
640 |
+
app.launch(share=True) # Set share=True to create a public link
|