|
|
|
import cv2 |
|
import numpy as np |
|
import torch |
|
import streamlit as st |
|
import os |
|
from ultralytics import YOLO |
|
from camera_input_live import camera_input_live |
|
|
|
|
|
model_path = "last.pt" |
|
device = "cuda" if torch.cuda.is_available() else "cpu" |
|
model = YOLO(model_path) |
|
model.to(device) |
|
|
|
|
|
st.title("Live Fire Detection with Camera") |
|
st.subheader("Hold the camera towards potential fire sources to detect in real-time.") |
|
|
|
|
|
image = camera_input_live() |
|
fire_detected = False |
|
|
|
|
|
alarm_html = """ |
|
<audio id="fireAlarm" src="alarm.mp3"></audio> |
|
<script> |
|
function playAlarm() { |
|
var alarm = document.getElementById("fireAlarm"); |
|
if (alarm.paused) { |
|
alarm.play(); |
|
} |
|
} |
|
function stopAlarm() { |
|
var alarm = document.getElementById("fireAlarm"); |
|
alarm.pause(); |
|
alarm.currentTime = 0; |
|
} |
|
</script> |
|
""" |
|
|
|
if image is not None: |
|
|
|
bytes_data = image.getvalue() |
|
cv2_img = cv2.imdecode(np.frombuffer(bytes_data, np.uint8), cv2.IMREAD_COLOR) |
|
|
|
|
|
results = model(cv2_img) |
|
|
|
fire_present = False |
|
|
|
|
|
for result in results: |
|
boxes = result.boxes |
|
for box in boxes: |
|
b = box.xyxy[0].cpu().numpy().astype(int) |
|
label = f'Fire {box.conf[0]:.2f}' |
|
cv2.rectangle(cv2_img, (b[0], b[1]), (b[2], b[3]), (0, 0, 255), 3) |
|
cv2.putText(cv2_img, label, (b[0], b[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2) |
|
fire_present = True |
|
|
|
|
|
st.image(cv2_img, channels="BGR", caption="Detected Fire", use_container_width=True) |
|
|
|
|
|
if fire_present: |
|
st.error("🔥 Fire Detected! 🔥") |
|
st.markdown(alarm_html + "<script>playAlarm();</script>", unsafe_allow_html=True) |
|
fire_detected = True |
|
else: |
|
st.success("✅ No Fire Detected") |
|
if fire_detected: |
|
st.markdown(alarm_html + "<script>stopAlarm();</script>", unsafe_allow_html=True) |
|
fire_detected = False |
|
|