File size: 3,042 Bytes
94aaf34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
76
77
78
79
80
81
import streamlit as st
import torch
import cv2
import numpy as np
from PIL import Image
import tempfile
import os
from ultralytics import YOLO

# Load the YOLOv8 model from the local path
model = YOLO('best.pt')  # Directly reference the best.pt file in the same directory as app.py

def detect_people(image):
    results = model(image)
    return results

def process_results(results, image):
    annotated_frame = image.copy()
    person_detected = False
    
    for result in results:
        boxes = result.boxes.xyxy.cpu().numpy().astype(int)  # Bounding boxes
        if len(boxes) > 0:
            person_detected = True
        for box in boxes:
            cv2.rectangle(annotated_frame, (box[0], box[1]), (box[2], box[3]), (0, 255, 0), 2)
    
    if person_detected:
        cv2.putText(annotated_frame, 'Canh bao! Co nguoi! Co nguoi', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA)
    
    return annotated_frame

def main():
    st.title("People Detection Application using YOLOv8")

    option = st.sidebar.selectbox("Choose input type", ("Upload Image/Video", "Use Camera"))

    if option == "Upload Image/Video":
        uploaded_file = st.file_uploader("Upload Image or Video", type=['jpg', 'jpeg', 'png', 'mp4', 'avi', 'mov'])
        if uploaded_file is not None:
            if uploaded_file.type.startswith('image'):
                file_bytes = np.asarray(bytearray(uploaded_file.read()), dtype=np.uint8)
                image = cv2.imdecode(file_bytes, 1)
                st.image(image, caption='Uploaded Image.', use_column_width=True)
                results = detect_people(image)
                processed_frame = process_results(results, image)
                st.image(processed_frame, caption='Processed Image.', use_column_width=True)
                    
            elif uploaded_file.type.startswith('video'):
                tfile = tempfile.NamedTemporaryFile(delete=False, suffix='.mp4')
                tfile.write(uploaded_file.read())
                tfile.close()
                st.write(f'Temporary file path: {tfile.name}')
                vidcap = cv2.VideoCapture(tfile.name)
                stframe = st.empty()
                
                while vidcap.isOpened():
                    success, frame = vidcap.read()
                    if not success:
                        break
                    results = detect_people(frame)
                    processed_frame = process_results(results, frame)
                    stframe.image(processed_frame, channels="BGR")
                vidcap.release()
                os.remove(tfile.name)

    elif option == "Use Camera":
        stframe = st.empty()
        cap = cv2.VideoCapture(0)
        while True:
            ret, frame = cap.read()
            if not ret:
                break
            results = detect_people(frame)
            processed_frame = process_results(results, frame)
            stframe.image(processed_frame, channels="BGR")
        cap.release()

if __name__ == '__main__':
    main()