Spaces:
Sleeping
Sleeping
import streamlit as st | |
import cv2 | |
import supervision as sv | |
from ultralytics import YOLO | |
import numpy as np | |
from PIL import Image | |
import io | |
import torch | |
# Set page config | |
st.set_page_config(page_title="Building Detection App", page_icon="π’", layout="wide") | |
# Custom CSS with theme compatibility | |
st.markdown(""" | |
<style> | |
.reportview-container { | |
background: var(--background-color); | |
} | |
.main { | |
background-color: var(--background-color); | |
padding: 2rem; | |
border-radius: 10px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
} | |
.stButton>button { | |
background-color: #4CAF50; | |
color: white; | |
font-weight: bold; | |
border: none; | |
border-radius: 5px; | |
padding: 0.5rem 1rem; | |
transition: all 0.3s; | |
} | |
.stButton>button:hover { | |
background-color: #45a049; | |
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); | |
} | |
.upload-box { | |
border: 2px dashed #4CAF50; | |
border-radius: 10px; | |
padding: 2rem; | |
text-align: center; | |
} | |
.theme-text { | |
color: var(--text-color); | |
} | |
</style> | |
""", unsafe_allow_html=True) | |
# Load the YOLO model | |
def load_model(): | |
model = YOLO("mosaic_medium_100_tiny_object.pt") # Update this to the filename of your model | |
model.to('cpu') # Ensure the model is on CPU | |
return model | |
model = load_model() | |
def process_image(image): | |
# Convert PIL Image to numpy array | |
image_np = np.array(image) | |
# Convert RGB to BGR (OpenCV uses BGR) | |
image_cv2 = cv2.cvtColor(image_np, cv2.COLOR_RGB2BGR) | |
def callback(image_slice: np.ndarray) -> sv.Detections: | |
result = model(image_slice)[0] | |
return sv.Detections.from_ultralytics(result) | |
slicer = sv.InferenceSlicer(callback=callback, slice_wh=(256, 256), iou_threshold=0.8) | |
detections = slicer(image_cv2) | |
# Filter detections for building class (assuming class_id 2 is for buildings) | |
building_detections = detections[detections.class_id == 2] | |
label_annotator = sv.LabelAnnotator() | |
box_annotator = sv.BoxAnnotator() | |
annotated_image = box_annotator.annotate(scene=image_cv2.copy(), detections=building_detections) | |
annotated_image = label_annotator.annotate(scene=annotated_image, detections=building_detections) | |
# Convert BGR back to RGB for displaying in Streamlit | |
return cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB) | |
def main(): | |
st.title("Building Detection App") | |
st.markdown('<p class="theme-text">Upload an image to detect buildings using our advanced AI model.</p>', unsafe_allow_html=True) | |
col1, col2 = st.columns(2) | |
with col1: | |
st.markdown('<h3 class="theme-text">Upload Image</h3>', unsafe_allow_html=True) | |
uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"]) | |
if uploaded_file is not None: | |
image = Image.open(uploaded_file) | |
st.image(image, caption="Uploaded Image", use_column_width=True) | |
if st.button("Detect Buildings"): | |
with st.spinner("Processing..."): | |
result_image = process_image(image) | |
with col2: | |
st.markdown('<h3 class="theme-text">Detection Results</h3>', unsafe_allow_html=True) | |
st.image(result_image, caption="Processed Image", use_column_width=True) | |
st.success("Detection completed successfully!") | |
else: | |
st.markdown( | |
""" | |
<div class="upload-box theme-text"> | |
<h3>π Upload an image to get started</h3> | |
<p>Supported formats: JPG, JPEG, PNG</p> | |
</div> | |
""", | |
unsafe_allow_html=True | |
) | |
with col2: | |
if uploaded_file is None: | |
st.markdown('<h3 class="theme-text">How it works</h3>', unsafe_allow_html=True) | |
st.markdown( | |
""" | |
<p class="theme-text"> | |
1. <strong>Upload</strong> an image using the file uploader on the left.<br> | |
2. Click the <strong>Detect Buildings</strong> button to process the image.<br> | |
3. View the results with bounding boxes around detected buildings.<br><br> | |
Our AI model is trained to identify various types of buildings in different environments. | |
</p> | |
""", | |
unsafe_allow_html=True | |
) | |
st.markdown("---") | |
#st.markdown('<p class="theme-text"></p>', unsafe_allow_html=True) | |
if __name__ == "__main__": | |
main() |