| import streamlit as st |
| import requests |
| import base64 |
| from PIL import Image |
| import io |
|
|
| API_URL = "http://localhost:8000/predict" |
|
|
| st.set_page_config(page_title="SentinelScan", layout="centered") |
| st.title("🛰️ SentinelScan (Crack Detector v1)") |
|
|
| uploaded = st.file_uploader("Upload an inspection image", type=["jpg","jpeg","png"]) |
|
|
| if uploaded: |
| st.subheader("Input") |
| st.image(uploaded, use_container_width=True) |
|
|
| if st.button("Analyze"): |
| files = {"file": (uploaded.name, uploaded.getvalue(), uploaded.type)} |
| with st.spinner("Running model..."): |
| r = requests.post(API_URL, files=files, timeout=60) |
|
|
| if r.status_code != 200: |
| st.error(r.text) |
| else: |
| out = r.json() |
| if "error" in out: |
| st.error(out["error"]) |
| else: |
| st.subheader("Result") |
| st.write({ |
| "crack_detected": out["crack_detected"], |
| "severity": out["severity"], |
| "confidence": out["confidence"], |
| "metrics": out["metrics"], |
| }) |
|
|
| overlay_bytes = base64.b64decode(out["overlay_png_base64"]) |
| overlay_img = Image.open(io.BytesIO(overlay_bytes)) |
| st.image(overlay_img, caption="Crack overlay", use_container_width=True) |