Spaces:
Build error
Build error
import streamlit as st | |
import cv2 | |
import pandas as pd | |
import tempfile | |
import os | |
from services.video_service import get_video_frame | |
from services.detection_service import detect_objects | |
from services.fault_service import detect_pole_faults | |
from services.salesforce_dispatcher import send_to_salesforce | |
st.title("Pole Fault Detection") | |
st.write("Upload a video (.mp4) or image (.jpg, .png) to detect pole faults.") | |
# File uploader | |
uploaded_file = st.file_uploader("Choose a file", type=["mp4", "jpg", "png"]) | |
if uploaded_file is not None: | |
# Save uploaded file to temporary location | |
with tempfile.NamedTemporaryFile(delete=False, suffix=f".{uploaded_file.name.split('.')[-1]}") as tmp_file: | |
tmp_file.write(uploaded_file.read()) | |
file_path = tmp_file.name | |
if uploaded_file.type.startswith("video"): | |
# Process video | |
st.subheader("Processed Video") | |
video_placeholder = st.empty() | |
fault_table = st.empty() | |
frame_gen = get_video_frame(file_path) | |
output_path = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4").name | |
fourcc = cv2.VideoWriter_fourcc(*"mp4v") | |
cap = cv2.VideoCapture(file_path) | |
fps = cap.get(cv2.CAP_PROP_FPS) | |
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) | |
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) | |
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height)) | |
faults_list = [] | |
for frame in frame_gen: | |
# Save frame temporarily for detection | |
cv2.imwrite("temp.jpg", frame) | |
detections = detect_objects("temp.jpg") | |
faults = detect_pole_faults("temp.jpg") | |
alert_payload = { | |
"detections": detections, | |
"faults": bool(faults), | |
"fault_details": faults | |
} | |
# Send to Salesforce | |
send_to_salesforce(alert_payload) | |
faults_list.extend(faults) | |
# Annotate frame (basic text overlay for faults) | |
for fault in faults: | |
cv2.putText( | |
frame, | |
f"{fault['fault_type']} ({fault['confidence']:.2f})", | |
(50, 50), | |
cv2.FONT_HERSHEY_SIMPLEX, | |
1, | |
(0, 0, 255), | |
2 | |
) | |
out.write(frame) | |
# Display frame in Streamlit | |
video_placeholder.image(frame, channels="BGR") | |
out.release() | |
cap.release() | |
# Display final video | |
st.video(output_path) | |
# Display faults table | |
if faults_list: | |
df = pd.DataFrame(faults_list) | |
fault_table.subheader("Detected Faults") | |
fault_table.dataframe(df) | |
else: | |
fault_table.write("No faults detected.") | |
# Clean up | |
os.remove(file_path) | |
os.remove(output_path) | |
os.remove("temp.jpg") | |
else: | |
# Process image | |
st.subheader("Processed Image") | |
image = cv2.imread(file_path) | |
cv2.imwrite("temp.jpg", image) | |
detections = detect_objects("temp.jpg") | |
faults = detect_pole_faults("temp.jpg") | |
alert_payload = { | |
"detections": detections, | |
"faults": bool(faults), | |
"fault_details": faults | |
} | |
# Send to Salesforce | |
send_to_salesforce(alert_payload) | |
# Annotate image (basic text overlay for faults) | |
for fault in faults: | |
cv2.putText( | |
image, | |
f"{fault['fault_type']} ({fault['confidence']:.2f})", | |
(50, 50), | |
cv2.FONT_HERSHEY_SIMPLEX, | |
1, | |
(0, 0, 255), | |
2 | |
) | |
st.image(image, channels="BGR", caption="Processed Image") | |
# Display faults table | |
if faults: | |
st.subheader("Detected Faults") | |
df = pd.DataFrame(faults) | |
st.dataframe(df) | |
else: | |
st.write("No faults detected.") | |
# Clean up | |
os.remove(file_path) | |
os.remove("temp.jpg") |