import streamlit as st import cv2 import numpy as np import os import tempfile from PIL import Image from ultralytics import YOLO import re # ----------- Page config ---------------- st.set_page_config( page_title='Fire Detection', page_icon='', layout='wide' ) st.title("Fire Detection") st.write('Upload an image or video to detect Fire') # -------------- load model detection ----------- @st.cache_resource def load_model(): return YOLO('best.pt') model = load_model() # switching tabs x, y = st.tabs(['Image Detection', 'Video Detection']) # ================================================== # Image Detection # ================================================== with x: st.header('Image Detection') img_path = st.file_uploader('Please upload an image') if img_path is not None: image = Image.open(img_path) image_np = np.array(image) # YOLO inference result = model(image_np, conf=0.4) annot_img = result[0].plot() # Convert BGR to RGB annot_img = cv2.cvtColor(annot_img, cv2.COLOR_BGR2RGB) annot_img = cv2.cvtColor(annot_img, cv2.COLOR_BGR2RGB) # Display side by side ori_img, pre_img = st.columns(2) with ori_img: st.markdown('#### ***Original Image***') st.image(image, width=400) with pre_img: st.markdown('#### ***Detected Image***') st.image(annot_img, width=400) # ================================================== # Video Detection # ================================================== with y: st.header("Video Fire Detection") video_file = st.file_uploader( "Upload a Video", type=["mp4", "avi", "mov"] ) if video_file is not None: temp_video = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") temp_video.write(video_file.read()) temp_video.close() cap = cv2.VideoCapture(temp_video.name) col1, col2 = st.columns(2) with col1: st.markdown("#### **Original Video**") orig_frame = st.empty() with col2: st.markdown("#### **Detected Video**") pred_frame = st.empty() while cap.isOpened(): ret, frame = cap.read() if not ret: break results = model(frame, conf=0.4) annotated_frame = results[0].plot() orig_frame.image(frame, channels="BGR", width=400) pred_frame.image(annotated_frame, channels="BGR", width=400) cap.release() os.remove(temp_video.name) st.success("Video processing completed") # ---------------- Sample Test Images & Videos ---------------- st.markdown("---") st.subheader("Try with Sample Images / Videos") st.write("Don't have files? Use the samples below to test the model.") SAMPLE_IMAGES = { "Fire Image 1": "pcb1.jpg", "Fire Image 2": "pcb4.jpg", "Fire Image 3": "pcb5.jpg" } SAMPLE_VIDEOS = { "Fire Video 1": "v1.mp4", "Fire Video 2": "v2.mp4", "Fire Video 3": "v3.mp4", "Fire Video 4": "v4.mp4" } col1, col2 = st.columns(2) # -------- Sample Images -------- with col1: st.markdown("### Sample Images") selected_img = st.selectbox( "Choose a sample image", ["None"] + list(SAMPLE_IMAGES.keys()) ) if selected_img != "None": img_path = SAMPLE_IMAGES[selected_img] image = Image.open(img_path) st.image(image, caption=selected_img, use_container_width=True) if st.button("Detect Fire in Image"): results = model(image) annotated_img = results[0].plot() st.image(annotated_img, caption="Detection Result", use_container_width=True) # -------- Sample Videos -------- with col2: st.markdown("### 🎥 Sample Videos") selected_vid = st.selectbox( "Choose a sample video", ["None"] + list(SAMPLE_VIDEOS.keys()) ) if selected_vid != "None": video_path = SAMPLE_VIDEOS[selected_vid] st.video(video_path) if st.button("Detect Fire in Video"): cap = cv2.VideoCapture(video_path) stframe = st.empty() while cap.isOpened(): ret, frame = cap.read() if not ret: break results = model(frame) annotated_frame = results[0].plot() stframe.image(annotated_frame, channels="BGR", use_container_width=True) cap.release() # ---------------- Footer ---------------- st.markdown("""
Designed & Developed by Yedeedya Injeti
Under Innomatics Research Labs

""", unsafe_allow_html=True)