File size: 2,324 Bytes
452a698
9d95b96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

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

# Load YOLO fire detection model
model_path = "last.pt"
device = "cuda" if torch.cuda.is_available() else "cpu"
model = YOLO(model_path)
model.to(device)

# Streamlit app title
st.title("Live Fire Detection with Camera")
st.subheader("Hold the camera towards potential fire sources to detect in real-time.")

# Capture live camera input
image = camera_input_live()
fire_detected = False  # Track fire detection state

# HTML & JS for Alarm Sound
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:
    # Convert the image to OpenCV format
    bytes_data = image.getvalue()
    cv2_img = cv2.imdecode(np.frombuffer(bytes_data, np.uint8), cv2.IMREAD_COLOR)

    # Perform fire detection
    results = model(cv2_img)

    fire_present = False  # Temporary flag for fire detection in this frame
    
    # Draw bounding boxes for detected fires
    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  # Fire detected

    # Display the annotated image
    st.image(cv2_img, channels="BGR", caption="Detected Fire", use_container_width=True)
    
    # Display logs and trigger alarm
    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