|
import cv2 |
|
import numpy as np |
|
import torch |
|
import streamlit as st |
|
import streamlit.components.v1 as components |
|
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 Alarm π₯") |
|
st.subheader("Hold the camera towards potential fire sources to detect in real-time.") |
|
|
|
|
|
alarm_url = "https://docs.google.com/uc?export=download&id=16IzsnQDmWkfYSeb_AjOTx79NEgkOpz88" |
|
|
|
|
|
|
|
js_code = f""" |
|
<script> |
|
var alarm = new Audio("{alarm_url}"); |
|
alarm.loop = true; |
|
|
|
function playAlarm() {{ |
|
alarm.play().catch(error => {{ |
|
console.log("Autoplay failed. User interaction required."); |
|
}}); |
|
}} |
|
|
|
function stopAlarm() {{ |
|
alarm.pause(); |
|
alarm.currentTime = 0; |
|
}} |
|
</script> |
|
""" |
|
|
|
|
|
components.html(js_code, height=0) |
|
|
|
|
|
image = camera_input_live() |
|
|
|
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: |
|
if len(result.boxes) > 0: |
|
fire_present = True |
|
break |
|
|
|
|
|
if fire_present: |
|
st.error("π₯ Fire Detected! π₯") |
|
components.html("<script>playAlarm();</script>", height=0) |
|
else: |
|
st.success("β
No Fire Detected") |
|
components.html("<script>stopAlarm();</script>", height=0) |
|
|