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 st.markdown(""" """, unsafe_allow_html=True) # Load the YOLO model @st.cache_resource 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("Upload an image to detect buildings using our advanced AI model.") col1, col2 = st.columns(2) with col1: st.markdown("### Upload Image") 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("### Detection Results") st.image(result_image, caption="Processed Image", use_column_width=True) st.success("Detection completed successfully!") else: st.markdown( """

📁 Upload an image to get started

Supported formats: JPG, JPEG, PNG

""", unsafe_allow_html=True ) with col2: if uploaded_file is None: st.markdown("### How it works") st.markdown( """ 1. **Upload** an image using the file uploader on the left. 2. Click the **Detect Buildings** button to process the image. 3. View the results with bounding boxes around detected buildings. Our AI model is trained to identify various types of buildings from satellite images. """ ) st.markdown("---") st.markdown("Developed with ❤️ using Streamlit and YOLOv8") if __name__ == "__main__": main()